假设我有一个单独的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;已设置,然后执行角色'防火墙''...我不知道这是否可行,如果可以,该怎么办?
答案 0 :(得分:8)
您可以在广告资源文件中定义变量,例如production_environment
,分配true
或false
值,并在剧本中使用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 }