如何在Ansible Playbook中使用条件语句

在Ansible中,你可以定义条件,在执行任务之前进行评估。当条件不满足时,任务就会被跳过。这是通过when 关键字完成的,它接受通常基于一个变量或一个事实的表达式。

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

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

nano ~/ansible-practice/playbook-04.yml
复制代码

然后在新的playbook文件中添加以下几行。

~/ansible-practice/playbook-04.yml

---
- hosts: all
  vars:
    - create_user_file: yes
    - user: sammy  
  tasks:
    - name: create file for user
      file:
        path: /home/{{ user }}/myfile
        state: touch
      when: create_user_file
复制代码

当你完成对文件内容的编辑后,保存并关闭该文件。

要在清单文件中的服务器上执行这个玩法,用你之前在运行本系列中的其他玩法时使用的相同连接参数运行ansible-playbook 。同样,我们将使用一个名为inventory 的库存文件和sammy用户来连接到远程服务器。

ansible-playbook -i inventory playbook-04.yml -u sammy
复制代码

当条件得到满足时,你会在播放输出中看到changed 状态。

Output...
TASK [create file for user] *****************************************************************************
changed: [203.0.113.10]
...
复制代码

如果你把create_user_file 的值改为no ,条件将被评估为false 。在这种情况下,你会在播放输出中看到skipping 状态,表明任务没有被执行。

Output...
TASK [create file for user] *****************************************************************************
skipping: [203.0.113.10]
... 
复制代码

在Ansible playbook的上下文中,条件式的一个常见用法是将其与register ,这个关键字可以创建一个新的变量,并将其与从命令中获得的输出进行分配。这样,你就可以使用任何外部命令来评估一个任务的执行。

需要注意的一点是,默认情况下,如果你用来评估条件的命令失败了,Ansible会中断一个游戏。为此,你需要在所述任务中包含一个ignore_errors 指令,设置为yes ,这将使Ansible转到下一个任务,继续进行游戏。

下面的例子只会在用户主目录下创建一个新文件,以防该文件还不存在,我们会用ls 指令来测试。然而,如果该文件存在,我们将使用debug 模块显示一条信息。

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

nano ~/ansible-practice/playbook-05.yml
复制代码

然后在新的playbook文件中添加以下内容。

~/ansible-practice/playbook-05.yml

---
- hosts: all
  vars:
    - user: sammy
  tasks:
    - name: Check if file already exists
      command: ls /home/{{ user }}/myfile
      register: file_exists
      ignore_errors: yes

    - name: create file for user
      file:
        path: /home/{{ user }}/myfile
        state: touch
      when: file_exists is failed

    - name: show message if file exists
      debug:
        msg: The user file already exists.
      when: file_exists is succeeded
复制代码

完成后保存并关闭该文件。

然后,用前面例子中相同的连接参数运行ansible-playbook 。这里,我们使用了一个名为inventory 的库存文件和一个名为sammy 的用户,但你应该相应地改变这些值。

ansible-playbook -i inventory playbook-05.yml -u sammy
复制代码

你第一次运行这个游戏手册时,命令会失败,因为该文件在该路径中不存在。然后创建文件的任务将被执行,而最后一个任务将被跳过。

Output...

TASK [Check if file already exists] *********************************************************************
fatal: [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": []}
...ignoring

TASK [create file for user] *****************************************************************************
changed: [203.0.113.10]

TASK [show message if file exists] **********************************************************************
skipping: [203.0.113.10]
... 
复制代码

从输出中,你可以看到create file for user 任务在服务器中引起了变化,这意味着文件被创建。现在,再次运行该游戏手册,你会得到一个不同的结果。

ansible-playbook -i inventory playbook-05.yml -u sammy
复制代码
Output...
TASK [Check if file already exists] *********************************************************************
changed: [203.0.113.10]

TASK [create file for user] *****************************************************************************
skipping: [203.0.113.10]

TASK [show message if file exists] **********************************************************************
ok: [203.0.113.10] => {
    "msg": "The user file already exists."
}
...
复制代码

如果你想了解更多关于在Ansible playbook中使用条件语句的信息,请参考官方文档。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享