【问题标题】:While running an Ansible-playbook on a Vagrant machine, some important tasks are skipped, but why?在 Vagrant 机器上运行 Ansible-playbook 时,会跳过一些重要任务,但为什么呢?
【发布时间】:2026-02-13 11:40:02
【问题描述】:

这是我编写的 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

跳过的原因可能是什么?

【问题讨论】:

    标签: vagrant ansible ubuntu-14.04 ansible-playbook


    【解决方案1】:

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

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

    这并不是真正的“跳过任务”。任务本身被执行,when 中的条件被评估并基于此结果:执行指定的模块(在您的情况下为fail)是跳过。

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

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

    由于机器是 ubuntu/trusty:

    • ansible_distribution 等于Ubuntu,所以第一个条件(!=“不等于”)为假
    • ansible_distribution_release 等于trusty,所以第二个条件(!=“不等于”)为假

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


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

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

    【讨论】:

    • 我希望它仅在机器是 ubuntu 可信赖的情况下继续执行其余任务
    • 这正是它的作用。
    • 好的,我会尽快检查的
    • 换句话说,当 Ansible 说“跳过”时,它意味着它评估了 when 语句并让该主机继续运行。如果您针对具有不同发行版的主机运行 playbook,您应该会看到 when 语句显示为“true”并且主机失败并显示“不兼容”,正如您所期望的那样。
    最近更新 更多