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

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

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

tasks: - name: Running shutdown command on CentOS-based systems  ansible.builtin.command: /sbin/shutdown -t now  when: ansible_facts['os_family'] == "CentOS" 

执行任务或剧本时,会针对所有主机检查测试。 如果任何主机测试通过,Ansible 将执行任务; 否则,它将跳过执行。 在上面的例子中,任何符合 CentOS-based OS 条件的系统都会执行 shutdown 命令。

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

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

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

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

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

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

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:基本用法

在此示例中,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 的用法

在此示例中,Ansible 将收集有关操作系统系列的事实,并使用 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"