如何在Ansible的include_role功能中传递自定义files/文件夹内的文件
可以实现该需求,以下是两种常用的可行方案:
方案一:传递自定义文件路径变量(最稳妥,兼容公共角色原有逻辑)
你在调用include_role时新增vars参数,把调用方角色下的目标文件路径作为变量传入公共角色即可。Ansible内置变量{{ role_path }}在调用方角色的任务上下文中,指向当前调用方角色的根目录,拼接出来的路径100%准确。
调用方代码示例:
--- - name: importing tasks from role1 include_role: name: service-deploy-role1 tasks_from: "{{ item.name }}" vars: custom_config_file: "{{ item.custom_config | default('testrole1.yaml') }}" loop: - name: install custom_config: "{{ role_path }}/files/testrole2.yaml" - name: setup
然后修改公共角色service-deploy-role1的install任务,把原来硬编码的testrole1.yaml替换为变量引用即可:
# 公共角色install任务里的示例代码 - name: 复制配置文件 copy: src: "{{ custom_config_file }}" dest: /etc/xxx/config.yaml
如果没有传入custom_config_file变量,还可以设置默认值使用公共角色自带的文件,不会影响其他场景对该公共角色的调用:{{ custom_config_file | default('testrole1.yaml') }}
方案二:临时调整文件搜索优先级(无需修改公共角色代码)
如果你不想改动公共角色的现有代码,可以在调用时临时覆盖Ansible的文件搜索路径,让它优先查找调用方角色的目录:
--- - name: importing tasks from role1 include_role: name: service-deploy-role1 tasks_from: "{{ item }}" vars: ansible_search_path: - "{{ role_path }}" - "{{ ansible_search_path | default([]) }}" loop: - install - setup
设置后公共角色查找文件时,会优先在你当前调用方的角色目录下搜索,找到对应文件就会直接使用,找不到才会回退到公共角色自己的目录下查找。
内容的提问来源于stack exchange,提问作者user_dev
相关产品推荐
相关产品推荐

