Ansible:仅对某些主机执行角色
Ansible: execute role only for some hosts
假设我有一个剧本,其中包含一些用于安装应用程序服务器的角色,我想在生产和测试服务器上应用相同的剧本。
生产服务器和测试服务器都有相同的角色列表,只有一个例外,它只应应用于生产服务器。
是否可以指定此角色仅应用于使用相同剧本的生产服务器?
例如,如果剧本是:
---
- hosts: appserver
roles:
- { role: mail, tags: ["mail"] }
- { role: firewall, tags: ["firewall"] }
- { role: webserver, tags: ["webserver"] }
- { role: cache, tags: ["cache"] }
我有两份库存:一份用于生产,一份用于测试。
当我 运行 使用测试清单的剧本时,我不希望执行角色 'firewall'。
我的想法是做一些事情,比如在 'production' 清单中设置一个变量,并使用类似 'if is set, then execute role 'firewall'' ...我不知道这是否可能,如果可以,该怎么做?
- { role: firewall, tags: ["firewall"], when: MyVar }
您可以在清单文件中定义变量,例如 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"] }
你走哪条路是行政决定。第二种方法使用步骤较少,但要求库存文件名在剧本中为"hardcoded"。
为什么不直接使用广告资源组?
制作两个清单:
测试:
[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"] }
假设我有一个剧本,其中包含一些用于安装应用程序服务器的角色,我想在生产和测试服务器上应用相同的剧本。
生产服务器和测试服务器都有相同的角色列表,只有一个例外,它只应应用于生产服务器。
是否可以指定此角色仅应用于使用相同剧本的生产服务器?
例如,如果剧本是:
---
- hosts: appserver
roles:
- { role: mail, tags: ["mail"] }
- { role: firewall, tags: ["firewall"] }
- { role: webserver, tags: ["webserver"] }
- { role: cache, tags: ["cache"] }
我有两份库存:一份用于生产,一份用于测试。
当我 运行 使用测试清单的剧本时,我不希望执行角色 'firewall'。
我的想法是做一些事情,比如在 'production' 清单中设置一个变量,并使用类似 'if is set, then execute role 'firewall'' ...我不知道这是否可能,如果可以,该怎么做?
- { role: firewall, tags: ["firewall"], when: MyVar }
您可以在清单文件中定义变量,例如 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"] }
你走哪条路是行政决定。第二种方法使用步骤较少,但要求库存文件名在剧本中为"hardcoded"。
为什么不直接使用广告资源组? 制作两个清单:
测试:
[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"] }