如何为我要选择的角色运行任务?

时间:2019-12-12 02:04:24

标签: ansible ansible-role

在我的剧本中,我有:

roles:
  - role: role_1
  - role: role_2

在我的角色目录结构中,我已经在role_1和role_2下定义了具有不同值的vars

在调用该剧本时,我试图通过使用限制来要求它仅考虑我目前感兴趣的角色:

ansible-playbook -i ./hosts.yml  myplaybook.yml --limit role_1

我期望的是: 它会忽略role_2下的变量值,因为我要求它限制为role_1 我得到的是: role_2变量值将覆盖role_1,因为按字典顺序,role_2稍后。啊!

我还尝试了什么: 我尝试使用标签:

roles:
  - role: role_1
    tags: [ role_1_tag ]
  - role: role_2
    tags: [ role_2_tag ]

结果仍然是不希望的

编辑:遵循第一个答案

此处(和文档中)给出的include_role语法未经修改就无法使用。最后,我做到了:

tasks:
  - name: include role_1
    include_role:
      name: role1
      apply:
        tags:
          - role_1_tag
    tags: always

  - name: include role_2
    include_role:
      name: role_2
      apply:
        tags:
          - role_2_tag
    tags: always

但是即使那样,当我运行它时,什么也不会执行。我是这样运行的:

ansible-playbook -i ./hosts.yml % --limit role_1 -t role_1_tag

尝试另一种方式:

tags: always
tasks:
  - name: include role_1
    include_role:
      name: role1
      apply:
        tags:
          - role_1_tag


  - name: include role_2
    include_role:
      name: role_2
      apply:
        tags:
          - role_2_tag

Ansible尝试执行其他任务,但是没有访问该角色下的任何var,导致未找到变量错误

由于我将tags:放在了任务之外,所以我猜想每个任务都需要提到标签。即使这样做,我也得到相同的结果,即:

fatal: [host_group]: FAILED! => {"msg": "'my_vars' is undefined"}

Edit2:使用public: yes似乎使Ansible可以读取var,但是,它再次读取了所有变量,而--limit没有任何作用

1 个答案:

答案 0 :(得分:0)

  

问:“只考虑我目前感兴趣的角色。”

A:使用include_role。例如

- include_role:
    name: role_1
- include_role:
    name: role_2

默认情况下,参数 public no

  

此选项决定角色的var和默认值是否公开给剧本。如果设置为yes,则该变量将可用于include_role任务之后的任务。 此功能不同于角色标头或import_role下列出的角色的标准变量公开,因为它们是在剧本解析时公开的,也适用于早期的角色和任务。


注释