Ansible 剧本

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

剧本可以

  • 声明配置

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

  • 同步或 异步 启动任务

剧本语法

剧本以 YAML 格式表示,语法最少。如果您不熟悉 YAML,请查看我们对 YAML 语法 的概述,并考虑为您的文本编辑器安装附加组件(参见 其他工具和程序)以帮助您在剧本中编写干净的 YAML 语法。

剧本由一个或多个按顺序排列的“剧本”组成。术语“剧本”和“剧本”是体育类比。每个剧本都执行剧本的总体目标的一部分,运行一个或多个任务。每个任务都调用一个 Ansible 模块。

剧本执行

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

  • 使用 模式 指定要定位的受管节点

  • 至少执行一项任务

注意

在 Ansible 2.10 及更高版本中,我们建议您在剧本中使用完全限定的集合名称以确保选择正确的模块,因为多个集合可能包含具有相同名称的模块(例如,user)。参见 在剧本中使用集合

在此示例中,第一个剧本定位 Web 服务器;第二个剧本定位数据库服务器。

---
- 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

您的剧本可以包含的不仅仅是 hosts 行和任务。例如,上面的剧本为每个剧本设置了 remote_user。这是 SSH 连接的用户帐户。您可以在剧本、剧本或任务级别添加其他 剧本关键字 以影响 Ansible 的行为。剧本关键字可以控制 连接插件、是否使用 特权提升、如何处理错误等等。为了支持各种环境,Ansible 允许您将许多这些参数设置为命令行标志、在您的 Ansible 配置中或在您的清单中。了解这些数据源的 优先级规则 将在您扩展 Ansible 生态系统时有所帮助。

任务执行

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

当您运行剧本时,Ansible 将返回有关连接、所有剧本和任务的 name 行、每个任务是否在每台机器上成功或失败以及每个任务是否在每台机器上进行了更改的信息。在剧本执行的底部,Ansible 提供了目标节点的摘要以及它们的表现。一般性故障和致命性“不可达”通信尝试将在计数中分开。

期望状态和“幂等性”

大多数 Ansible 模块检查是否已实现期望的最终状态,如果已实现该状态,则退出而不执行任何操作,因此重复任务不会改变最终状态。行为如此的模块通常称为“幂等”。无论您运行剧本一次还是多次,结果都应该相同。但是,并非所有剧本和所有模块都以这种方式运行。如果您不确定,请在生产环境中多次运行剧本之前在沙盒环境中对其进行测试。

运行剧本

要运行您的剧本,请使用 ansible-playbook 命令。

ansible-playbook playbook.yml -f 10

运行剧本时使用 --verbose 标志以查看来自成功模块和不成功模块的详细输出。

在检查模式下运行剧本

Ansible 的检查模式允许您在不应用任何更改的情况下执行剧本。您可以使用检查模式在生产环境中实现剧本之前对其进行测试。

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

ansible-playbook --check playbook.yaml

执行此命令将正常运行剧本,但 Ansible 不会实现任何修改,而是简单地提供有关其将要进行的更改的报告。此报告包括有关文件修改、命令执行和模块调用的详细信息。

检查模式提供了一种安全且实用的方法来检查剧本的功能,而不会冒意外更改系统的风险。此外,它也是排查预期功能不正常的剧本的宝贵工具。

Ansible-Pull

如果您想反转 Ansible 的架构,以便节点签入到中心位置,而不是将配置推送到它们,您可以这样做。

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

假设您对签出位置进行负载均衡,ansible-pull 的扩展能力本质上是无限的。

运行 ansible-pull --help 以获取详细信息。

验证剧本

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

ansible-lint

您可以在执行剧本之前使用 ansible-lint 获取有关剧本的详细、特定于 Ansible 的反馈。例如,如果您在页面顶部的名为 verify-apache.yml 的剧本上运行 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],建议的修复方法是在剧本中将 state: latest 更改为 state: present

另请参阅

ansible-lint

了解如何测试 Ansible 剧本语法

YAML 语法

了解 YAML 语法

一般提示

在现实世界中管理剧本的提示

集合索引

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

您应该开发一个模块吗?

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

模式:定位主机和组

了解如何选择主机

沟通

有问题?需要帮助?想分享您的想法?访问 Ansible 沟通指南