title = '现代 IT 人一定要知道的 Ansible系列教程:playbook' date = 2023-12-23 draft = false summary = 'Ansible Playbook 提供了一个可重复、可重用、简单的配置管理和多机部署系统,非常适合部署复杂的应用程序。如果您需要多次使用 Ansible 执行任务,请编写一个 playbook 并将其置于源代码控制之下。然后,您可以使用 playbook 推出新配置或确认远程系统的配置。' tags = ["devops"]
现代 IT 人一定要知道的 Ansible系列教程:playbook
创建 playbook
- Playbook
Playbook 是 Ansible 用于部署和配置托管式节点的
YAML
自动化蓝图。 定义 Ansible 从上到下执行操作以实现总体目标的顺序列表。
Play
映射到清单中的托管式节点的任务的有序列表。
Task 任务
个或多个模块的列表,用于定义 Ansible 执行的操作。
Module 模块
Ansible 在托管式节点上运行的代码单元或二进制文件。Ansible 模块分组到集合中,每个模块都有一个完全限定的集合名称。
我们来编写一个 Playbook 文件,用于 ping 主机并打印Hello world
消息:
- 在
ansible_quickstart
目录中创建一个名为playbook.yaml
文件,其中包含以下内容:
- name: My first play
hosts: myhosts
tasks:
- name: Ping my hosts
ansible.builtin.ping:
- name: Print message
ansible.builtin.debug:
msg: Hello world
- 运行 playbook
root@master:~/ansible_quickstart# ansible-playbook -i inventory.ini playbook.yaml
Ansible 返回以下输出:
代码语言:javascript复制 PLAY [My first play] ********************************************************************************************************************************************************************************
TASK [Gathering Facts] ******************************************************************************************************************************************************************************
ok: [192.168.2.130]
ok: [192.168.2.129]
TASK [Ping my hosts] ********************************************************************************************************************************************************************************
ok: [192.168.2.130]
ok: [192.168.2.129]
TASK [Print message] ********************************************************************************************************************************************************************************
ok: [192.168.2.129] => {
"msg": "Hello world"
}
ok: [192.168.2.130] => {
"msg": "Hello world"
}
PLAY RECAP ******************************************************************************************************************************************************************************************
192.168.2.129 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.2.130 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
在此输出中,我们可以看到:
- 我们为 playbook 和每个任务命名。应始终使用描述性名称,以便于验证 playbook 并对其进行故障排除。
- 任务
Gather Facts
以隐式方式运行。默认情况下,Ansible 会收集有关清单的信息,以便在 playbook 中使用这些信息。 - 每个任务的状态。每个任务都有一个状态,
ok
表示它已成功运行。 PLAY RECAP
汇总了每个主机的 playbook 中所有任务的结果。在此示例中,有2个任务,因此ok=2
表示每个任务都已成功运行。
使用patterns
几乎每当执行临时命令或 playbook 时,都会使用模式。该模式是临时命令中唯一没有标志的元素。它通常是第二个元素:
代码语言:javascript复制ansible <pattern> -m <module_name> -a "<module options>"
例如:
代码语言:javascript复制ansible webservers -m service -a "name=httpd state=restarted"
在 playbook 中,模式是每个playbook的 hosts:
- name: restart webservers
hosts: webservers
由于您经常希望同时对多个主机运行命令或 playbook,因此模式通常是指清单组。上面的临时命令和 playbook 都将对 webservers
组中的所有计算机执行。
常见patterns
下面表中列出了定位清单主机和组的常见模式。
Description | Pattern(s) | Targets |
---|---|---|
All hosts | all (or *) | |
One host | host1 | |
Multiple hosts | host1:host2 (or host1,host2) | |
One group | webservers | |
Multiple groups | webservers:dbservers | all hosts in webservers plus all hosts in dbservers |
Excluding groups | webservers:!atlanta | all hosts in webservers except those in atlanta |
Intersection of groups | webservers:&staging | any hosts in webservers that are also in staging |
一旦你知道了基本模式,你就可以将它们组合起来。比如: webservers:dbservers:&staging:!phoenix
以 webservers
和dbservers
组中也属于staging
组的所有计算机为目标,但phoenix
组中的任何计算机除外。
模式的局限性
模式取决于 inventory。如果主机或组未在清单中列出,则无法使用模式来定位它。
如果您的模式包含未出现在清单中的 IP 地址或主机名,可能会看到如下错误:
代码语言:javascript复制[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: Could not match supplied host pattern, ignoring: *.not_in_inventory.com
模式必须与清单语法匹配。如果将主机定义为别名
代码语言:javascript复制atlanta:
host1:
http_port: 80
maxRequestsPerChild: 808
host: 127.0.0.2
必须在模式中使用别名。在上面的示例中,必须在模式中使用 host1
。如果使用 IP 地址,将再次收到错误:
[WARNING]: Could not match supplied host pattern, ignoring: 127.0.0.2
高级模式选项
上面描述的常见模式可以满足您的大部分需求,但 Ansible 提供了其他几种方法来定义您要面向的主机和组。
在模式中使用变量
可以使用变量来允许将带有 -e
参数的组说明符传递给 ansible-playbook:
webservers:!{{ excluded }}:&{{ required }}
在模式中使用组位置
您可以按主机或主机在组中的位置来定义主机或主机子集。例如,给定以下组:
代码语言:javascript复制[webservers]
cobweb
webbing
weber
可以使用下标来选择 Webservers 组中的单个主机或范围。
模式和临时命令
可以使用命令行选项更改临时命令中定义的模式的行为。还可以使用该 --limit
标志限制特定运行的目标主机。
- Limit to one host 限制为一台主机
$ ansible all -m <module> -a "<module options>" --limit "host1"
- 限制为多个主机
$ ansible all -m <module> -a "<module options>" --limit "host1,host2"
- 否定限制。请注意,必须使用单引号来防止 bash 插值。
$ ansible all -m <module> -a "<module options>" --limit 'all:!host1'
- 对主机组的限制
$ ansible all -m <module> -a "<module options>" --limit 'group1'
模式和 ansible-playbook 标志
可以使用命令行选项更改 playbook 中定义的模式的行为。例如,可以通过指定 -i 127.0.0.2,
(注意尾部逗号)来运行在单个主机上定义的 hosts: all
playbook。即使您的目标主机未在清单中定义,这也有效,但此方法不会读取与此主机绑定的变量的清单,并且 playbook 所需的任何变量都需要在命令行中手动指定。您还可以使用标志 --limit
限制特定运行的目标主机,该标志将引用您的清单:
ansible-playbook site.yml --limit datacenter2
最后,可以通过 --limit
在文件名前面加上 @
以下前缀来从文件中读取主机列表:
ansible-playbook site.yml --limit @retry_hosts.txt
如果 RETRY_FILES_ENABLED 设置为 True
,则 ansible-playbook
在运行后将创建一个 .retry
文件,其中包含所有播放的失败主机列表。每次 ansible-playbook
完成运行时,都会覆盖此文件。
ansible-playbook site.yml --limit @site.retry
命令选项
- --become-method <BECOME_METHOD>
权限提升方法(默认=sudo),请使用 ansible-doc -t become -l 列出有效选项。
- --become-password-file <BECOME_PASSWORD_FILE>**,** --become-pass-file <BECOME_PASSWORD_FILE>
Become password file 成为密码文件
- --become-user <BECOME_USER>
以该用户身份运行操作(默认=root)
- --connection-password-file <CONNECTION_PASSWORD_FILE>**,** --conn-pass-file <CONNECTION_PASSWORD_FILE>
连接密码文件
- --flush-cache
清除清单中每个主机的事实缓存
- --force-handlers
即使任务失败,也要运行处理程序
- --list-hosts
输出匹配主机列表;不执行任何其他操作
- --list-tags
列出所有可用标签
- --list-tasks
列出将要执行的所有任务
- --private-key <PRIVATE_KEY_FILE>**,** --key-file <PRIVATE_KEY_FILE>
使用此文件对连接进行身份验证
- --scp-extra-args <SCP_EXTRA_ARGS>
指定仅传递给 SCP 的额外参数(例如 -l)
- --sftp-extra-args <SFTP_EXTRA_ARGS>
指定仅传递给 SFTP 的额外参数(例如 -f、-l)
- --skip-tags
仅运行标签与这些值不匹配的重头戏和任务。此参数可以多次指定。
- --ssh-common-args <SSH_COMMON_ARGS>
指定要传递给 sftp/scp/ssh 的常用参数(例如 ProxyCommand)
- --ssh-extra-args <SSH_EXTRA_ARGS>
指定仅传递给 ssh 的额外参数(例如 -R)
- --start-at-task <START_AT_TASK>
在与此名称匹配的任务处启动 playbook
- --step
在运行前确认每个任务
- --syntax-check
对 playbook 执行语法检查,但不要执行它
- --vault-id
要使用的保管库标识。此参数可以多次指定
- --vault-password-file**,** --vault-pass-file
vault password file 保管库密码文件
- --version
显示程序的版本号、配置文件位置、配置的模块搜索路径、模块位置、可执行文件位置和退出
- -C, --check
不要进行任何更改;相反,请尝试预测可能发生的一些变化
- -D, --diff
更改(小)文件和模板时,显示这些文件的差异;与 –check 配合得很好
- J, --ask-vault-password, --ask-vault-pass
询问保管库密码
- -K, --ask-become-pass
询问权限升级密码
- -M ,--module-path
在模块库前面加上冒号分隔的路径 (default={{ ANSIBLE_HOME ~ “/plugins/modules:/usr/share/ansible/plugins/modules” }})
。此参数可以多次指定
- -T <TIMEOUT>, --timeout <TIMEOUT>
覆盖连接超时(以秒为单位)(默认值取决于连接)
- -b, --become
使用 become 运行操作(并不意味着密码提示)
- -c <CONNECTION>, --connection <CONNECTION>
要使用的连接类型(默认=SSH)
- -e, --extra-vars
如果 filename 前面有 @,则将其他变量设置为 key=value 或 YAML/JSON。此参数可以多次指定。
- -f <FORKS>, --forks <FORKS>
指定要使用的并行进程数(默认值 = 5)
- -i,--inventory,--inventory-file
指定清单主机路径或逗号分隔的主机列表。–inventory-file 已弃用。此参数可以多次指定。
- -k,--ask-pass
询问连接密码
- -l <SUBSET>, --limit <SUBSET>
进一步将选定的主机限制为其他模式
- -t,--tags
仅运行标记有这些值的重头戏和任务。此参数可以多次指定。
- -u ,<REMOTE_USER>, --user, <REMOTE_USER>
以该用户身份连接(默认值=无)
Environment
可以指定以下环境变量
ANSIBLE_INVENTORY
– 覆盖默认的 ansible 清单文件 ANSIBLE_LIBRARY
– 覆盖默认的 ansible 模块库路径 ANSIBLE_CONFIG
– 覆盖默认的 ansible 配置文件
ansible.cfg 中的大多数选项都提供了更多选项
Files
/etc/ansible/hosts
– 默认库存文件
/etc/ansible/ansible.cfg
– 配置文件,如果存在,则使用
~/.ansible.cfg
– 用户配置文件,覆盖默认配置(如果存在)