如何用Ansible清空YAML文件repository节点并添加新条目?
Ansible YAML文件编辑:清空指定节点并添加新内容
需求说明
我是Ansible新手,需要编辑YAML文件,原文件结构如下:
Test-ABC: artifact: Test-ABC repository: Test-1: name: Test123 release: 2024 version: 1.1.0 type: a Test-2: name: Test456 release: 2023 version: 2.0.1 type: bs
需要完成两个操作:
- 清空
repository:下的所有条目,得到如下结果:
Test-ABC: artifact: Test-ABC repository:
- 通过预定义的输入参数添加新内容,最终示例:
Test-ABC: artifact: Test-ABC repository: New-Test: name: newTest123 release: new2024 version: new1.1.0 type: new a
注意:文件中其他条目不能被修改
遇到的问题
我尝试用regexp和replace模块实现,但错误删除了Test-ABC行,使用的代码如下:
- name: "remove entries" replace: path: "file.yaml" regexp: "^\\s*{{ item.key }}:.*$" replace: "" loop: "{{ file['repository'] | dict2items }}"
解决方案
方案一:直接操作YAML结构(推荐,规避正则风险)
正则处理YAML容易出现缩进、格式错误,建议通过Ansible的YAML解析能力直接操作数据结构:
- 读取并解析YAML文件
- name: 读取目标YAML文件 slurp: path: file.yaml register: yaml_raw_content - name: 将文件内容解析为字典 set_fact: yaml_data: "{{ yaml_raw_content.content | b64decode | from_yaml }}"
- 清空
Test-ABC下的repository节点
- name: 清空repository下的所有条目 set_fact: yaml_data: "{{ yaml_data | combine({'Test-ABC': {'repository': {}}}, recursive=True) }}"
- 添加预定义的新内容(假设新内容存于
new_repo_entries变量)
预先定义新内容变量:
new_repo_entries: New-Test: name: newTest123 release: new2024 version: new1.1.0 type: new a
执行添加操作:
- name: 添加新的repository条目 set_fact: yaml_data: "{{ yaml_data | combine({'Test-ABC': {'repository': new_repo_entries}}, recursive=True) }}"
- 将修改后的内容写回文件
- name: 保存修改后的YAML文件 copy: content: "{{ yaml_data | to_yaml(indent=2) }}" dest: file.yaml
方案二:修复正则替换(仅作参考)
如果坚持使用正则,需要精准匹配repository:下的子条目,避免误删其他内容:
- name: 清空repository下的子条目 replace: path: file.yaml regexp: '(?<=^\s*repository:\n)(^\s{6,}.*\n)+' replace: ''
正则说明:通过正向断言锁定repository:行,仅删除其下缩进≥6个空格的子条目行
之后用blockinfile模块添加新内容:
- name: 添加新的repository条目 blockinfile: path: file.yaml marker: "# {mark} ANSIBLE MANAGED REPOSITORY" insertafter: '^\s*repository:' block: | {{ new_repo_entries | to_yaml(indent=6) | indent(0) }}
注意事项
- 优先选择方案一,直接操作YAML字典能避免格式混乱和误删风险
- 确保预定义变量的缩进风格与原文件一致
- 操作前建议备份原文件,防止数据丢失
内容的提问来源于stack exchange,提问作者serkan45
相关产品推荐
相关产品推荐

