如何从库存文件中将参数传递给Ansible中的角色?

时间:2017-04-07 21:58:48

标签: ansible

我有一组全部唯一的角色,并使用通过依赖项引入的公共角色来执行一系列所有这些其他角色需要完成的相同操作。我需要能够将一个参数传递给一个特定的角色来说明在这种情况下从注册表中提取一个docker镜像,在另一种情况下,将图像保存并执行其他操作。变量会导致问题,因为它们对于主机是明确的,并且每个主机可能有多个角色。如何构建我的ansible剧本来做到这一点?

实施例: 我有一个共同的角色,作为依赖项被拉入其他角色:

---

- name: Included Playbook - What vars do I see
  debug:
        msg: "Name Pull: {{ imagename }}"

- name: Local Running
  debug:
        msg: "Local option selected"
  when: localimage == "true"

- name: Not local
  debug:
        msg: "Not Local remote"
  when: localimage == "false"

然后是主要角色tasks \ main.yml

---

- name: Included Playbook - What vars do I see from Primary
  vars:
        myname: "{{ imagemainname }}"
  debug:
        msg: "Name-primary: {{ myname }}"

及其meta \ main.yml

---

dependencies:
   - { role: image-pull, imagename: "{{ imagemainname }}" }

第二个角色也是如此     ---

- name: Included Playbook - What vars do I see from Second
  vars:
        myname: "{{ secondname }}"
  debug:
        msg: "Name-second: {{ myname }}"

及其meta \ main.yml

---

dependencies:
   - { role: image-pull, imagename: "{{ secondname }}" }

我的主要剧本调用主要角色和第二角色,角色特定变量工作正常。

---

- name: Master
  hosts: imagemaster
  remote_user: root
  vars:
         imagemainname: "Top Dog"
  roles:
        - image-master

- name: Second
  hosts: second
  remote_user: root
  vars:
         imagemainname: "Second Dog"
  roles:
        - second

当我想在" pull"中声明do选项a或b时,什么不起作用。作用。

如果我的库存文件如下所示:

[imagemaster]
127.0.0.1

[imagemaster:vars]
localimage=false

[second]
127.0.0.1

[second:vars]
localimage=true

它不起作用,因为localimage的最后一个条目是所有角色将使用的内容。

我可以做些什么从inventory / host_vars / etc传递一些东西,这意味着我的剧本在此设置中的每次迭代都不会改变?

1 个答案:

答案 0 :(得分:0)

如果您计划将主角色和辅助角色应用于同一主机(如示例(127.0.0.1)),则您没有选项:

  

在任何部分中,重新定义var将覆盖先前的实例。如果多个组具有相同的变量,则加载的最后一个组获胜。如果你在play的vars:section中定义了两次变量,那么第二个就会获胜。

(来自docs

如果您计划将它们应用于不同的主机,那么测试是正确的,例如:

[imagemaster]
127.0.0.1

[imagemaster:vars]
localimage=false

[second]
127.0.1.1

[second:vars]
localimage=true

在这种情况下,当角色(主要/次要)应用于imagemaster群组时,localimage=false;适用于second群组 - localimage=true