使用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
相关产品推荐
相关产品推荐

