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 }

参见Applying ‘when’ to roles and includes

您可以在清单文件中定义变量,例如 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"] }

你走哪条路是行政决定。第二种方法使用步骤较少,但要求库存文件名在剧本中为"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"] }