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

如何用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解析能力直接操作数据结构:

  1. 读取并解析YAML文件
- name: 读取目标YAML文件
  slurp:
    path: file.yaml
  register: yaml_raw_content

- name: 将文件内容解析为字典
  set_fact:
    yaml_data: "{{ yaml_raw_content.content | b64decode | from_yaml }}"
  1. 清空Test-ABC下的repository节点
- name: 清空repository下的所有条目
  set_fact:
    yaml_data: "{{ yaml_data | combine({'Test-ABC': {'repository': {}}}, recursive=True) }}"
  1. 添加预定义的新内容(假设新内容存于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) }}"
  1. 将修改后的内容写回文件
- 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 04:25:08