Ansible如何通过变量名模式匹配动态生成字典列表
Ansible按名称模式匹配变量生成字典列表的实现方式
Ansible完全支持按变量名模式匹配查询变量,不需要修改原有变量定义,常用的两种实现方式如下:
方式1:使用varnames查询插件直接筛选
这种方式代码最简洁,不需要额外依赖第三方集合:
- name: 生成匹配规则的动态列表 hosts: localhost vars: # 原有定义的变量无需修改 item_1a: name: first test item value: 100 item_2a: name: second test item value: 200 options: extra item_zz: name: last test item option: nameless # 动态生成目标列表 dynamic_list: >- {{ hostvars[inventory_hostname].keys() | select('match', '^item_.*') | map('extract', hostvars[inventory_hostname]) | list }} tasks: - name: 验证生成结果 ansible.builtin.debug: var: dynamic_list
注意点
你需求里写的正则^item_*存在语法问题,它实际匹配的是ite开头、后接任意数量m的变量名,要匹配所有item_开头的变量,正则需要写成^item_.*。
方式2:使用vars lookup + 过滤器组合
如果需要同时处理多主机的变量,可以用这种方式:
dynamic_list: >- {{ lookup('vars', *query('varnames', '^item_.*')) | list }}
两种方式输出的结果完全符合你需要的dynamic_list结构。
内容的提问来源于stack exchange,提问作者J. M. Becker
相关产品推荐
相关产品推荐

