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

tvs*_*tvs 4 ansible ansible-role

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

生产服务器和测试服务器都具有相同的角色列表,除了一个,只应在生产服务器上应用.

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

例如,如果剧本是:

---
- hosts: appserver
  roles:
    - { role: mail, tags: ["mail"] }
    - { role: firewall, tags: ["firewall"] }
    - { role: webserver, tags: ["webserver"] }
    - { role: cache, tags: ["cache"] }
Run Code Online (Sandbox Code Playgroud)

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

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

我的想法是做一些事情,比如在'生产'库存中设置一个变量并使用类似' if <var>的设置,然后执行角色'防火墙' '...我不知道这是否可能,如果它是的,该怎么办?

tec*_*raf 8

您可以定义变量,例如production_environment,在库存文件中,分配truefalse值并when在playbook中使用条件:

---
- hosts: appserver
  roles:
    - { role: mail, tags: ["mail"] }
    - { role: firewall, tags: ["firewall"], when: production_environment }
    - { role: webserver, tags: ["webserver"] }
    - { role: cache, tags: ["cache"] }
Run Code Online (Sandbox Code Playgroud)

或者您可以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"] }
Run Code Online (Sandbox Code Playgroud)

你走哪条路是一个行政决定.第二种方法使用较少的步骤,但要求库存文件名在剧本中"硬编码".


Kon*_*rov 6

你为什么不只使用库存组?制作两个库存:

测试:

[application]
my-dev-server
Run Code Online (Sandbox Code Playgroud)

生产:

[application]
company-prod-server

[firewall]
company-prod-server
Run Code Online (Sandbox Code Playgroud)

并按如下方式更改您的剧本:

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

- hosts: application
  roles:
    - { role: mail, tags: ["mail"] }
    - { role: webserver, tags: ["webserver"] }
    - { role: cache, tags: ["cache"] }
Run Code Online (Sandbox Code Playgroud)