Vagrant 在流浪机器上运行Ansible playbook时,会跳过一些重要任务,但为什么?
这是我写的Ansible剧本的一部分Vagrant 在流浪机器上运行Ansible playbook时,会跳过一些重要任务,但为什么?,vagrant,ansible,ubuntu-14.04,ansible-playbook,Vagrant,Ansible,Ubuntu 14.04,Ansible Playbook,这是我写的Ansible剧本的一部分 - name: Check OS Version fail: msg: "{{ ansible_distribution }} {{ ansible_distribution_version }} is not compatible with this role" when: ansible_distribution != 'Ubuntu' and ansible_distribution_release != 'trusty' 我在一台
- name: Check OS Version
fail:
msg: "{{ ansible_distribution }} {{ ansible_distribution_version }} is not compatible with this role"
when: ansible_distribution != 'Ubuntu' and ansible_distribution_release != 'trusty'
我在一台流浪机器上运行playbook,它是ubuntu/trusty,但playbook跳过了相关任务:
# ansible-playbook /tmp/project/deploy/main.yml
[WARNING]: provided hosts list is empty, only localhost is available
PLAY [Deploy] ******************************************************************
TASK [setup] *******************************************************************
ok: [localhost]
TASK [install-docker : Check OS Version] ***************************************
skipping: [localhost]
# lsb_release -a:
root@vagrant-ubuntu-trusty-64:~# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 14.04.5 LTS
Release: 14.04
Codename: trusty
when: ansible_distribution != 'Ubuntu' and ansible_distribution_release != 'trusty'
跳过的原因可能是什么
我在一台流浪机器上运行playbook,它是ubuntu/trusty,但playbook跳过了相关任务:
# ansible-playbook /tmp/project/deploy/main.yml
[WARNING]: provided hosts list is empty, only localhost is available
PLAY [Deploy] ******************************************************************
TASK [setup] *******************************************************************
ok: [localhost]
TASK [install-docker : Check OS Version] ***************************************
skipping: [localhost]
# lsb_release -a:
root@vagrant-ubuntu-trusty-64:~# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 14.04.5 LTS
Release: 14.04
Codename: trusty
when: ansible_distribution != 'Ubuntu' and ansible_distribution_release != 'trusty'
这不是一个真正的“跳过的任务”。任务本身被执行,当被评估时,中的条件将基于此结果:指定的模块(失败
)的执行被跳过
这种行为似乎完全符合你的意图
仅当第一个条件为true,第二个条件为true时,任务才会执行(当:true和true时简化)
由于机器是ubuntu/trusty:
ansible\u发行版
等于Ubuntu
,因此第一个条件(!=
“不等于”)为false
ansible\u distribution\u release
等于trusty
,因此第二个条件(!=
“不等于”)为false
在这种情况下,两个条件都为false(when:false和false
),整个表达式(when:false
)也为false,因此任务将跳过
如果您希望ubuntu/trusty上的任务失败(这是fail
模块的目的),您需要将条件更改为:
when: ansible_distribution == 'Ubuntu' and ansible_distribution_release == 'trusty'
我在一台流浪机器上运行playbook,它是ubuntu/trusty,但playbook跳过了相关任务:
# ansible-playbook /tmp/project/deploy/main.yml
[WARNING]: provided hosts list is empty, only localhost is available
PLAY [Deploy] ******************************************************************
TASK [setup] *******************************************************************
ok: [localhost]
TASK [install-docker : Check OS Version] ***************************************
skipping: [localhost]
# lsb_release -a:
root@vagrant-ubuntu-trusty-64:~# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 14.04.5 LTS
Release: 14.04
Codename: trusty
when: ansible_distribution != 'Ubuntu' and ansible_distribution_release != 'trusty'
这不是一个真正的“跳过的任务”。任务本身被执行,当
被评估时,中的条件将基于此结果:指定的模块(失败
)的执行被跳过
这种行为似乎完全符合你的意图
仅当第一个条件为true,第二个条件为true时,任务才会执行(当:true和true时简化)
由于机器是ubuntu/trusty:
ansible\u发行版
等于Ubuntu
,因此第一个条件(!=
“不等于”)为false
ansible\u distribution\u release
等于trusty
,因此第二个条件(!=
“不等于”)为false
在这种情况下,两个条件都为false(when:false和false
),整个表达式(when:false
)也为false,因此任务将跳过
如果您希望ubuntu/trusty上的任务失败(这是fail
模块的目的),您需要将条件更改为:
when: ansible_distribution == 'Ubuntu' and ansible_distribution_release == 'trusty'
我希望它只在机器是ubuntu Trusty的情况下才能继续执行其余的任务。这正是它所做的。好的,我马上检查它。换言之,当Ansible说“跳过”时,它意味着它计算了when语句并让主机继续运行。如果你对另一个发行版的主机运行playbook,你应该看到when语句显示为“true”,主机失败并说“notcompatible”,就像你所期望的那样。我希望它只在机器是ubuntu Trusty的情况下继续执行其余的任务。这正是它的功能。好的,我马上检查它,换一种说法,当Ansible说“跳过”时,意味着它计算了when语句并让该主机继续运行。如果您针对具有不同发行版的主机运行playbook,您应该会看到when语句显示为“true”,而主机失败并像您预期的那样说“notcompatible”。