如何在 Ansible Playbook 中使用条件式

在 Ansible 中,您可以定义要在执行任务之前进行评估的条件。当条件未满足时,任务会被跳过。

下面的示例定义了两个变量: create_user_fileuser. 当 create_user_file 被评估为 true 时,将在由 user 变量定义的用户主目录中创建一个新的文件:

在您的ansible-practice目录中创建一个名为playbook-04.yml的新文件:

1nano ~/ansible-practice/playbook-04.yml

然后将以下行添加到新播放簿文件中:

 1[label ~/ansible-practice/playbook-04.yml]
 2---
 3- hosts: all
 4  vars:
 5    - create_user_file: yes
 6    - user: sammy  
 7  tasks:
 8    - name: create file for user
 9      file:
10        path: /home/{{ user }}/myfile
11        state: touch
12      when: create_user_file

保存并关闭文件,当你完成了编辑其内容。

要在您的库存文件中在服务器上运行此播放本,请使用您在本系列中运行其他播放本时使用的相同连接参数运行ansible-playbook

1ansible-playbook -i inventory playbook-04.yml -u sammy

当条件满足时,您将在播放输出中看到一个更改状态:

1[secondary_label Output]
2...
3TASK [create file for user] *****************************************************************************
4changed: [203.0.113.10]
5...

如果您將「create_user_file」的值變更為「no」,該條件將被評估為「false」。

1[secondary_label Output]
2...
3TASK [create file for user] *****************************************************************************
4skipping: [203.0.113.10]
5...

在 Ansible 演示本的背景下,条件符的常见用途是将它们与注册表相结合,这是一种创建新变量并与从命令中获得的输出分配的关键字。

重要的一点要注意的是,默认情况下,如果您使用的命令来评估条件失败,Ansible 将中断播放,因此,您需要在该任务中包含一个ignore_errors指令设置为,这将使Ansible 转到下一个任务并继续播放。

下面的示例只会在用户主目录中创建一个新文件,如果该文件尚不存在,我们将用ls命令测试它,但如果该文件存在,我们将使用debug模块显示一个消息。

在您的ansible-practice目录中创建一个名为playbook-05.yml的新文件:

1nano ~/ansible-practice/playbook-05.yml

然后将以下内容添加到新播放簿文件中:

 1[label ~/ansible-practice/playbook-05.yml]
 2---
 3- hosts: all
 4  vars:
 5    - user: sammy
 6  tasks:
 7    - name: Check if file already exists
 8      command: ls /home/{{ user }}/myfile
 9      register: file_exists
10      ignore_errors: yes
11
12    - name: create file for user
13      file:
14        path: /home/{{ user }}/myfile
15        state: touch
16      when: file_exists is failed
17
18    - name: show message if file exists
19      debug:
20        msg: The user file already exists.
21      when: file_exists is succeeded

保存并关闭文件,当你完成。

在这里,我们使用一个名为库存的库存文件和一个名为sammy的用户,但您应该相应地更改这些值:

1ansible-playbook -i inventory playbook-05.yml -u sammy

第一次运行此播放簿时,该命令将失败,因为该文件不存在于该路径中,然后将执行创建该文件的任务,而最后的任务将被跳过:

 1...
 2[secondary_label Output]
 3
 4TASK [Check if file already exists] *********************************************************************
 5fatal: [203.0.113.10]: FAILED! => {"changed": true, "cmd": ["ls", "/home/sammy/myfile"], "delta": "0:00:00.004258", "end": "2020-10-22 13:10:12.680074", "msg": "non-zero return code", "rc": 2, "start": "2020-10-22 13:10:12.675816", "stderr": "ls: cannot access '/home/sammy/myfile': No such file or directory", "stderr_lines": ["ls: cannot access '/home/sammy/myfile': No such file or directory"], "stdout": "", "stdout_lines": []}
 6...ignoring
 7
 8TASK [create file for user] *****************************************************************************
 9changed: [203.0.113.10]
10
11TASK [show message if file exists] **********************************************************************
12skipping: [203.0.113.10]
13...

从输出中,你可以看到为用户创建文件的任务导致服务器发生了变化,这意味着该文件被创建了。

1ansible-playbook -i inventory playbook-05.yml -u sammy
 1[secondary_label Output]
 2...
 3TASK [Check if file already exists] *********************************************************************
 4changed: [203.0.113.10]
 5
 6TASK [create file for user] *****************************************************************************
 7skipping: [203.0.113.10]
 8
 9TASK [show message if file exists] **********************************************************************
10ok: [203.0.113.10] => {
11    "msg": "The user file already exists."
12}
13...

如果您想了解更多关于在 Ansible 播放书中使用条件符的信息,请参阅 官方文档

Published At
Categories with 技术
comments powered by Disqus