除了在 Ansible 中导入角色之外,还有更好的选择吗?

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

我正在尝试编写一个剧本,根据运行时传入的参数来安装和卸载自定义工具。为此,我定义了一个用于安装它的角色和另一个用于卸载它的角色。

我遇到的问题是角色之间共享相当多的变量和处理程序。但是,由于一次仅导入一个角色,因此另一个角色中定义的任何处理程序或变量都不可用。

这让我认为有条件导入角色的方法可能不正确。

示例代码:

- hosts: all

  vars_files:
    - vars/main.yml    # <-- I had to explicitly define the path of the shared variables file

  tasks:
    - import_role:
        name: install_script_discovery
      when: install | bool
    - import_role:
        name: uninstall_script_discovery
      when: not install | bool  

  handlers: 
    - name: reload audit daemon
      command: /usr/sbin/service auditd reload

我不喜欢的是必须显式设置 main.yml 变量文件的路径,对于剧本 main.yml 文件中的处理程序也是如此。角色的美妙之处在于,您可以创建 /vars 或 /handlers 目录并将 main.yml 文件放入其中,这些文件将自动加载,从而保持角色代码简洁。

所以我想知道是否可以在剧本级别复制此行为,或者有条件地导入角色的方法可能不正确,因为变量和处理程序都应该可以在所有角色中访问,无论它们是从哪里加载的?

ansible
1个回答
0
投票

为什么不使用具有两个任务文件的single角色?也就是说,这样的布局:

roles/
  script_discovery/
    tasks/
      install.yaml
      uninstall.yaml

然后在你的剧本中:

tasks:
  - import_role:
      name: script_discovery
      tasks_from: install.yaml
    when: install | bool
  - import_role:
      name: script_discovery
      tasks_from: uninstall.yaml
    when: not install | bool  

这允许您在

install
uninstall
任务列表之间共享处理程序、变量等。


您可能更喜欢

include_role
而不是
import_role
:使用
include_role
when
条件将应用于
include_role
任务本身;使用
import_role
时,
when
条件将应用于角色内的每个任务。

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