如何通过外部变量指定Ansible循环使用的目标字典?
问题描述
我定义了如下两个字典变量:
example1: [ { value1: "path", value2: "path2" }, ] example2: [ { value1: "path3", value2: "path4" }, ]
在Ansible的playbook.yaml中,我设置了变量choose_dict来指定要使用的字典:
- name: echodict hosts: localhost vars: choose_dict: example1 roles: - /home/user/ansible/roles/dicttest
在角色的dicttest.yml任务里,我尝试循环这个变量,但结果只输出字符串example1,而非对应的字典内容:
- name: loopdict ansible.builtin.command: "echo {{ item }}" register: test loop: - "{{ choose_dict }}" - debug: msg: "{{ test }}"
请问能否通过外部变量选择example1或example2,实现对对应字典的循环操作?
解决方法
可以通过以下几种方式实现通过变量名动态引用字典:
方法1:使用vars查找插件
直接用lookup('vars', choose_dict)获取变量对应的字典内容,修改任务如下:
- name: loopdict ansible.builtin.command: "echo {{ item.value1 }} {{ item.value2 }}" register: test loop: "{{ lookup('vars', choose_dict) }}" - debug: msg: "{{ test.results | map(attribute='stdout') | list }}"
这样循环的就是目标字典里的每一个元素,而非字符串example1。
方法2:将字典放在父字典中
把example1和example2归入一个父字典,通过键名直接引用,结构更清晰:
首先修改变量定义:
dict_collection: example1: - { value1: "path", value2: "path2" } example2: - { value1: "path3", value2: "path4" }
然后在playbook中指定要选择的键:
vars: choose_dict: example1
任务中直接引用父字典的对应键:
- name: loopdict ansible.builtin.command: "echo {{ item.value1 }} {{ item.value2 }}" register: test loop: "{{ dict_collection[choose_dict] }}" - debug: msg: "{{ test.results | map(attribute='stdout') | list }}"
方法3:使用hostvars(适用于主机变量场景)
如果变量定义在主机vars中,可通过hostvars[inventory_hostname][choose_dict]引用:
- name: loopdict ansible.builtin.command: "echo {{ item.value1 }} {{ item.value2 }}" register: test loop: "{{ hostvars[inventory_hostname][choose_dict] }}"
内容的提问来源于stack exchange,提问作者Vauler
相关产品推荐
相关产品推荐

