基岩(bedrock)是陆地表层中的坚硬岩层。一般多被土层覆盖,埋藏深度不一,少则数米到数十米,多则数百米。由沉积岩、变质岩、岩浆岩中的一种或数种岩类组成,可作大型建筑工程的地基。
为了项目名字的唯一性,基于 bedrock 造了一个词。这个项目旨在创建一种类似 ansible 的机制,能够让交付人员方便的在 Linux 环境中快速部署一些基础设施类软件。工作过程中尽量减少对环境的依赖,专注于离线场景的应用。
bedrocky:
- 从 Yaml 配置文件中读取目标主机集群,包括IP、端口、密码/密钥、角色。
- 从 Yaml 配置文件中读取 Role 细节,根据模块的不同,批量执行任务。
- 引入 shell 模块作为最基础的能力,面向多个主机批量执行 shell 命令。
- TaskChan: 定义一个任务队列,利用 golang 语言的并行优势,通过 ssh 协议批量对远端主机进行操作。数据类型
chan TaskSpec
- TaskSpec: 定义一次任务中涉及到的所有远程主机(host)信息,以及针对每个主机即将执行的任务集(role),结构体字段包括 ip port username password/publickey role。数据类型
struct
- role: 定义一个角色(role),包括角色的名字(如
installdocker
),和角色所承担的工作列表(steps)。 - step: 工作列表中的每一个步骤,根据
module
的不同,处理的方式也不一样。 - module: 一个接口,任何实现了该接口的动作都可以在
step
中集成进来。
- 基于 cobra、viper 框架构建命令行基础,实现基本的命令行参数传递与调用
- 实现最基础的能力,通过 ssh 操作远端主机
- 实现基于 yaml 类型配置文件解析来输出配置
- 定义 moudle 的基础规范,并将 shell 实现
- 将多个 shell step 操作合并成为一个 role ,实现顺序执行
- 实现 taskchan 队列,利用 goroutine 实现并发多个 host 的任务执行
- 开始扩充 moudle 的不同实现类型,如 copy 、systemd
拉取代码编译即可:
git clone https://github.com/dazuimao1990/bedrocky.git
cd bedrocky
go build -o bedrocky *.go
代码中提供了样例配置文件 bedrocky.yaml
使用以下命令来运行:
./bedrocky play -f bedrocky.yaml
输出类似:
2023/01/04 18:19:50 [SUCCESS] 主机 127.0.0.1 任务 hostname 执行完成. 执行结果: MacBook-Pro-FrozenFire.local
2023/01/04 18:19:50 [SUCCESS] 主机 192.168.2.59 任务 hostname 执行完成. 执行结果: MacBook-Pro-FrozenFire.local
2023/01/04 18:19:50 [SUCCESS] 主机 127.0.0.1 任务 uname -v 执行完成. 执行结果: Darwin Kernel Version 21.3.0: Wed Jan 5 21:37:58 PST 2022; root:xnu-8019.80.24~20/RELEASE_ARM64_T8101
2023/01/04 18:19:50 [SUCCESS] 主机 192.168.2.59 任务 uname -v 执行完成. 执行结果: Darwin Kernel Version 21.3.0: Wed Jan 5 21:37:58 PST 2022; root:xnu-8019.80.24~20/RELEASE_ARM64_T8101
2023/01/04 18:19:50 [SUCCESS] 主机 127.0.0.1 任务 arch 执行完成. 执行结果: arm64
2023/01/04 18:19:50 [SUCCESS] 主机 192.168.2.59 任务 arch 执行完成. 执行结果: arm64
命令也接纳命令行参数输入,方便基于一条命令面向某个远程主机批量执行命令:
./bedrocky run --host=127.0.0.1 -P someword -u root -c "hostname,arch" -c "uname -r"
输出类似:
2023/01/04 18:23:18 [SUCCESS] 主机 127.0.0.1 任务 hostname 执行完成. 执行结果: MacBook-Pro-FrozenFire.local
2023/01/04 18:23:18 [SUCCESS] 主机 127.0.0.1 任务 arch 执行完成. 执行结果: arm64
2023/01/04 18:23:18 [SUCCESS] 主机 127.0.0.1 任务 uname -r 执行完成. 执行结果: 21.3.0
主机列表中包含了一组远程主机信息,主要包括 ssh 连接所需信息,以及即将执行的任务角色,单个主机的全量信息包括:
- host: 127.0.0.1
username: root
port: 33
password: yyyyyyyy
publickey: ~/.ssh/other.pub
role:
- checksystem
其中 host
role
字段不可省略。
全局定义的 ssh 端口号。
全局定义的 ssh 用户名。
全局定义的 ssh 密码。
全局定义的 ssh 公钥。
此处定义了一个 role 的详情,shell 示例:
checksystem:
- name: prepare
module: shell
spec:
- hostname
- uname -v
- name: checkarch
module: shell
spec:
- arch
bedrocky 中提供三种方式定义连接一个远程主机所需要的用户名、密码/密钥、端口信息:
- 命令行参数:bedrocky 将命令行参数的规定置为最高优先级。
- bedrocky.yaml 中在
hosts
列表中为每个主机定义的用户名、密码/密钥、端口为第二优先级。 - bedrocky.yaml 中全局定义的用户名、密码/密钥、端口为最低优先级
当你无法确定时,使用以下命令,来了解并行任务中如何连接远程主机:
./bedrocky hosts show -f bedrocky.yaml --password 123asd --port 34
Using config file: bedrocky.yaml
序号 主机 端口 用户 密码 公钥
1 127.0.0.1 34 root MTIzYXNk ~/.ssh/id_rsa.pub
2 192.168.0.1 34 root MTIzYXNk ~/.ssh/id_rsa.pub