如何从Ansible角色外部目录导入全部变量文件?include_vars还是vars_files?
Ansible批量导入角色外部变量文件问题解决
问题背景
我的目录结构如下:
├── playbooks │ ├── roles │ │ └── some_role │ │ ├── tasks │ │ │ └── main.yml │ │ └── vars │ │ └── local_vars │ │ ├── var_fileA │ │ ├── var_fileB │ │ └── var_fileC │ └── some_play.yml └── vars └── external_vars ├── var_file1 ├── var_file2 └── var_file3
尝试导入vars/external_vars下的所有变量文件时遇到两个问题:
vars_files只能逐个指定文件,无法直接用目录,文件数量变化时维护麻烦;- 在角色内用相对路径写
include_vars无法访问角色外部目录,而内部目录的写法是有效的。
可行解决方案
1. 利用Ansible内置变量playbook_dir指定绝对路径
在角色的tasks/main.yml中,用playbook_dir(指向当前playbook所在的playbooks目录)来拼接外部变量目录的路径,避免相对路径的歧义:
- name: 导入外部目录下的所有变量文件 ansible.builtin.include_vars: dir: "{{ playbook_dir }}/../vars/external_vars" # 可选:如果你的变量文件有特定扩展名,可指定过滤,比如yml/yaml extensions: ['yml', 'yaml']
2. 在playbook层通过find批量导入
如果想在playbook级别一次性加载所有外部变量,可以先通过find模块找到所有文件,再循环导入:
--- - hosts: localhost pre_tasks: - name: 查找外部变量目录下的所有文件 ansible.builtin.find: path: "../vars/external_vars" file_type: file register: external_var_files - name: 批量导入所有变量文件 ansible.builtin.include_vars: file: "{{ item.path }}" loop: "{{ external_var_files.files }}" roles: - role: roles/users
3. 配置Ansible变量加载路径(可选)
修改ansible.cfg,添加或调整vars_plugins_enabled配置,或者将external_vars目录移动到playbooks/vars下,让Ansible自动加载该目录的变量文件。不过这个方法需要调整现有目录结构,适合长期优化。
内容的提问来源于stack exchange,提问作者Bayden
相关产品推荐
相关产品推荐

