关于 ansible
Ansible 是用于配置基础设施、部署应用和编排任务的开源自动化工具,通过无需在目标机安装 Agent 的 YAML playbook 执行。它适合 DevOps 团队管理跨主机的重复任务,支持 SSH 或 WinRM,并提供幂等操作。
主要功能
- 01通过 SSH 或 WinRM 无 Agent 执行
- 02幂等 YAML playbook
- 03可复用模块与角色
- 04变量和 Jinja2 模板
- 05跨主机按序执行任务
适用场景
- 01配置和管理多台服务器
- 02通过可重复的 playbook 部署应用
- 03在 CI/CD 中运行基础设施任务
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ alphaonedev/ openclaw-graph --skill ansible安装后在 Claude Code 中输入/ansible确认已加载。
详细介绍
ansible
用途
Ansible 是一款开源自动化工具,可使用无 Agent 的 YAML playbook 配置 IT 基础设施、部署应用并编排任务。它确保操作具有幂等性,也就是说,无论初始状态如何,每次运行都会产生相同的结果;它通过 SSH 运行,无需在目标主机上安装 Agent。
适用场景
在 DevOps 流水线中执行可重复的基础设施任务时,可使用 Ansible,例如配置服务器、管理整个服务器群的配置,或在动态环境中部署应用。当你需要无 Agent 自动化时,例如更新远程机器上的软件、编排多步骤工作流,或与 CI/CD 工具集成时,可使用 Ansible;但对于实时监控,应避免使用它,因为 Prometheus 等工具更适合此类场景。
主要功能
- 无 Agent 执行:通过 SSH 或 WinRM 连接;在清单文件(例如 /etc/ansible/hosts)中指定主机,并使用 [web:children] 等格式进行分组。
- 幂等 Playbook:编写定义任务的 YAML 文件;例如,仅在软件包尚未安装时才安装它的任务。
- 模块和角色:使用
apt等内置模块管理软件包;将代码整理为角色以便复用,并存储在 roles/webserver/tasks/main.yml 等目录中。 - 变量和模板:在 YAML 中定义变量(例如 { "http_port": 80 }),并使用 Jinja2 模板生成动态配置,例如从模板生成 nginx.conf。
- 编排:通过按顺序在多个主机上执行任务的 play 处理依赖关系,确保按顺序执行。
使用模式
要自动执行任务,请创建一个 playbook(例如 site.yml),定义其中的 play,包括主机、任务和变量。使用 ansible-playbook 命令运行它。对于动态清单,可使用输出 JSON 的脚本,例如从 AWS EC2 获取数据。项目结构可包含清单文件、用于定义主机特定变量的 group_vars,以及用于模块化代码的角色。请始终先使用 --check 标志测试 playbook,以模拟更改而不实际应用。
常用命令/API
- 运行 Playbook:使用
ansible-playbook site.yml --check --diff模拟并显示更改;添加-l web可将范围限制为某个主机组。 - 临时命令:使用
ansible web -m ping测试连接;使用-a "uptime"执行任意命令。 - 管理角色:使用
ansible-galaxy install geerlingguy.apache获取角色;使用ansible-galaxy init role_name创建自定义角色。 - 清单和变量:使用
-e "var1=value1"设置变量,或使用export ANSIBLE_HOST_KEY_CHECKING=False等环境变量绕过主机密钥验证。 - API 集成:通过
ansible_runner库使用 Ansible 的 Python API;例如,导入 ansible_runner 并运行interface.run(playbook='site.yml', extravars={'key': 'value'})以通过编程方式执行。 进行身份验证时,可使用$ANSIBLE_PRIVATE_KEY_FILE=/path/to/key.pem等环境变量指定 SSH 密钥,或使用$ANSIBLE_BECOME_PASS指定 sudo 密码。
集成说明
可通过脚本触发 playbook,将 Ansible 与 Jenkins 等 CI/CD 工具集成;例如,在 Jenkinsfile 中使用:sh 'ansible-playbook deploy.yml -e "env=prod"'。对于云服务提供商,可使用动态清单;例如,通过 export AWS_ACCESS_KEY_ID=$AWS_KEY 配置 AWS,然后运行 ansible-playbook -i ec2.py site.yml。还可在 Terraform 完成资源配置后运行 Ansible;确保通过文件或环境变量传递变量。请使用版本控制:将 playbook 存储在 Git 中,并在流水线中拉取。
错误处理
在 playbook 中,使用包含 rescue 和 always 子句的 block;例如:
- block:
- debug: msg="Task succeeded"
rescue:
- debug: msg="Error occurred"
always:
- debug: msg="Cleanup step"
检查命令的退出码;例如,在脚本中使用:ansible-playbook site.yml && echo "Success" || echo "Failed"。对于常见问题,可使用 -vvv 启用详细输出,以调试 SSH 连接或模块故障。使用事实收集处理变量错误,并为非关键任务设置 ignore_errors: yes,但仅在适当时使用,以免掩盖问题。
具体使用示例
-
在 Ubuntu 主机上部署 Web 服务器:创建一个包含 Apache 安装任务的 playbook(webserver.yml):
- hosts: webservers tasks: - name: Install Apache apt: name: apache2 state: present使用以下命令运行:
ansible-playbook webserver.yml -i inventory.txt --become,以提升权限。 -
为多台主机配置 NTP:编写一个用于同步时间的 playbook(ntp_config.yml):
- hosts: all tasks: - name: Install NTP yum: name: ntp state: latest - name: Start NTP service service: name: ntpd state: started执行:
ansible-playbook ntp_config.yml -l ntp_hosts,以针对特定组。
图关系
- 相关工具:terraform(用于基础设施即代码)、kubernetes(用于容器编排)、jenkins(用于 CI/CD 集成),均属于 devops-sre 集群。
- 依赖项:通常与 vault 搭配使用,以管理机密。
- 冲突项:如果更倾向于基于 Agent 的管理,请避免使用 Puppet 等工具。