现代 IT 人一定要知道的 Ansible系列教程:playbook详解(二)

image-20240107173840916

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

Playbook 语法

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

Playbook 由有序列表中的一个或多个“任务”组成。运行一个或多个任务。每个任务调用一个 Ansible 模块。

执行

playbook 按从上到下的顺序运行。在每个playbook中,任务也按从上到下的顺序运行。可以编排多计算机部署,在 Web 服务器上运行一个任务,然后在数据库服务器上运行另一部任务,然后在网络基础结构上运行第三任务,依此类推。至少,每个任务都定义了两件事:

  • 要定位的受管节点,使用模式
  • 至少要执行一个任务

在此示例中,第一个以 Web 服务器为目标;第二个以数据库服务器为目标

---
- name: 更新web服务器
  hosts: webservers
  remote_user: root

  tasks:
  - name: 安装apache最新版本
    ansible.builtin.yum:
      name: httpd
      state: latest

  - name: 编写apache配置文件
    ansible.builtin.template:
      src: /srv/httpd.j2
      dest: /etc/httpd.conf

- name: 更新数据库服务器
  hosts: databases
  remote_user: root

  tasks:
  - name: postgresql是最新版本
    ansible.builtin.yum:
      name: postgresql
      state: latest

  - name: 启动postgresql
    ansible.builtin.service:
      name: postgresql
      state: started

playbook 可以包含的不仅仅是主机行和任务。例如,上面的配置中为每个任务设置了一个 remote_user

这是 SSH 连接的用户帐户。您可以在 playbook、play 或任务级别添加其他 playbook 关键字,以影响 Ansible 的行为方式。

Playbook 关键字可以控制连接插件、是否使用权限提升、如何处理错误等。

为了支持各种环境,Ansible 允许您在 Ansible 配置或清单中将其中许多参数设置为命令行标志。了解这些数据源的优先规则将有助于您扩展 Ansible 生态系统。

任务执行

默认情况下,Ansible 会针对主机模式匹配的所有计算机按顺序执行每个任务,一次执行一个任务。

每个任务都执行一个具有特定参数的模块。当一个任务在所有目标计算机上执行完毕后,Ansible 会继续执行下一个任务。

您可以使用策略来更改此默认行为。在每次任务中,Ansible 都会将相同的任务指令应用于所有主机。

如果主机上的任务失败,Ansible 会将该主机从轮换中移除,以执行 playbook 的其余部分。

当运行 playbook 时,Ansible 会返回有关连接、所有 play 和任务 name 的行、每个任务在每台计算机上是成功还是失败以及每个任务是否在每台计算机上进行了更改的信息。

在 playbook 执行的底部,Ansible 提供了目标节点及其执行方式的摘要。一般故障和致命的“无法访问”通信尝试在计数中保持分开。

期望状态和幂等性

大多数 Ansible 模块会检查是否已经达到所需的最终状态,如果已达到该状态,则在不执行任何操作的情况下退出,因此重复任务不会改变最终状态。以这种方式运行的模块通常称为幂等性

无论运行一次还是多次运行剧本,结果都应该是相同的。但是,并非所有 playbook 和模块都以这种方式运行。如果不确定,请在沙盒环境中测试 playbook,然后再在生产环境中多次运行它们。

运行 playbook

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

ansible-playbook playbook.yml -f 10

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

检查模式下运行 playbook

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

若要在检查模式下运行 playbook,可以将 -C or --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 的其他工具。

在执行 playbook 之前,您可以使用 ansible-lint 获取特定于 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] ,建议的解决方法是 state: present 在 playbook 中更改为 state: latest

类似的帖子