在使用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