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
- 模式:定位主机和组
了解如何选择主机
- 邮件列表
有任何问题、帮助或想法?欢迎加入 Google Groups 的邮件列表