我正在尝试编写一个剧本,根据运行时传入的参数来安装和卸载自定义工具。为此,我定义了一个用于安装它的角色和另一个用于卸载它的角色。
我遇到的问题是角色之间共享相当多的变量和处理程序。但是,由于一次仅导入一个角色,因此另一个角色中定义的任何处理程序或变量都不可用。
这让我认为有条件导入角色的方法可能不正确。
示例代码:
- 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 文件放入其中,这些文件将自动加载,从而保持角色代码简洁。
所以我想知道是否可以在剧本级别复制此行为,或者有条件地导入角色的方法可能不正确,因为变量和处理程序都应该可以在所有角色中访问,无论它们是从哪里加载的?
为什么不使用具有两个任务文件的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
条件将应用于角色内的每个任务。