我对ansible很陌生,所以我可能设置错误。我的想法是我有某些类别的服务器。(例如监视器、网络、数据库)
我想在它们上运行本地 ansible 运行,所以我的显示器播放看起来像
---
# plays/monitor.yaml
- hosts: mongo
connection: local
hosts: localhost
become: yes
become_user: root
roles:
- ../roles/users
- ../roles/monitor
vars:
sensu_install_client: true
sensu_install_server: true
我的roles/monitor/tasks/main.yml
样子
---
# roles/monitor/tasks/main.yaml
- include: common.yml
- include: server.yml
when: sensu_install_server
- include: client.yml
when: sensu_install_client
我希望能够传入 vars,以便角色中发生包含。所以当我设置我的 api 实例时,我可以做类似的事情
vars:
sensu_install_client: true
在剧中,它将只包含来自监视器角色的 client.yml。
我不清楚为什么这不起作用。我看不出有什么问题。但是让我给你一些一般性的建议,也许这对你也有帮助。
最佳实践是将您的剧本放在根级别。看看这个结构。使用该设置,您无需指定角色的路径,因为 Ansible 会自动期望角色在
roles
相对于 playbook 的目录中。然后你在剧本中的角色部分就更干净了:您可以使用其他两种方法,而不是定义全局变量来触发角色内部的操作。
1.角色参数
角色可以有参数。如果要传递参数,只需将其转换为字典:
sensu_install_client
然后变量sensu_install_server
仅在角色中可用monitor
。这更干净一点,也让任何人都清楚这些 var 将用于此角色,而不是users
角色。2. 标签
标签实际上是如何触发剧本/角色的特定部分的方式。但是标签是从命令行传递的,而不是通过 playbook 中的硬编码变量传递的。想象一下你的角色
main.yml
是这样的:标签
always
是特殊的,它将运行标记的任务......你猜对了......总是。现在你可以这样称呼你的剧本:
或者
或者,如果您想同时运行两者,您甚至可以这样做:
如果您使用它,请不要忘记相应地标记您的用户角色,否则它根本不会运行。
如果你没有指定任何
--tags
所有的任务都被执行,如果你想过滤特定的标签你可以使用--skip-tags
选项你甚至可以过滤always标签。