如何通过include_vars实现同名不同值变量的循环任务执行?
解决方法
要实现动态遍历vars/all/下的所有变量文件,并用每个文件的变量重复执行任务,核心是先动态获取文件列表,再循环加载变量并执行任务,具体步骤如下:
1. 动态收集变量文件列表
先用find模块扫描vars/all/目录,自动收集所有变量文件的路径,后续新增文件会自动被纳入范围,无需手动修改配置:
- name: 遍历变量文件执行任务 hosts: your_target_hosts tasks: - name: 获取vars/all下的变量文件路径列表 find: paths: "{{ playbook_dir }}/vars/all" file_type: file patterns: "*.yml,*.yaml" # 可按需添加其他后缀,比如*.json register: var_files_list
2. 循环加载变量并执行任务
遍历刚才拿到的文件列表,每次循环加载一个变量文件,然后执行你的任务集合。建议把需要重复执行的任务单独放到子任务文件中,让结构更清晰:
主Playbook示例
- name: 遍历变量文件执行任务 hosts: your_target_hosts tasks: - name: 获取变量文件路径列表 find: paths: "{{ playbook_dir }}/vars/all" file_type: file patterns: "*.yml,*.yaml" register: var_files_list - name: 逐个加载变量并执行任务 include_tasks: repeatable_tasks.yml loop: "{{ var_files_list.files | map(attribute='path') | list }}" loop_control: loop_var: current_var_file # 指定循环变量名,避免和任务内变量冲突
子任务文件repeatable_tasks.yml示例
- name: 加载当前循环的变量文件 include_vars: "{{ current_var_file }}" # 这里写你需要重复执行的任务,比如: - name: 示例任务 - 打印当前变量值 debug: msg: "当前使用的变量值: {{ your_shared_var_name }}" # 替换为你实际的变量名 # 其他需要重复执行的任务...
关键细节说明
{{ playbook_dir }}是Ansible内置变量,指向当前Playbook所在目录,确保文件路径准确。loop_control中的loop_var必须指定,避免循环变量与任务内的变量重名导致冲突。- 如果变量文件有其他格式(如
.json),直接修改patterns参数即可,比如patterns: "*.yml,*.yaml,*.json"。 - 这种方式完全不需要硬编码文件列表,新增变量文件后无需修改Playbook,直接运行即可生效。
内容的提问来源于stack exchange,提问作者smc
相关产品推荐
相关产品推荐

