我对 ansible 还不太熟悉,所以我可能设置错了。我的想法是我有某些类别的服务器。(例如,monitor、web、db)
我想在它们上运行一个本地 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
我希望能够传入变量,以便包含将发生在角色中。因此,当我设置我的 api 实例时,我可以执行以下操作
vars:
sensu_install_client: true
在游戏中,它只包含来自监视角色的client.yml。
答案1
我不清楚为什么这不起作用。我看不出有什么问题。但让我给你一些一般性建议,也许这也会对你有帮助。
最佳做法是将你的剧本放在根级别。看看这个结构。通过该设置,您不需要指定角色的路径,因为 Ansible 会自动期望角色位于roles
相对于剧本的目录中。然后剧本中的角色部分会更简洁:
roles:
- users
- monitor
您可以使用另外两种方法,而不是定义全局变量来触发角色内部的操作。
1.角色参数
角色可以有参数。如果要传递参数,只需将其转换为字典即可:
roles:
- users
- role: monitor
sensu_install_client: true
sensu_install_server: true
变量sensu_install_client
和sensu_install_server
仅在角色中可用monitor
。这更简洁一些,也让任何人都清楚这些变量将在此角色中使用,而不是在角色中使用users
。
2. 标签
标签实际上是触发剧本/角色特定部分的方式。不过标签是通过命令行传递的,而不是通过剧本中的硬编码变量传递的。想象一下你的角色main.yml
如下所示:
---
# roles/monitor/tasks/main.yaml
- include: common.yml
tags: always
- include: server.yml
tags: server
- include: client.yml
tags: client
该标签always
很特殊,它将运行标记的任务...嗯,你猜对了...总是这样。
现在你可以像这样调用你的剧本:
ansible-playbook monitor.yml --tags server
或者
ansible-playbook monitor.yml --tags client
或者如果你想同时运行两者你甚至可以这样做:
ansible-playbook monitor.yml --tags "client,server"
如果您使用此功能,请不要忘记相应地标记您的用户角色,否则它将根本无法运行。
如果你没有指定任何--tags
执行的所有任务,如果你想过滤特定的标签,你可以使用--skip-tags
选项
ansible-playbook monitor.yml --skip-tags "server"
您甚至可以过滤“always”标签。
ansible-playbook monitor.yml --tags "server" --skip-tags "always"