8

我有这个剧本:

  roles:
    - { role: common}
    - { role: mariadb}
    - { role: wordpress}

想要的是在每个角色中,我希望将第一个任务作为一些条件,如果为真,那么我想跳过整个角色,剧本继续下一个。

现在我可以when这样使用:

  roles:
    - { role: common, when: mvar is False }

但是为此,我必须评估mvarin playbook 本身,但为此mvar我需要该角色本身的所有其他 vars 等内容。所以我在角色中做起来会更容易。

有什么办法吗?

4

3 回答 3

7

在每个角色中,tasks/main.yml仅在满足条件时才包含包含任务的文件:

- include: real_tasks.yml
  when: condition_is_met
于 2017-02-24T12:03:09.537 回答
1

除了@techraf 的回答,还可以使用 include_tasks 代替 include。

- include_tasks: real_tasks.yml
  when: condition_is_met

Ansible包含文档说:

笔记

Include 有一些不直观的行为,具体取决于它是在游戏中还是在 playbook 上下文中运行的静态或动态,为了澄清我们正在迁移到已经建立的新集合模块(include_tasks、include_role、import_playbook、import_tasks)的行为和明确的行为。该模块仍将受支持一段时间,但我们正在考虑在不久的将来弃用它。

于 2018-08-24T12:59:18.773 回答
0

除了上述答案之外,您还可以考虑使用标签来跳过特定任务或角色,具体取决于您调用角色的方式。

https://docs.ansible.com/ansible/latest/user_guide/playbooks_tags.html

如果以不太动态的方式确定条件,这将很有效 - 因此,如果您有一个很大的剧本,但在执行时知道您想跳过某些部分。标签还可用于有选择地运行特定任务。

注意:以这种方式使用标签通常是在开发期间测试剧本的特定部分而不运行整个事情的好方法。

于 2018-11-27T09:33:37.117 回答