Ansible子目录剧本无法读取group_vars变量问题求助
解决Ansible剧本树形存储时变量找不到的问题
问题原因
Ansible默认会从当前工作目录和inventory文件所在目录搜索group_vars/host_vars。你从项目根目录执行命令时,尽管当前目录是根目录,但剧本位于子目录时,Ansible的变量搜索逻辑未正确关联到根目录的group_vars,导致找不到my_var。
解决方案
方案1:配置项目级ansible.cfg(推荐)
在项目根目录my-project下创建ansible.cfg文件,明确指定inventory和变量搜索路径,让Ansible无论剧本在哪个子目录都能正确加载变量:
[defaults] # 指定默认inventory文件路径 inventory = inventories/production.yml # 指定group_vars的目录 group_vars = group_vars # 可选:指定host_vars目录 host_vars = host_vars
之后执行剧本时,直接从项目根目录运行:
ansible-playbook playbooks/subdir1/my-playbook.yml
甚至可以进入子目录执行:
cd playbooks/subdir1 && ansible-playbook my-playbook.yml
都能正常加载根目录的group_vars。
方案2:执行命令时指定变量路径
如果不想创建配置文件,执行命令时通过环境变量指定group_vars的路径:
ANSIBLE_GROUP_VARS_PATH=./group_vars ansible-playbook -i inventories/production.yml playbooks/subdir1/my-playbook.yml
方案3:在剧本中直接引入变量文件(不推荐,灵活性差)
在my-playbook.yml中通过vars_files直接引入根目录的变量文件:
- name: 示例剧本 hosts: my_group vars_files: - ../../group_vars/my_group/vars.yml tasks: - name: 使用变量 debug: msg: "{{ my_var }}"
这种方式的缺点是,当剧本目录结构变化时,需要手动调整相对路径,维护成本高。
内容的提问来源于stack exchange,提问作者pécé
相关产品推荐
相关产品推荐

