如何通过local.yml的列表变量获取vars.yml中对应值(Ansible)
解决Ansible中通过列表迭代调用对应变量的问题
问题场景
我在local.yml中通过列表传递变量给角色:
roles: - role: book vars: data: - 'std1' - 'std2'
vars.yml中的变量定义如下:
book_data: "std1": "std1" "std2": "std2" "std1": - '1a' - '1b' "std2": - '2a' - '2b'
需要遍历local.yml里的data列表,打印vars.yml中对应变量的值(比如std1对应['1a','1b'],std2对应['2a','2b']),但当前代码只能打印字符串本身:
- name: set fact set_fact: standard: "{{ lookup('list', data) }}" - name: get standard debug: msg="{{ item }}" with_items: "{{ standard }}"
要求不直接在playbook中引用vars/main.yml里的变量,通过local.yml的迭代实现需求。
解决方案
利用Ansible的vars查找插件,通过变量名动态获取对应值,修改后的playbook代码如下:
- name: 动态获取对应变量的值 debug: msg: "{{ lookup('vars', item) }}" loop: "{{ data }}"
说明
- 直接用
loop遍历local.yml传入的data列表,无需额外设置fact lookup('vars', item)会根据列表中的每个元素(变量名),动态拉取vars.yml中对应的变量值
执行后预期输出:
ok: [localhost] => (item=std1) => { "msg": [ "1a", "1b" ] } ok: [localhost] => (item=std2) => { "msg": [ "2a", "2b" ] }
如果需要把所有对应值整合为一个变量集合,可使用set_fact实现:
- name: 收集所有对应变量的值 set_fact: standard_data: "{{ standard_data | default([]) + [lookup('vars', item)] }}" loop: "{{ data }}" - name: 打印收集到的结果 debug: msg: "{{ standard_data }}"
执行后输出整合后的列表:
ok: [localhost] => { "msg": [ [ "1a", "1b" ], [ "2a", "2b" ] ] }
内容的提问来源于stack exchange,提问作者manish gonnade
相关产品推荐
相关产品推荐

