Vagrant 在流浪机器上运行Ansible playbook时,会跳过一些重要任务,但为什么?

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' 我在一台

这是我写的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'
我在一台流浪机器上运行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”。