我有一个简单的剧本,可以执行两个角色。标签只是用于将执行限制为某个角色或另一个角色(而不是全部执行):
- name: Install packages
hosts: backend
roles:
- {role: some_role, tags: ['some']}
- {role: another_role, tags: ['another']}
现在我想介绍第三个角色,但无论标签是什么,它都不应该在
env: production
上执行。我是这样做的:
- {role: third_role, tags: ['third'], when: env != 'production'}
虽然这有效,但当环境设置为
production
时,Ansible 会打印出有关此角色的大量详细信息,所有任务都被标记为被跳过。对于生产执行来说,这是很多不必要的噪音,我想知道如何改进它。
我考虑的一个选择是创建一个永远不会在生产中执行的单独的剧本。但这增加了额外的复杂性,而且因为第三个角色依赖于前两个角色,将其分开感觉是错误的......关于如何改进这一点有什么想法吗?
您可以使用
roles
,而不是在
include_role
下指定角色。
在 Ansible 2.4 之后,您可以使用 ansible.builtin.import_role 进行静态行为,并使用此操作进行动态行为。
通过使用动态行为,我们可以阻止角色被包含在内。
- name: Install packages
hosts: backend
roles:
- {role: some_role, tags: ['some']}
- {role: another_role, tags: ['another']}
tasks:
- name: Don't run in production
include_role:
name: third_role
when: env != 'production'
另一种方法可能是为您不想在生产中运行的角色创建“包装”角色。
wrapper/meta/main.yaml
---
dependencies:
- role: third_role
- role: forth_role
main.yaml
...
tasks:
- name: Don't run in production
include_role:
name: wrapper_role
when: env != 'production'
您可能想要尝试一些变化,直到找到适合您且整洁的东西。
此时,问题就变成了你想如何让事情井井有条,Ansible 可以非常灵活。
您还可以考虑使用
meta.yaml
中的依赖项,以便您的第三个角色显式运行前两个角色。然后,如果你将它们分离到其他剧本中,它就不会那么脆弱。