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

如何在Ansible中解析Shell返回的YAML数组并生成Fact变量

解决Ansible动态创建目标变量的问题

我来帮你搞定这个需求!咱们可以通过Ansible的过滤器和循环来实现动态创建destinationX_name和destinationX_id这类变量,具体步骤如下:

核心思路

  1. 先把命令输出的YAML字符串转换成Ansible可操作的结构化数据(用from_yaml过滤器)
  2. 把destinations下的数字键值对转换成可遍历的列表(用dict2items过滤器)
  3. 遍历每个目标项,用动态变量名的方式创建你需要的变量

完整Playbook示例

- name: list backup destinations
  command: 'mycommand'
  register: result

- name: Process backup destinations into individual variables
  set_fact:
    "destination{{ item.key }}_name": "{{ item.value.name }}"
    "destination{{ item.key }}_id": "{{ item.value._id }}"
  loop: "{{ (result.stdout | from_yaml).data.destinations | dict2items }}"
  # dict2items会把{0: {...}, 1: {...}}格式的字典转成[{"key":0, "value":{...}}, ...]的列表,方便循环

- name: Verify the created variables (optional)
  debug:
    var: "{{ item }}"
  loop:
    - destination0_name
    - destination0_id
    - destination1_name
    - destination1_id

关键细节说明

  • from_yaml过滤器:把命令返回的stdout字符串解析成YAML结构,这样我们就能直接访问data.destinations这类层级数据了
  • dict2items过滤器:因为你的destinations是用数字作为键的字典(不是标准数组),这个过滤器能把它转换成便于循环的键值对列表
  • 动态变量名:在set_fact里用双引号包裹变量名,结合item.key就能生成destination0_name这种格式的变量名

执行这个Playbook后,你就能得到期望的变量:

  • destination0_name: backup1
  • destination0_id: 5f7de84eab8cee6deb0795a2
  • destination1_name: backup2
  • destination1_id: 5f7de850e4ef1d17520fee82

如果你的destinations实际是标准YAML数组(比如- {_id: ..., name: ...}),那可以去掉dict2items,直接遍历(result.stdout | from_yaml).data.destinations,然后用{{ loop.index0 }}来获取索引(0、1...)。

内容的提问来源于stack exchange,提问作者Darwick

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 14:42:44