Ansible 剧本入门

在上一篇文章中,我们讨论了关于 Ansible 即席命令. 我们在那里学到的任何东西都将在本文中应用,但以不同的方式应用。 本教程解释了 Ansible 中的 Playbook 是什么,以及如何通过示例使用 Ansible Playbook。

什么是 Ansible 剧本?

剧本是一个 YAML 用于对环境中的托管主机执行一项或多项任务的文件。

ad hoc 命令和 playbook 之间的主要区别在于使用 adhoc 命令,您可以创建简单的单行代码或在 shell 脚本中使用 adhoc 命令来运行简单的任务。 当您想要执行复杂的重复操作时,您应该编写剧本并将它们存储在中央存储库中,并在需要时使用它们。

假设您是系统的一部分 admin 团队。 每当构建新服务器时,您的团队负责根据您的公司政策强化服务器。

在这种情况下,您可以构建一个剧本并强化服务器。 现在可以对需要加固的 N 台新主机使用相同的剧本。

我的 Ansible 实验室结构

我将使用由两个 Ubuntu 20.04LTS 节点创建的 ansible 实验室。 如果需要,您可以参考以下文章来复制相同的实验室设置。

在 Linux 中使用 Vagrant 和 Virtualbox 进行自动化 Ansible 实验室设置

创建您的第一个 Ansible 剧本

正如我之前所说,剧本是用 YAML 格式。 剧本应该有一个 .yml 或者 .yaml 延期。 如果您想了解 YAML,请查看下面的链接。

YAML 教程 | YAML 入门

下面是我将用来演示该剧本如何工作的示例剧本。 这是一个简单的剧本,当我登录到节点时,它将负责设置自定义横幅消息。

