{"id":15546717,"url":"https://github.com/dazuimao1990/bedrocky","last_synced_at":"2026-02-28T12:02:10.686Z","repository":{"id":173825312,"uuid":"559973072","full_name":"dazuimao1990/bedrocky","owner":"dazuimao1990","description":"Bedrocky - Ansible like automated deployment  tool. Implemented by parallel ssh (Pssh) and written in golang.Enjoy it ~~","archived":false,"fork":false,"pushed_at":"2023-01-04T12:32:13.000Z","size":4868,"stargazers_count":3,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-20T08:11:24.210Z","etag":null,"topics":["ansible","automation","golang","pssh"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dazuimao1990.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-10-31T13:39:39.000Z","updated_at":"2023-01-05T02:53:25.000Z","dependencies_parsed_at":null,"dependency_job_id":"9fd25716-b7b8-40ac-9ab7-5f3903e3cfc3","html_url":"https://github.com/dazuimao1990/bedrocky","commit_stats":null,"previous_names":["dazuimao1990/bedrocky"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/dazuimao1990/bedrocky","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dazuimao1990%2Fbedrocky","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dazuimao1990%2Fbedrocky/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dazuimao1990%2Fbedrocky/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dazuimao1990%2Fbedrocky/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dazuimao1990","download_url":"https://codeload.github.com/dazuimao1990/bedrocky/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dazuimao1990%2Fbedrocky/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29933021,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-28T09:58:13.507Z","status":"ssl_error","status_checked_at":"2026-02-28T09:57:57.047Z","response_time":90,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ansible","automation","golang","pssh"],"created_at":"2024-10-02T13:03:49.047Z","updated_at":"2026-02-28T12:02:10.669Z","avatar_url":"https://github.com/dazuimao1990.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Bedrocky\n\n\u003c!-- 向 SRE 角色转化的练手开发项目。 --\u003e\n\n基岩(bedrock)是陆地表层中的坚硬岩层。一般多被土层覆盖，埋藏深度不一，少则数米到数十米，多则数百米。由沉积岩、变质岩、岩浆岩中的一种或数种岩类组成，可作大型建筑工程的地基。\n\n为了项目名字的唯一性，基于 bedrock 造了一个词。这个项目旨在创建一种类似 ansible 的机制，能够让交付人员方便的在 Linux 环境中快速部署一些基础设施类软件。工作过程中尽量减少对环境的依赖，专注于离线场景的应用。\n\n# 主要特性\n\nbedrocky:\n- [x] 从 Yaml 配置文件中读取目标主机集群，包括IP、端口、密码/密钥、角色。\n- [x] 从 Yaml 配置文件中读取 Role 细节，根据模块的不同，批量执行任务。\n- [x] 引入 shell 模块作为最基础的能力，面向多个主机批量执行 shell 命令。\n\u003c!-- - [ ] 仿照 ansible-playbook 设计 job 模块，执行 containerd docker k8s/k3s etcd nfs 等基础服务的批量安装\n\t- 解决各服务的优化配置：\n\t\t- etcd：加自动压缩\n\t\t- containerd docker 引用国内源，日志自动压缩，支持导入预置镜像\n\t\t- k8s 证书100年，可扩展指令参数\n\t\t- k3s 支持导入预置镜像 --\u003e\n\u003c!-- - [ ] 引入 k8s 模块\n\t- staticpod 子模块，规划批量启动静态pod\n\t- daemonset 子模块，规划批量启动守护进程 --\u003e\n\n# 设计思路\n\n## 核心抽象\n\n1. TaskChan: 定义一个任务队列，利用 golang 语言的并行优势，通过 ssh 协议批量对远端主机进行操作。数据类型 `chan TaskSpec`\n2. TaskSpec: 定义一次任务中涉及到的所有远程主机（host）信息，以及针对每个主机即将执行的任务集（role），结构体字段包括 ip port username password/publickey role。数据类型 `struct`\n3. role: 定义一个角色（role），包括角色的名字（如 `installdocker`），和角色所承担的工作列表（steps）。\n4. step: 工作列表中的每一个步骤，根据 `module` 的不同，处理的方式也不一样。\n5. module: 一个接口，任何实现了该接口的动作都可以在 `step` 中集成进来。\n\n## 实现的顺序\n\n- [x] 基于 cobra、viper 框架构建命令行基础，实现基本的命令行参数传递与调用\n- [x] 实现最基础的能力，通过 ssh 操作远端主机\n- [x] 实现基于 yaml 类型配置文件解析来输出配置\n- [x] 定义 moudle 的基础规范，并将 shell 实现\n- [x] 将多个 shell step 操作合并成为一个 role ，实现顺序执行\n- [x] 实现 taskchan 队列，利用 goroutine 实现并发多个 host 的任务执行\n- [ ] 开始扩充 moudle 的不同实现类型，如 copy 、systemd \n\n## 编译\n\n拉取代码编译即可：\n\n```bash\ngit clone https://github.com/dazuimao1990/bedrocky.git\ncd bedrocky\ngo build -o bedrocky *.go\n```\n## 示例\n\n代码中提供了样例配置文件 `bedrocky.yaml`\n\n使用以下命令来运行：\n\n```bash\n./bedrocky play -f bedrocky.yaml\n```\n\n输出类似：\n```\n2023/01/04 18:19:50 [SUCCESS] 主机 127.0.0.1 任务 hostname 执行完成. 执行结果: MacBook-Pro-FrozenFire.local\n2023/01/04 18:19:50 [SUCCESS] 主机 192.168.2.59 任务 hostname 执行完成. 执行结果: MacBook-Pro-FrozenFire.local\n2023/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\n2023/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\n2023/01/04 18:19:50 [SUCCESS] 主机 127.0.0.1 任务 arch 执行完成. 执行结果: arm64\n2023/01/04 18:19:50 [SUCCESS] 主机 192.168.2.59 任务 arch 执行完成. 执行结果: arm64\n```\n\n命令也接纳命令行参数输入，方便基于一条命令面向某个远程主机批量执行命令：\n\n```bash\n./bedrocky run --host=127.0.0.1 -P someword -u root -c \"hostname,arch\" -c \"uname -r\"\n```\n\n输出类似：\n```\n2023/01/04 18:23:18 [SUCCESS] 主机 127.0.0.1 任务 hostname 执行完成. 执行结果: MacBook-Pro-FrozenFire.local\n2023/01/04 18:23:18 [SUCCESS] 主机 127.0.0.1 任务 arch 执行完成. 执行结果: arm64\n2023/01/04 18:23:18 [SUCCESS] 主机 127.0.0.1 任务 uname -r 执行完成. 执行结果: 21.3.0\n```\n\n## bedrocky.yaml 格式\n\n### hosts \n\n主机列表中包含了一组远程主机信息，主要包括 ssh 连接所需信息，以及即将执行的任务角色，单个主机的全量信息包括：\n\n```yaml\n- host: 127.0.0.1\n  username: root\n  port: 33\n  password: yyyyyyyy\n  publickey: ~/.ssh/other.pub\n  role:\n  - checksystem\n```\n\n其中 `host` `role` 字段不可省略。\n\n### port\n\n全局定义的 ssh 端口号。\n\n### username\n\n全局定义的 ssh 用户名。\n\n### password\n\n全局定义的 ssh 密码。\n\n### publickey\n\n全局定义的 ssh 公钥。\n\n### rolename\n\n此处定义了一个 role 的详情，shell 示例：\n\n```yaml\nchecksystem:\n  - name: prepare\n    module: shell\n    spec:\n      - hostname\n      - uname -v\n  - name: checkarch\n    module: shell\n    spec:\n      - arch \n```\n\n## 主机信息优先级\n\nbedrocky 中提供三种方式定义连接一个远程主机所需要的用户名、密码/密钥、端口信息：\n\n- 命令行参数：bedrocky 将命令行参数的规定置为最高优先级。\n- bedrocky.yaml 中在 `hosts` 列表中为每个主机定义的用户名、密码/密钥、端口为第二优先级。\n- bedrocky.yaml 中全局定义的用户名、密码/密钥、端口为最低优先级\n\n当你无法确定时，使用以下命令，来了解并行任务中如何连接远程主机：\n\n```bash\n./bedrocky hosts show -f bedrocky.yaml --password 123asd --port 34\nUsing config file: bedrocky.yaml\n序号    主机            端口      用户    密码                    公钥\n1       127.0.0.1       34      root    MTIzYXNk                ~/.ssh/id_rsa.pub\n2       192.168.0.1     34      root    MTIzYXNk                ~/.ssh/id_rsa.pub\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdazuimao1990%2Fbedrocky","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdazuimao1990%2Fbedrocky","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdazuimao1990%2Fbedrocky/lists"}