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

时间:2016-12-10 10:51:05

标签: 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'

我正在使用ubuntu / trusty的Vagrant机器上运行该剧本,但剧本跳过相关任务:

# 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

跳过的原因是什么?

1 个答案:

答案 0 :(得分:3)

  

我在一台Ubuntu / trusty的Vagrant机器上运行该剧本,但剧本跳过了相关的任务:

when: ansible_distribution != 'Ubuntu' and ansible_distribution_release != 'trusty'

这不是一个"跳过的任务"。任务本身已执行,when中的条件将根据此结果进行评估:执行指定的模块fail case)跳过

这种行为似乎完全符合你的意图。

只有在第一个条件为真且第二个条件为真时才执行任务(简化when: true and true)。

由于机器是ubuntu / trusty:

  • ansible_distribution等于Ubuntu,因此第一个条件(!="不等于")为false
  • ansible_distribution_release等于trusty,因此第二个条件(!="不等于")为false

在这种情况下,两个条件都是假的(when: false and false),整个表达式(when: false)也是假的,因此任务会跳过。

如果您希望ubuntu / trusty上的任务失败(这是fail模块的目的),您需要将条件更改为:

when: ansible_distribution == 'Ubuntu' and ansible_distribution_release == 'trusty'