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

使用Ansible yedit修改YAML字典列表失败,求正确实现方式

解决Ansible yedit模块修改字典列表类型YAML的问题

问题背景

你有一个包含字典列表的YAML文件,结构如下:

INSTANCES:
  - NAME: hosttype1
    HOST_NAME: mysevername1
  - NAME: hosttype2
    HOST_NAME: myservername2
  - NAME: hosttype2
    HOST_NAME: myservername3

尝试用Ansible的yedit模块修改其中的NAME和HOST_NAME字段,编写的任务代码如下:

- name: Update property file {{ environment_env_property_file }} 
  yedit:
    src: "{{ environment_env_property_file }}"
    state: present
    edits:
    - key: INSTANCES.NAME[0]
      value: "CM01"
    - key: INSTANCES.NAME[0].HOST_NAME
      value: "ap-2001c.domain.net"
    - key: INSTANCES.NAME[1]
      value: "BP01"
    - key: INSTANCES.NAME[1].HOST_NAME
      value: "ap-2002c.domain.net"
    - key: INSTANCES.NAME[2]
      value: "BP01"
    - key: INSTANCES.NAME[2].HOST_NAME
      value: "ap-2003c.domain.net"

执行任务时出现报错:

An exception occurred during task execution. To see the full traceback, use -vvv. The error was: main.YeditException: Unexpected item type found while going through key path: INSTANCES.NAME[0] (at key: NAME)

你疑问:修改该字典列表的正确方式是什么?自己猜测的以下写法是否正确?

- key: INSTANCES[0].NAME
  value: "hosttype1"
- key: INSTANCES[0].HOST_NAME
  value: "myservername1"
- key: INSTANCES[1].NAME
  value: "hosttype2"
- key: INSTANCES[1].HOST_NAME
  value: "myservername2"
- key: INSTANCES[2].NAME
  value: "hosttype3"
- key: INSTANCES[2].HOST_NAME
  value: "myservername3"

解答

你猜测的写法是完全正确的。

错误原因解析

之前的代码路径逻辑错误:INSTANCES是一个列表类型,列表中的每个元素才是包含NAME和HOST_NAME的字典。你试图用INSTANCES.NAME[0]直接访问,但INSTANCES本身并没有NAME这个顶层键,yedit模块无法解析这种错误路径,因此抛出类型异常。

正确的任务代码

修正路径后的完整Ansible任务如下:

- name: Update property file {{ environment_env_property_file }} 
  yedit:
    src: "{{ environment_env_property_file }}"
    state: present
    edits:
    - key: INSTANCES[0].NAME
      value: "CM01"
    - key: INSTANCES[0].HOST_NAME
      value: "ap-2001c.domain.net"
    - key: INSTANCES[1].NAME
      value: "BP01"
    - key: INSTANCES[1].HOST_NAME
      value: "ap-2002c.domain.net"
    - key: INSTANCES[2].NAME
      value: "BP01"
    - key: INSTANCES[2].HOST_NAME
      value: "ap-2003c.domain.net"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 01:43:19