如何在Ansible中基于指定变量生成嵌套列表格式的自定义Fact?
如何在Ansible中基于给定变量生成目标自定义Fact?
完全可以实现这个需求,以下是具体的实现方案:
原变量结构
nodes: - name: fin hosts: 2 - name: swe hosts: 1
实现Playbook
方法一:原生Ansible语法(无需额外集合)
- name: 生成目标自定义Fact hosts: localhost vars: nodes: - name: fin hosts: 2 - name: swe hosts: 1 tasks: - name: 初始化空字典存储结果 set_fact: target_facts: {} - name: 循环生成每个节点的主机条目 set_fact: target_facts: "{{ target_facts | combine({ item.name: [ {'name': '%s%d' % (item.name, num)} for num in range(1, item.hosts + 1) ] }) }}" loop: "{{ nodes }}" - name: 验证生成的自定义Fact debug: var: target_facts
方法二:使用community.general集合简化写法
如果你的环境已安装community.general集合,可使用更简洁的语法:
- name: 生成目标自定义Fact hosts: localhost vars: nodes: - name: fin hosts: 2 - name: swe hosts: 1 tasks: - name: 初始化空字典存储结果 set_fact: target_facts: {} - name: 循环生成每个节点的主机条目 set_fact: target_facts: "{{ target_facts | combine({ item.name: range(1, item.hosts + 1) | map('format', '%s%%d' % item.name) | map('community.general.dict_kv', 'name') | list }) }}" loop: "{{ nodes }}" - name: 验证生成的自定义Fact debug: var: target_facts
执行结果
运行上述Playbook后,target_facts变量将生成完全符合需求的结构:
fin: - name: fin1 - name: fin2 swe: - name: swe1
若需要将结果设置为持久化自定义Fact供后续Playbook使用,可在set_fact任务中添加cacheable: yes参数。
内容的提问来源于stack exchange,提问作者Daniel Kupfer
相关产品推荐
相关产品推荐

