在使用Ansible的check选项时,确保不执行特定任务

首先

Ansible 版本 2.9.1

当在执行ansible-playbook命令时,增加了–check选项,会进入DryRun模式,不会做任何更改,而是用于试运行Playbook以确认其操作。这对于验证Playbook的功能非常方便。
然而,在根据命令结果进行处理、创建目录等实际特定任务的情况下,下一个任务的执行是有意义的,所以需要注意。以下是一个示例步骤。

处理流程
任务1:获取当前时间
任务2:根据当前时间创建一个名为姓名的目录
任务3:在任务2创建的目录中创建一个文件

如果按照通常方式执行,一切都会顺利进行。但是,由于DryRun的原因,任务1无法获取当前时间,导致任务2无法创建目录,从而产生错误。在这种情况下,应该怎么办?

---
- name: check TEST
  hosts: localhost
  gather_facts: no
  vars:
    ansible_python_interpreter: /usr/bin/python3
  tasks:
    - name: 'task1 - get date'
      local_action: 'shell date +%Y_%m_%d_%H_%M_%S'
      register: date
      run_once: true
      changed_when: false

    - name: 'task2 - make direcrory'
      file: path=/home/ec2-user/ansible/result/{{ date.stdout }}
            state=directory
            mode=0755

    - name: 'task3 - make file'
      copy:
        content: "aaa"
        dest: "/home/ec2-user/ansible/result/{{ date.stdout }}/result.cfg"
[ec2-user@ip-<addr> ansible]$ ansible-playbook check_test1.yml --check    #checkモードで実行
[WARNING]: No inventory was parsed, only implicit localhost is available

[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit
localhost does not match 'all'


PLAY [check TEST] ***************************************************************************

TASK [task1 - get date] *********************************************************************
skipping: [localhost]

TASK [task2 - make direcrory] ***************************************************************
fatal: [localhost]: FAILED! => {"msg": "The task includes an option with an undefined variable. 
~詳細なエラーメッセージは省略~

PLAY RECAP **********************************************************************************
localhost                  : ok=0    changed=0    unreachable=0    failed=1    skipped=1    rescued=0    ignored=0

改变后的执行计划

有一个名为ansible_check_mode的变量,该变量包含以下内容:
– 在正常情况下:false
– 在使用check选项时:true
根据这个变量的值,可以进行条件分支。

---
- name: check TEST
  hosts: localhost
  gather_facts: no
  vars:
    ansible_python_interpreter: /usr/bin/python3
  tasks:
    - name: 'show ansible_check_mode'
      debug:
        var: ansible_check_mode    #変数ansible_check_modeの中身を確認する

    - name: 'task1 - get date'
      local_action: 'shell date +%Y_%m_%d_%H_%M_%S'
      register: date
      run_once: true
      changed_when: false

    - name: 'task2 - make direcrory'
      file: path=/home/ec2-user/ansible/result/{{ date.stdout }}
            state=directory
            mode=0755
      when: not ansible_check_mode     #ポイント:通常時のみタスクを実行する

    - name: 'task3 - make file'
      copy:
        content: "aaa"
        dest: "/home/ec2-user/ansible/result/{{ date.stdout }}/result.cfg"
      when: not ansible_check_mode     #ポイント:通常時のみタスクを実行する

执行结果(正常情况下)

通常情况下,ansible_check_mode被设置为false,所有的任务都会被执行。

[ec2-user@ip-<addr> ansible]$ ansible-playbook check_test2.yml
[WARNING]: No inventory was parsed, only implicit localhost is available

[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit
localhost does not match 'all'


PLAY [check TEST] ***************************************************************************

TASK [show ansible_check_mode] **************************************************************
ok: [localhost] => {
    "ansible_check_mode": false    #通常モードで実行している
}

TASK [task1 - get date] *********************************************************************
ok: [localhost -> localhost]

TASK [task2 - make direcrory] ***************************************************************
changed: [localhost]

TASK [task3 - make file] ********************************************************************
changed: [localhost]

PLAY RECAP **********************************************************************************
localhost                  : ok=4    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

当使用了check选项时,执行结果

当使用check选项时,即使Task 1没有被执行(被跳过),由于ansible_check_mode被设置为true,因此Task 2和Task 3可以通过when条件跳过并避免错误。

[ec2-user@ip-<addr> ansible]$ ansible-playbook check_test2.yml --check
[WARNING]: No inventory was parsed, only implicit localhost is available

[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit
localhost does not match 'all'


PLAY [check TEST] ***************************************************************************

TASK [show ansible_check_mode] **************************************************************
ok: [localhost] => {
    "ansible_check_mode": true    #checkモードで実行している
}

TASK [task1 - get date] *********************************************************************
skipping: [localhost]

TASK [task2 - make direcrory] ***************************************************************
skipping: [localhost]

TASK [task3 - make file] ********************************************************************
skipping: [localhost]

PLAY RECAP **********************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=3    rescued=0    ignored=0
广告
将在 10 秒后关闭
bannerAds