如何无需在Playbook中指定vars_file加载Ansible角色变量
解决方案
核心问题是你当前依赖外部传入的vars_file变量加载动态生成的文件,且未利用Ansible角色的内置路径变量。通过以下调整可实现仅调用角色无需传参:
1. 固定变量文件加载路径
在角色的tasks/main.yml中,用Ansible内置的{{ role_path }}变量替代外部传入的vars_file——这个变量会自动指向当前角色的根目录,无需手动指定路径。
2. 确保变量文件生成成功后再加载
添加文件存在性检查,避免因脚本执行失败导致后续任务报错。
修改后的角色tasks/main.yml
- name: Generate VM variables file script: generate_vm_vars.sh 2 register: gen_vars_result - name: Verify vars file exists stat: path: "{{ role_path }}/vars/vars_vm.yml" register: vars_file_check - name: Abort if vars file not generated fail: msg: "Failed to generate vars_vm.yml via script" when: not vars_file_check.stat.exists - name: Load VM deployment variables include_vars: "{{ role_path }}/vars/vars_vm.yml" - name: Debug loaded variables debug: var: vars_vm - name: Deploy VMware virtual machine vmware_deploy_ovf: hostname: "********" username: "admin" password: "********" validate_certs: False state: present name: "{{ item.vm_name }}" ovf: "{{ path }}" wait_for_ip_address: true power_on: no datastore: "{{ store }}" network: "{{ network }}" with_items: "{{ vars_vm }}"
简化后的Playbook
现在你的Playbook可以直接写成期望的样子,无需任何额外参数:
--- - hosts: localhost gather_facts: no roles: - vm
为什么这样可行
{{ role_path }}是Ansible自动提供的内置变量,不管角色部署在哪个路径下,都能精准定位到角色的vars目录。- 先执行脚本生成文件,再通过
stat模块验证文件存在,确保后续加载变量的任务不会因文件缺失失败。 - 移除了原有的
name: foo参数,直接加载变量文件,让vars_vm变量直接进入当前任务作用域,后续的with_items可以直接引用。
内容的提问来源于stack exchange,提问作者Olivier
相关产品推荐
相关产品推荐

