You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 00:15:01