如何完全排除 Ansible 角色而不将所有任务打印为跳过?

问题描述 投票:0回答:1

我有一个简单的剧本,可以执行两个角色。标签只是用于将执行限制为某个角色或另一个角色(而不是全部执行):

- 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 会打印出有关此角色的大量详细信息,所有任务都被标记为被跳过。对于生产执行来说,这是很多不必要的噪音,我想知道如何改进它。

我考虑的一个选择是创建一个永远不会在生产中执行的单独的剧本。但这增加了额外的复杂性,而且因为第三个角色依赖于前两个角色,将其分开感觉是错误的......关于如何改进这一点有什么想法吗?

ansible
1个回答
2
投票

您可以使用

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
中的依赖项,以便您的第三个角色显式运行前两个角色。然后,如果你将它们分离到其他剧本中,它就不会那么脆弱。

© www.soinside.com 2019 - 2024. All rights reserved.