Ansible Playbook

Ansible Playbook 提供了一个可重复使用、简单易用的配置管理和多机部署系统,非常适合部署复杂的应用程序。如果需要在 Ansible 中多次执行一个任务,请编写一个 Playbook 并将其置于源代码控制之下。然后,可以使用 Playbook 推送新配置或确认远程系统的配置。

Playbook 可以

  • 声明配置

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

  • 同步或异步启动任务

Playbook 语法

Playbook 使用 YAML 格式表达,并具有最少的语法。如果不熟悉 YAML,请查看我们的YAML 语法概述,并考虑为您的文本编辑器安装一个插件(请参阅其他工具和程序),以帮助您在 Playbook 中编写清晰的 YAML 语法。

一个 Playbook 由一个或多个按顺序排列的“play”组成。“Playbook”和“play”这两个术语都来自体育运动的比喻。每个 play 执行 Playbook 总体目标的一部分,运行一个或多个任务。每个任务调用一个 Ansible 模块。

Playbook 执行

Playbook 按从上到下的顺序运行。在每个 play 中,任务也按从上到下的顺序运行。具有多个“play”的 Playbook 可以编排多机部署,在一个 play 中运行 Web 服务器,然后在另一个 play 中运行数据库服务器,然后在第三个 play 中运行网络基础设施,依此类推。至少,每个 play 定义了两件事

  • 要定位的托管节点,使用模式

  • 至少要执行一个任务

注意

在 Ansible 2.10 及更高版本中,我们建议您在 Playbook 中使用完全限定的集合名称,以确保选择正确的模块,因为多个集合可能包含名称相同的模块(例如,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 可以包含的不仅仅是主机行和任务。例如,上面的 Playbook 为每个 play 设置了remote_user。这是 SSH 连接的用户帐户。您可以在 Playbook、play 或任务级别添加其他Playbook 关键字,以影响 Ansible 的行为方式。Playbook 关键字可以控制连接插件、是否使用特权提升、如何处理错误等等。为了支持各种环境,Ansible 允许您将许多这些参数设置为命令行标志、在 Ansible 配置中或在清单中设置。学习这些数据来源的优先级规则将在您扩展 Ansible 生态系统时对您有所帮助。

任务执行

默认情况下,Ansible 按照顺序,一次一个地针对主机模式匹配的所有机器执行每个任务。每个任务使用特定参数执行一个模块。当任务在所有目标机器上执行完毕后,Ansible 将继续执行下一个任务。您可以使用策略来更改此默认行为。在每个 play 中,Ansible 将相同的任务指令应用于所有主机。如果一个任务在某个主机上失败,Ansible 会将该主机从 Playbook 的其余部分中排除。

当您运行 Playbook 时,Ansible 将返回有关连接、所有 play 和任务的name行、每个任务在每台机器上是否成功或失败以及每个任务是否在每台机器上进行了更改的信息。在 Playbook 执行的底部,Ansible 提供了目标节点及其执行情况的摘要。一般的失败和致命的“无法访问”的通信尝试会在计数中分开。

期望状态和“幂等性”

大多数 Ansible 模块都会检查是否已达到期望的最终状态,如果已达到该状态,则会退出而不执行任何操作,从而使重复执行任务不会更改最终状态。以这种方式运行的模块通常被称为“幂等”模块。无论您运行 Playbook 一次还是多次,结果都应相同。但是,并非所有 Playbook 和并非所有模块都以这种方式运行。如果您不确定,请在沙盒环境中测试您的 Playbook,然后再在生产环境中多次运行它们。

运行 Playbook

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

ansible-playbook playbook.yml -f 10

运行 Playbook 时,使用--verbose标志可以查看成功模块和不成功模块的详细输出。

以检查模式运行 Playbook

Ansible 的检查模式允许您在不更改系统的情况下执行 Playbook。您可以使用检查模式来测试 Playbook,然后再在生产环境中实施它们。

要在检查模式下运行 Playbook,可以将-C--check标志传递给ansible-playbook命令

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 默认规则页面描述了每个错误。 对于 [403],推荐的修复方法是将 playbook 中的 state: latest 更改为 state: present

另请参阅

ansible-lint

了解如何测试 Ansible Playbook 语法

YAML 语法

了解 YAML 语法

通用技巧

在现实世界中管理 playbook 的技巧

集合索引

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

您应该开发一个模块吗?

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

模式:定位主机和组

了解如何选择主机

交流

有疑问?需要帮助?想分享您的想法?请访问 Ansible 交流指南