关于 ansible-playbook
用于编写、组织和排查 Ansible Playbook、角色与清单的参考技能,强调幂等的期望状态配置,并提供模块模式、变量优先级、错误处理和验证命令。
主要功能
- 01Playbook 与角色结构指南
- 02清单和变量优先级参考
- 03全限定模块名用法
- 04处理器与错误处理示例
- 05语法、试运行和清单检查
适用场景
- 01创建可复用的 Ansible 角色
- 02排查 YAML 或模块参数问题
- 03将 Shell 任务改写为 Ansible Playbook
- 04验证清单和 Playbook 变更
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ realsigridjin/ hello-ansible-skills --skill ansible-playbook安装后在 Claude Code 中输入/ansible-playbook确认已加载。
详细介绍
Ansible Playbook 开发
概述
Ansible playbook 声明期望的系统状态,而不是命令式命令。核心原则是幂等性:多次运行同一个 playbook 会产生相同结果,不会造成意外更改。
适用场景
- 创建新的 playbook 或角色
- 编写清单文件
- 调试 YAML 语法错误
- 排查模块参数问题
- 了解变量优先级
- 将 Shell 脚本转换为 Ansible
快速参考
项目结构
project/
├── ansible.cfg # Configuration
├── inventory # Host definitions
├── group_vars/ # Group variables
├── host_vars/ # Host-specific vars
├── roles/ # Reusable roles
└── playbooks/ # Playbook files
必要的 ansible.cfg
[defaults]
inventory = ./inventory
roles_path = ./roles
host_key_checking = False
stdout_callback = yaml
[privilege_escalation]
become = True
become_method = sudo
模块模式
| 操作 | 模块 | 关键参数 |
|---|---|---|
| 创建目录 | ansible.builtin.file | state: directory、mode、owner |
| 复制文件 | ansible.builtin.copy | src、dest、mode |
| 模板 | ansible.builtin.template | src、dest、.j2 中的变量 |
| 安装软件包 | ansible.builtin.package | name、state: present |
| 管理服务 | ansible.builtin.service | name、state、enabled |
| 运行命令 | ansible.builtin.command | cmd、注册结果、设置 changed_when |
变量优先级(从低到高)
- 角色默认值(
defaults/main.yml) - 清单 group_vars
- 清单 host_vars
- Playbook 变量
- 角色变量(
vars/main.yml) - 任务变量
- 额外变量(
-e)
处理程序
tasks:
- name: Update config
ansible.builtin.template:
src: app.conf.j2
dest: /etc/app.conf
notify: Restart app
handlers:
- name: Restart app
ansible.builtin.service:
name: app
state: restarted
错误处理
- block:
- name: Risky operation
ansible.builtin.command: /opt/app/upgrade.sh
rescue:
- name: Handle failure
ansible.builtin.debug:
msg: "Upgrade failed, rolling back"
always:
- name: Cleanup
ansible.builtin.file:
path: /tmp/upgrade.lock
state: absent
常见错误
| 错误 | 修复方法 |
|---|---|
| 使用简短模块名称 | 始终使用 FQCN:ansible.builtin.copy,而不是 copy |
| 硬编码值 | 将其提取为 defaults/main.yml 中的变量 |
命令缺少 changed_when | 添加 changed_when: "'created' in result.stdout" |
| 忘记刷新处理程序 | 在需要时使用 meta: flush_handlers,并确保在依赖任务之前执行 |
| YAML 缩进错误 | 使用 2 个空格,切勿使用制表符 |
| 未加引号的字符串中包含冒号 | 为包含 : 的值加上引号 |
验证命令
ansible-playbook --syntax-check playbook.yml # Check YAML
ansible-playbook --check playbook.yml # Dry run
ansible-playbook --check --diff playbook.yml # Show file changes
ansible-inventory --list # Verify inventory
ansible-inventory --host hostname # Check host vars
评论
支持 Markdown