- name: First Play - Modify banner message
  hosts: ubuntu2
  gather_facts: false
  become: yes

  tasks:
    - name: Remove Execute Permission from /etc/update-motd.d/*
      file:
        path: /etc/update-motd.d/
        mode: u=rw,g=rw,o=rw
        recurse: yes

    - name: ADD BANNER MESSAGE
      copy:
        content: "Welcome to OSTechnix"
        dest: /etc/motd

让我们看看这个剧本的每个部分。 剧本分为两个部分。 第一部分包含播放定义,例如播放名称、目标主机和权限提升。

  • 姓名 – playbook 应该有一个 play name,它不过是目标主机、参数和任务的逻辑分组。 您可以在剧本中拥有多个剧本。 给剧本起一个描述性的名字。
  • 主机 – 目标主机。 Ansible 将检查清单文件并验证 hosts 中给出的值是否在清单文件中可用。
  • 变得 – 当设置为 ‘是的’ 将运行任务 sudo 特权。 由于我正在修改权限 /etc/ 目录,任务应该以提升的权限提交。

请查看我们关于权限提升的综合文章以详细了解它。

Ansible SSH 身份验证和权限提升

播放定义

在第二部分中,定义了任务。 你应该使用关键字 “任务” 来定义任务。 在这里,我创建了两个任务。 每个任务都应该使用关键字命名 “姓名”.

  • 第一个任务将删除执行权限 /etc/update-motd.d/* 目录。 我正在使用 文件 为此的模块。
  • 第二个任务将写入字符串 “欢迎来到 OSTechnix”/etc/motd 文件使用 复制 模块。
剧本 – 任务

在运行 playbook 之前,让我检查一下目标节点的状态(managed2.anslab.com) 通过登录到节点。 你可以看到当我登录到节点时,我得到了默认的横幅消息,并且为所有文件设置了执行权限。

$ ssh [email protected]
默认状态 - Managed2 节点 默认状态 – Managed2 节点

要执行 playbook,请从终端运行以下命令。

$ ansible-playbook <playbook-name>   # SYNTAX
$ ansible-playbook banner_mod.yml
播放输出 播放输出

让我们尝试理解输出。

1. 当您运行 playbook 时,您首先会看到的是 play 名称。

PLAY [Modify banner message] *

2. 第一个任务 ansible 运行是 《收集事实》. 我们尚未在剧本中定义此任务,但除非您将其关闭,否则它将运行。

TASK [Gathering Facts] *
ok: [managed2]

3. 现在,您在 YAML 文件中定义的作为 play 一部分的任务将开始一一执行。 Ansible 将从上到下阅读剧本,因此任务将按照剧本中定义的顺序执行。

TASK [Remove Execute Permission from /etc/update-motd.d/*] *******************************************************************************************
changed: [managed2]

TASK [ADD BANNER MESSAGE] ****************************************************************************************************************************
changed: [managed2]

4. 完成所有任务后,您将有一个游戏回顾,它将为您提供不同任务的总状态计数。 在我们的例子中,总共运行了三个任务(ok=3),包括事实收集,只有两个任务(changed=2)对托管节点进行了更改。

PLAY RECAP ******************************************
managed2 : ok=3 changed=2    unreachable=0 failed=0 skipped=0    rescued=0 ignored=0   

现在我可以验证托管节点以查看更改是否已成功应用。

验证结果 验证结果

禁用事实收集

如上一节所述,当您运行 playbook 时,ansible 将通过运行 设置模块. 您可以通过在剧本中添加以下行来禁用事实收集。

gather_facts : false
禁用收集事实 禁用收集事实

现在,当您再次运行 playbook 时,您只会看到 playbook 中定义的两个任务。 由于 Ansible 是幂等的,因此如果对象已被更改,ansible 将不会尝试更改对象的状态。 所以你会看到输出为 好的.

残疾人收集事实 - 输出 残疾人收集事实 – 输出

当您必须针对大量主机运行剧本时,收集事实会使剧本运行缓慢。 这是因为 ansible 必须与托管节点连接并收集有关该节点的大量数据,这对于所有情况都不是必需的。

您可以在下面有和没有事实的情况下检查执行时间差。

$ time ansible-playbook banner_mod.yml  # WITHOUT FACTS

real    0m1.642s
user    0m0.731s
sys    0m0.220s

$ time ansible-playbook banner_mod.yml  # WITH FACTS

real    0m2.547s
user    0m1.139s
sys    0m0.187s

执行多个播放

您可以在剧本中拥有多个剧本。 正如您在下图中看到的,我的第二个游戏有一个任务将重新启动 sshd 服务使用 服务 模块在不同的主机。

多重播放定义 多重播放定义
- name: Second Play - Restart SSHD service
  hosts: ubuntu1
  gather_facts: false
  become: yes

  tasks:
    - name: Restart SSHD in managed1.anslab.com
      service:
        name: sshd
        state: restarted

让我们再次运行 playbook,您可以从输出中看到两个 play 都已成功执行。

$ ansible-playbook banner_mod.yml
执行多个播放 执行多个播放

现在您应该对如何编写剧本并执行它有一个公平的了解。 Playbook 支持其他有用的功能,我们将在接下来的部分中看到这些功能。

验证剧本语法

您可以使用 --syntax-check 标记以检查剧本中的任何语法错误。 我故意在 “收集事实” 我的剧本中的行。

$ ansible-playbook --syntax-check banner_mod.yml
剧本语法检查 剧本语法检查

提示确认

当您使用 --step 标志,对于您游戏中的每个任务,它将提示您确认继续执行该任务。

$ ansible-playbook --step banner_mod.yml
提示确认 提示确认

执行试运行

您可以模拟运行,而不是在托管节点中执行任务 -C 或者 --check 旗帜。

$ ansible-playbook -C banner_mod.yml

从特定任务开始

您可以选择从特定任务开始运行 playbook。 从下图中可以看出我是从 Play2(task1) 开始的,所以 play1 中的两个任务都被跳过了。 使用标志 --start-at-task 并将任务名称作为参数传递。

$ ansible-playbook banner_mod.yml --start-at-task "Restart SSHD in managed1.anslab.com"
从特定任务执行 从特定任务执行

使用标签运行任务

您可以将游戏和任务与 标签. 使用标签,您可以只运行具有特定标签的任务或跳过这些任务。

你可以看看下面我使用过的图片 “标签” 关键字并为其设置一些值。 您还可以将多个值添加到单个标签。

标签 标签

您可以运行以下命令来获取任务列表及其标签。

$ ansible-playbook banner_mod.yml --list-tasks
$ ansible-playbook banner_mod.yml --list-tags
列出任务和标签 列出任务和标签

采用 -t 标记并将标记名称作为参数传递。 您可以运行特定的基于标签的任务或多个标签,如下所示。 在下面 example,我正在使用来自两个不同戏剧的两个不同标签。

$ ansible-playbook -t "set_perm","restart service" banner_mod.yml
基于标签运行任务 基于标签运行任务

您还可以使用跳过任务并运行所有其他任务 --skip-tags 旗帜。

$ ansible-playbook -t "set_perm","restart service" --skip-tags "set_perm" banner_mod.yml
基于标签的跳过任务 基于标签的跳过任务

增加详细程度

有时,剧本不会按照您期望的方式运行。 这可能是在后台发生的事情或不同的错误。

要调试问题,您可以在运行 playbook 时增加详细程度(-v)。 详细程度分为四个级别。 您可以在 ansible.cfg 通过添加属性“verbosity=<level” 或从终端使用 -v 或 ANSIBLE_VERBOSITY 环境变量。

$ ansible-playbook -vvvv -t "set_perm","restart service" --skip-tags "set_perm" banner_mod.yml # VERBOSE LEVEL SET TO 4(-vvvv)

[OR]

$ ANSIBLE_VERBOSITY=4 ansible-playbook -vvvv -t "set_perm","restart service" --skip-tags "set_perm" banner_mod.yml # VERBOSE LEVEL SET TO 4(ENV VARIABLE)
详细输出 详细输出

控制并行

当您运行 playbook 时,ansible 将分批执行任务。 默认情况下,ansible 将在 5 个节点中并行执行一个任务,一旦所有 5 个节点中的所有任务都完成,它将移动到下一组 5 个节点。

同样,它将以 5 个为一组运行一个任务,直到该任务在所有节点中完成,然后移动到下一个任务并重复相同的步骤。

您可以通过设置来控制并行度并设置应该并行处理多少节点 “叉子” 中的参数 ansible.cfg 文件。

[defaults]
inventory = inventory
host_key_checking = False
forks=20

我已将 forks 的值设置为 20。它现在将在 20 个节点上并行处理一个任务。 同样,您可以根据需要增加/减少计数。

您可以覆盖中设置的值 ansible.cfg 通过文件 -f 或者 --forks 旗帜。 当我运行以下命令时,forks 值 20 将被 15 覆盖。

$ ansible-playbook banner_mod.yml -f 15

结论

在本文中,我们了解了如何编写 Ansible playbook 以及 playbook 中支持的不同参数和选项。 还有大量其他功能,如变量、条件、循环等,可以在我们将在接下来的文章中介绍的剧本中使用。

相关下一个:

  • 如何在 Ansible Playbook 中使用变量