Ansible Playbook 基础用法
Ansible Playbook 是对一系列 Ansible 命令的封装,使用 YAML 语言编写。Playbook 中的命令按顺序自上而下执行。Playbook 的一个关键特性是能够传递命令的状态,例如,可以将一台机器上的文件内容捕获为变量,并在另一台机器上使用,这使得实现复杂的部署机制成为可能,这是标准 Ansible 命令无法做到的。
Playbook 结构
Playbook 由一个或多个 "play" 组成。每个 play 的主要目的是将一组预先分组的主机配置为由 Ansible 的 task 定义的角色。本质上,task 是对 Ansible 模块的调用。将多个 play 组织在一个 Playbook 中,可以按照预先编排的机制协同执行。Playbook 主要包含以下四个部分:
- Target Section: 定义将要执行 Playbook 的远程主机组。
- Variable Section: 定义 Playbook 执行时需要使用的变量。
- Task Section: 定义将在远程主机上执行的任务列表。
- Handler Section: 定义 task 执行完成后需要调用的任务。
通常的目录结构如下(可根据需要调整):
vars: 变量目录tasks: 任务目录handlers: 触发器目录files: 文件目录templates: 模板目录
Hosts 和 Users
Playbook 中的每个 play 旨在让指定的主机以指定的用户身份执行任务。
hosts: 指定要执行任务的主机,可以是单个或多个由冒号分隔的主机组。remote_user: 指定在远程主机上执行任务的用户。此设置也可应用于单个 task,或通过sudo以特定用户身份执行。user: 与remote_user相同。sudo: 若设置为yes,执行任务的用户将获得 root 权限。sudo_user: 如果user设置为某个用户,sudo为yes,并且sudo_user设置为另一个用户,则原用户在执行任务时将获得sudo_user的权限。connection: 指定连接到远程主机的方式,默认为ssh。gather_facts: 默认情况下,Ansible 会在远程主机上执行setup模块收集信息。如果明确不需要这些变量,可以将此选项设置为False。
Task 列表和 Action
Play 的核心是任务列表。任务按顺序在 hosts 中指定的所有主机上执行。即,在一个主机上完成第一个任务后,才开始执行第二个任务。在自上而下执行 Playbook 时,如果发生错误,所有已执行的任务都将回滚,修正 Playbook 后重新执行即可。Task 的目的是使用指定的参数执行模块,并且可以在模块参数中使用变量。模块执行是幂等的,意味着多次执行结果一致,是安全的。每个 task 都应该有一个 name,用于在 Playbook 执行结果中清晰地描述任务步骤。如果未提供 name,则使用 action 的结果作为输出。Task 的定义可以使用 action: module options 或 module: options 格式,推荐后者以实现向后兼容。如果一行内容过长,可以使用前导空格进行换行。
tasks:
- name: 确保 Apache 运行
service: name=httpd state=running
在众多模块中,只有 command 和 shell 模块可以不使用 "key=value" 格式,直接给定一个列表:
tasks:
- name: 禁用 SELinux
command: /sbin/setenforce 0
如果命令或脚本的退出码不为零,可以使用以下方式处理:
tasks:
- name: 运行命令并忽略结果
shell: /usr/bin/somecommand || /bin/true
使用 ignore_errors 来忽略错误信息:
tasks:
- name: 运行命令并忽略错误
shell: /usr/bin/somecommand
ignore_errors: True
Handlers
Handlers 用于在关注的资源发生变化时执行某些操作。notify action 可以在每个 play 的最后被触发,这可以避免在多次发生变化时每次都执行指定的操作,而是仅在所有变化完成后一次性执行。在 notify 中列出的操作称为 handler,即 notify 中调用 handler 中定义的操作。注意:notify 中的名称必须与 tasks 中定义的 - name 内容完全一致,否则将无法触发。
- name: 模板化配置文件
template: src=template.j2 dest=/etc/foo.conf
notify:
- 重启 memcached
- 重启 apache
handlers:
- name: 重启 memcached
service: name=memcached state=restarted
- name: 重启 apache
service: name=apache state=restarted
Tags
Tags 用于让用户选择运行或跳过 Playbook 中的部分代码。Ansible 具有幂等性,会自动跳过没有发生变化的部分。即使如此,有些代码的验证过程可能非常耗时。此时,如果确信代码未发生变化,可以通过 tags 来跳过这些代码片段。