Ansible:仅对某些主机执行角色

时间:2016-10-13 00:53:19

标签: ansible ansible-role

假设我有一个单独的playbook,其中包含一些安装appserver的角色,我喜欢在生产和测试服务器上应用相同的playbook。

生产服务器和测试服务器都具有相同的角色列表,但只有一个角色应该只应用于生产服务器。

是否有可能以某种方式指定此角色仅应用于使用相同playbook的生产服务器?

例如,如果剧本是:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="http://momentjs.com/downloads/moment.js"></script>

<input type="time" name="StartTime" id='StartTime' class="form-control" />

我有两个库存:一个用于生产,一个用于测试。

当我使用测试库存运行playbook时,我不希望执行角色'firewall'。

我的想法是在“生产”广告资源中设置变量,并使用“ if&lt; var&gt;已设置,然后执行角色'防火墙''...我不知道这是否可行,如果可以,该怎么办?

3 个答案:

答案 0 :(得分:8)

您可以在广告资源文件中定义变量,例如production_environment,分配truefalse值,并在剧本中使用when条件:

---
- hosts: appserver
  roles:
    - { role: mail, tags: ["mail"] }
    - { role: firewall, tags: ["firewall"], when: production_environment }
    - { role: webserver, tags: ["webserver"] }
    - { role: cache, tags: ["cache"] }

或者您可以直接访问inventory_file变量。例如,如果您使用-i production

---
- hosts: appserver
  roles:
    - { role: mail, tags: ["mail"] }
    - { role: firewall, tags: ["firewall"], when: inventory_file == "production" }
    - { role: webserver, tags: ["webserver"] }
    - { role: cache, tags: ["cache"] }

你走哪条路是行政决定。第二种方法使用较少的步骤,但要求库存文件名称为&#34;硬编码&#34;在剧本中。

答案 1 :(得分:5)

为什么不直接使用库存组? 制作两个清单:

<强>测试

[application]
my-dev-server

<强>生产:

[application]
company-prod-server

[firewall]
company-prod-server

按照以下方式更改您的剧本:

---
- hosts: firewall
  roles:
    - { role: firewall, tags: ["firewall"] }

- hosts: application
  roles:
    - { role: mail, tags: ["mail"] }
    - { role: webserver, tags: ["webserver"] }
    - { role: cache, tags: ["cache"] }

答案 2 :(得分:3)

- { role: firewall, tags: ["firewall"], when: MyVar }

请参阅Applying ‘when’ to roles and includes