Ansible playbooks

Ansible Playbooks 提供了一个可重复、可重用且简单的配置管理和多机部署系统,非常适合部署复杂的应用程序。如果您需要使用 Ansible 多次执行某项任务,可以编写一个 playbook 并将其纳入源代码控制。然后,您可以使用该 playbook 推送新配置或确认远程系统的配置情况。

Playbooks 允许您执行以下操作:

  • 声明配置。

  • 按照定义的顺序,在多组机器上编排任何手动有序流程的步骤。

  • 同步或异步地启动任务。

Playbook 语法

您使用最简语法的 YAML 格式来编写 playbook。如果您不熟悉 YAML,请查看 YAML 语法 概述,并考虑为您的文本编辑器安装插件(参见 其他工具和程序),以帮助您在 playbook 中编写整洁的 YAML 语法。

一个 playbook 由一个有序列表中的一个或多个 “play” 组成。“playbook” 和 “play” 是体育术语的类比。每个 play 执行 playbook 整体目标的一部分,运行一个或多个任务。每个任务调用一个 Ansible 模块。

Playbook 执行

Playbook 从上到下顺序运行。在每个 play 内部,任务同样从上到下顺序运行。包含多个 play 的 playbook 可以编排多机部署,例如在 Web 服务器上运行一个 play,在数据库服务器上运行另一个 play,并在网络基础设施上运行第三个 play。至少,每个 play 定义两件事:

对于 Ansible 2.10 及更高版本,您应该在 playbook 中使用完全限定集合名称 (FQCN)。使用 FQCN 可以确保您选择了正确的模块,因为多个集合可能包含同名模块。例如,user。请参阅 在 playbook 中使用集合

在以下示例中,第一个 play 针对 Web 服务器,第二个 play 针对数据库服务器。

---
- name: Update web servers
  hosts: webservers
  remote_user: root

  tasks:
  - name: Ensure apache is at the latest version
    ansible.builtin.yum:
      name: httpd
      state: latest

  - name: Write the apache config file
    ansible.builtin.template:
      src: /srv/httpd.j2
      dest: /etc/httpd.conf

- name: Update db servers
  hosts: databases
  remote_user: root

  tasks:
  - name: Ensure postgresql is at the latest version
    ansible.builtin.yum:
      name: postgresql
      state: latest

  - name: Ensure that postgresql is started
    ansible.builtin.service:
      name: postgresql
      state: started

您的 playbook 可以包含除 hosts 行和任务之外的内容。例如,上述 playbook 为每个 play 设置了 remote_userremote_user 是 SSH 连接的用户账户。您可以在 playbook、play 或任务级别添加其他 Playbook 关键字 来影响 Ansible 的行为。Playbook 关键字可以控制 连接插件、是否使用 权限提升、如何处理错误等。为了支持各种环境,您可以在 Ansible 配置或 inventory 中将许多此类参数设置为命令行标志。学习这些数据源的 优先级规则 将在您扩展 Ansible 生态系统时对您有所帮助。

任务执行

默认情况下,Ansible 按顺序地对所有匹配主机模式的机器逐一执行每个任务。每个任务使用特定参数执行一个模块。在任务在所有目标机器上执行完毕后,Ansible 将移动到下一个任务。您可以使用 策略 (strategies) 来更改此默认行为。在每个 play 中,Ansible 对所有主机应用相同的任务指令。如果某个任务在某台主机上失败,Ansible 将在该 playbook 的剩余运行过程中将该主机从轮询中移除。

运行 playbook 时,Ansible 会返回有关连接的信息、所有 play 和任务的 name 行、每个任务在每台机器上是成功还是失败,以及每个任务是否在每台机器上产生了变更。在 playbook 执行结束时,Ansible 会提供一个关于目标节点及其执行情况的摘要。常规失败和致命的 “不可达 (unreachable)” 通信尝试在计数中是分开记录的。

期望状态与幂等性

大多数 Ansible 模块会检查期望的最终状态是否已经实现,如果该状态已实现,则在不执行任何操作的情况下退出。重复执行该任务不会改变最终状态。以这种方式运行的模块被称为 “幂等 (idempotent)”。无论您运行一次还是多次 playbook,结果都应该是相同的。然而,并非所有 playbook 和所有模块都表现出这种特性。如果您不确定,请在生产环境中多次运行之前,先在沙箱环境中测试您的 playbook。

运行 playbook

要运行 playbook,请使用 ansible-playbook 命令。

ansible-playbook playbook.yml -f 10

在运行 playbook 时使用 --verbose 标志,以查看成功和失败任务的详细输出。

以检查模式运行 playbook

Ansible 的检查模式 (check mode) 允许您执行 playbook 而不对系统应用任何更改。您可以在生产环境中实施 playbook 之前,使用检查模式对其进行测试。

要以检查模式运行 playbook,请向 ansible-playbook 命令传递 -C--check 标志。

ansible-playbook --check playbook.yaml

执行此命令将正常运行 playbook。Ansible 不会实施任何修改,而是提供一份关于它将要做出哪些更改的报告。该报告包括文件修改、命令执行和模块调用等详细信息。

检查模式提供了一种安全且实用的方法来检查 playbook 的功能,而无需承担对系统造成意外更改的风险。检查模式也是调试运行不符合预期的 playbook 的一个宝贵工具。

Ansible-Pull

您可以反转 Ansible 架构,使节点向中心位置报告,而不是由您将配置推送给它们。

ansible-pull 命令是一个小型脚本,它从 git 中检出配置指令仓库,然后针对该内容运行 ansible-playbook

如果您对检出位置进行负载均衡,ansible-pull 的扩展性将是无限的。

运行 ansible-pull --help 查看详情。

验证 playbook

在运行 playbook 之前,您可能希望对其进行验证以捕获语法错误和其他问题。ansible-playbook 命令提供了多种验证选项,包括 --check, --diff, --list-hosts, --list-tasks--syntax-check验证 playbook 的工具 话题描述了其他用于验证和测试 playbook 的工具。

ansible-lint

您可以使用 ansible-lint 在执行 playbook 之前获得详细的、针对 Ansible 的反馈。例如,如果您对本页顶部的 verify-apache.yml playbook 运行 ansible-lint,您应该会得到以下结果:

$ ansible-lint verify-apache.yml
[403] Package installs should not use latest
verify-apache.yml:8
Task/Handler: ensure apache is at the latest version

ansible-lint 默认规则 页面描述了每种错误。

另请参阅

ansible-lint

学习如何测试 Ansible Playbooks 语法

YAML 语法

学习 YAML 语法

通用提示

在实际环境中管理 playbook 的技巧

集合索引

浏览现有的集合、模块和插件

您应该开发模块吗?

学习通过编写自己的模块来扩展 Ansible

模式:定位主机和组

学习如何选择主机

交流方式

有疑问?需要帮助?想分享你的想法?请访问 Ansible 通信指南