有条件的 Ansible

“Ansible 是一种配置管理工具,用于自动执行远程系统管理任务,例如软件部署和安装更新、配置管理、编排和许多其他 IT 任务。”

在本文中

我们将涵盖:

1. “何时”声明的目的。

2. 如何在不同场景下使用“When”语句。

3. 展示一些使用“When”语句的工作示例。

你需要什么?

在本教程中,我们假设:

1. 你已经在你的系统上安装了 Ansible(在我们的例子中是 Ubuntu 20.04)。

2.你知道Ansible是做什么用的,如何搭建一个基本的本地测试环境。

实验装置

在本实验中,我们有一个带有 Ubuntu 20.04 系统的 Ansible 控制器主机。 有两个目标节点:一个带有 Ubuntu 20.04 系统,另一个带有 Debian Buster。

Ansible 中的 When 子句

假设您正在处理某个 Ansible 项目,并且在某个时间点,您希望跳过特定主机的特定步骤。 为了更好地理解它,让我们采取一个 example,假设如果所需的软件版本不可用,您想跳过在主机上安装某种软件包。 这就是“When”子句派上用场的地方。 这使用起来非常简单,我们稍后会看到。

1. 带有“when”的简单条件句

基本条件语句适用于单个任务。 您需要做的是创建一个任务,然后使用“when”语句添加一个条件。 此“when”语句适用于测试或仅适用于此任务的条件。 看这个 example:

tasks:
- name: Running shutdown command on CentOS-based systems

ansible.builtin.command: /sbin/shutdown -t now

when: ansible_facts['os_family'] == "CentOS"

执行任务或剧本时,会针对所有主机检查测试。 如果任何主机测试通过,Ansible 将执行任务; 否则,它将跳过执行。 在上述 example任何符合 CentOS-based OS 标准的系统都会执行关机命令。

2. 使用带有“when”条件的“ansible_facts”

也可以根据事实跳过任务。 事实是主机的属性,例如主机的 IP、操作系统的类型等。以下是一些基于事实的用例:

1. 为特定操作系统版本安装软件包。

2. 在具有私有 IP 地址的主机上跳过防火墙配置。

3. 关闭特定操作系统系列的系统。

“when”子句的多个条件也可以合并。 这使用逻辑运算符 喜欢与否。 一个 example 如下图所示:

tasks:


- name: Shut off Debian 10 and Debian 11 systems

ansible.builtin.command: /sbin/shutdown -t now

when: (ansible_facts['distribution'] == "Debian" and ansible_facts['distribution_major_version'] == "10") or

(ansible_facts['distribution'] == "Debian" and ansible_facts['distribution_major_version'] == "11")

如前所述,Ansible 在运行任务之前对目标(主机)执行条件评估。 在上面的任务中,如果条件,即系统是 Debian 10 或 Debian 11,满足条件,Ansible 将执行请求的关闭任务。 如果条件不满足,Ansible 将简单地跳过此任务。

如果需要多个任务同时为真(逻辑“与”条件),我们可以将它们列为:

tasks:

- name: Shut off Ubuntu 17.04 systems

ansible.builtin.command: /sbin/shutdown -t now

when:

- ansible_facts['distribution'] == "Ubuntu"

- ansible_facts['distribution_major_version'] == "17.04"

3. 使用“注册变量”和“何时”条件

在 Ansible 中,注册变量也可以与条件一起使用。 这些变量是从戏剧中任务的输出中获得的,可以用作进一步任务的基础。

例子:

- hosts: web_servers

tasks:

- name: Running a shell command and registering its outcome as a variable using the ‘register’ keyword.

ansible.builtin.shell: /usr/bin/pwd

register: var_object

 

- name: Running a shell command based on the result of the last task

ansible.builtin.shell: /usr/bin/ls

when: var_object.stdout = =”ubuntu”

要了解 when 子句在 Ansible 中是如何工作的,让我们举一些工作示例。

示例 1:基本用法

在这个 example, Ansible 将检查远程主机上是否存在特定用户。 如果找到用户的(myuser)目录,它将在该目录中创建一个文件(myfile.txt)。 首先,创建一个包含以下内容的剧本(my-playbook.yml):

---

- hosts: all

gather_facts: no

become: true

tasks:

- name: Check if the user is present or not.

stat:

path: /home/vagrant

register: myuser

- name: If the directory is present, then create a file(myfile.txt)

file:

path: /home/vagrant/myfile.txt

state: touch

when: myuser.stat.exists

运行此 playbook 时,输出如下:

示例 2:基于 ansible_facts 的用法

在这个 exampleAnsible 将收集有关操作系统系列的事实,并使用 when 语句关闭所有基于 Ubuntu 的远程系统。

---

- hosts: all

gather_facts: yes

become: true

tasks:

- name: shutdown Debian-based servers

ansible.builtin.command: /sbin/shutdown -t now

when: ansible_facts['os_family']=="Debian"

结论

在本指南中,我们了解了如何在 Ansible 中使用“when”子句。 我们刚刚看到了“when”语句的高级概述; 您可以进一步探索如何在循环、导入和包含语句中使用“when”条件。