Playbook: 介绍
2025-02-17
简介
Playbook 是 Ansible 的配置、部署和编排语言。它可以描述您希望远程系统执行的策略,或者是一组步骤的一般性流程。
与 ad-hoc 的区别
- Playbook 可持久化使用
- 支持更复杂的部署流程
- 可重用和共享
核心元素
- Hosts:目标主机列表
- Tasks:任务列表
- Variables:变量定义
- Templates:模板文件
- Handlers:事件触发器
- Tags:标签选择器
基本语法
YAML 规则
- 使用
.yml或.yaml扩展名 - 使用
---开始文档 - 使用空格进行缩进
- 区分大小写
- 使用
#注释
使用示例
1. 基本示例
cat > playbook01.yml << EOF
--- #固定格式
- hosts: 192.168.1.31 #定义需要执行主机
remote_user: root #远程用户
vars: #定义变量
http_port: 8088 #变量
tasks: #定义一个任务的开始
- name: create new file #定义任务的名称
file: name=/tmp/playtest.txt state=touch #调用模块,具体要做的事情
- name: create new user
user: name=test02 system=yes shell=/sbin/nologin
- name: install package
yum: name=httpd
- name: config httpd
template: src=./httpd.conf dest=/etc/httpd/conf/httpd.conf
notify: #定义执行一个动作(action)让handlers来引用执行,与handlers配合使用
- restart apache #notify要执行的动作,这里必须与handlers中的name定义内容一致
- name: copy index.html
copy: src=/var/www/html/index.html dest=/var/www/html/index.html
- name: start httpd
service: name=httpd state=started
handlers: #处理器:更加tasks中notify定义的action触发执行相应的处理动作
- name: restart apache #要与notify定义的内容相同
service: name=httpd state=restarted #触发要执行的动作
EOF测试页面准备
echo "<h1>playbook test file</h1>" >>/var/www/html/index.html配置文件准备
cat httpd.conf |grep ^Listen Listen {{ http_port }}执行playbook, 第一次执行可以加-C选项,检查写的playbook是否ok
ansible-playbook playbook01.yml验证上面playbook执行的结果
ansible 192.168.1.31 -m shell -a 'ls /tmp/playtest.txt && id test02' # 192.168.1.31 | CHANGED | rc=0 >> /tmp/playtest.txt uid=990(test02) gid=985(test02) 组=985(test02) curl 192.168.1.31:8088 # <h1>playbook test file</h1>
Playbook的运行方式
基本用法
使用 ansible-playbook 命令运行 playbook 文件:
# 基本格式
ansible-playbook playbook.yml [options]
# 检查语法
ansible-playbook playbook.yml --syntax-check
# 测试运行(不实际执行)
ansible-playbook playbook.yml --check
# 列出受影响的主机
ansible-playbook playbook.yml --list-hosts
# 列出所有可用的 tags
ansible-playbook playbook.yml --list-tags
# 列出所有任务
ansible-playbook playbook.yml --list-tasks
# 限制运行的主机
ansible-playbook playbook.yml --limit web1
# 设置并发数(默认5)
ansible-playbook playbook.yml -f 10
# 运行带有 deploy 标签的任务
ansible-playbook playbook.yml -t deploy
# 显示详细输出
ansible-playbook playbook.yml -vvv常用选项
| 选项 | 说明 | 示例 |
|---|---|---|
| --check, -C | 测试模式,不实际执行 | ansible-playbook play.yml -C |
| --list-hosts | 显示将要运行的主机列表 | ansible-playbook play.yml --list-hosts |
| --list-tags | 列出所有可用的 tags | ansible-playbook play.yml --list-tags |
| --list-tasks | 列出所有任务 | ansible-playbook play.yml --list-tasks |
| --limit | 限制运行的主机 | ansible-playbook play.yml --limit web1 |
| -f N | 设置并发数(默认5) | ansible-playbook play.yml -f 10 |
| -t TAGS | 只运行指定 tag 的任务 | ansible-playbook play.yml -t deploy |
| -v[vv] | 显示详细输出 | ansible-playbook play.yml -vvv |
执行示例
# 测试运行 playbook
ansible-playbook site.yml --check
# 只在 web 组运行
ansible-playbook site.yml --limit web
# 运行带有 deploy 标签的任务
ansible-playbook site.yml -t deploy
# 显示详细输出
ansible-playbook site.yml -vvvPlaybook中元素属性
1. 主机与用户(Hosts & Users)
定义要操作的目标主机和执行用户:
# 基本格式
---
- hosts: 192.168.1.31
remote_user: root
# 指定多个主机/组
- hosts: webservers:dbservers
remote_user: deploy任务级别用户
tasks:
- name: run df -h
remote_user: test
shell: name=df -h
# 使用 sudo
- name: install package
sudo: yes
sudo_user: admin
yum: name=httpd state=present2. 任务列表(Tasks)
每个任务都应该:
- 有描述性的名称
- 指定要使用的模块
- 提供必要的参数
tasks:
- name: create new file
file: path=/tmp/test01.txt state=touch
- name: create new user
user: name=test001 state=present3. 处理器(Handlers)
Handlers 用于响应变更通知:
- httpd.yml
tasks:
- name: 配置 Apache
template:
src: httpd.conf.j2
dest: /etc/httpd/conf/httpd.conf
notify: restart apache # 通知处理器
handlers:
- name: restart apache # 处理器名称
service:
name: httpd
state: restarted注意:
- handlers 只在被通知时执行
- 多次通知只执行一次
- 按照定义顺序执行
Playbook中变量的使用
1. 变量定义方式
命令行变量
# 单个变量
ansible-playbook test.yml -e "version=1.0.0"
# 多个变量
ansible-playbook test.yml -e "hosts=web user=test"
# 使用变量文件
ansible-playbook test.yml -e "@vars.yml"Playbook 变量
---
- hosts: webservers
vars:
http_port: 80
max_clients: 200
app_version: "1.0.0"
tasks:
- name: 配置 Apache
template:
src: httpd.conf.j2
dest: /etc/httpd/conf/httpd.conf变量文件
# vars/main.yml
---
db_name: myapp
db_user: admin
db_password: secret
# playbook.yml
---
- hosts: dbservers
vars_files:
- vars/main.yml
tasks:
- name: 创建数据库
mysql_db:
name: "{{ db_name }}"
state: present2. 变量使用规则
- 变量名只能包含字母、数字和下划线
- 变量名必须以字母开头
- 在模板中使用变量需要加双花括号
{{ var_name }} - 命令行变量优先级最高
3. 特殊变量
# 内置变量
ansible_hostname: 主机名
ansible_distribution: 操作系统
ansible_os_family: 系统家族
ansible_architecture: 系统架构
# 注册变量
tasks:
- name: 检查服务状态
command: systemctl status httpd
register: service_status
- name: 显示状态
debug:
var: service_status.stdout4. 变量作用域
- 全局变量: 适用于所有主机
- 主机变量: 只适用于特定主机
- 组变量: 适用于特定组的所有主机
- 任务变量: 只在特定任务中有效
# /etc/ansible/hosts
# 主机变量
[webservers]
web1 http_port=8080 ansible_ssh_user=deploy
# 组变量
[webservers:vars]
app_env=production
max_clients=200最佳实践
变量管理
- 使用有意义的变量名
- 集中管理变量文件
- 合理使用变量作用域
安全建议
- 加密敏感变量
- 避免明文密码
- 使用 vault 加密文件
注意:
- 注意变量优先级
- 避免变量名冲突
- 谨慎使用全局变量
参考资料: