Ansible循环提取YAML键值原地替换目标文件对应配置值
Ansible 类HTML配置原地批量替换实现方案
核心实现思路
基于你已经通过include_vars把YAML配置完整导入到config_vars变量的前提,直接使用Ansible原生的ansible.builtin.replace模块做逐行正则匹配替换,通过循环遍历所有YAML键值对完成批量更新,完全满足提出的三点要求。
可直接复用的Playbook任务段
衔接已有的YAML导入任务,新增如下任务即可:
# 已验证可用的YAML导入任务 - name: Full import of the config.yaml file so that the desired variables are populated. include_vars: file: ~/config.yaml name: config_vars # 新增的批量替换任务 - name: 批量更新目标配置文件取值 ansible.builtin.replace: path: /path/to/your/target/config.file # 替换为实际要修改的类HTML配置文件的绝对路径 regexp: '(<{{ item.key }}(\s+)value=")[^"]*("\/>)' replace: '\1{{ item.value }}\3' loop: "{{ config_vars | dict2items }}"
方案说明
- 正则逻辑说明:正则通过捕获组保留配置键名和
value=之间的所有原有空白字符,仅匹配替换双引号内的原有取值,既不会改动原有排版间距,也能确保不管原有value里填了什么内容,都会被完全替换成YAML中定义的新值,无残留字符。 - 原地修改保证:
replace模块仅修改命中正则规则的行,所有非配置行(包括分段标识、注释、空行、未在YAML中定义的配置项)完全不会被改动,不存在全量重写文件的问题,文件原有内容完整性100%保留。 - 自动适配能力:循环通过
dict2items过滤器将导入的YAML配置字典转为键值对列表遍历,无论有多少组配置项都能自动匹配处理,后续新增配置只需要更新YAML文件即可,无需修改Playbook代码。
注意事项
如果YAML中定义的配置值本身包含双引号字符,提前在YAML文件中对双引号做反斜杠转义即可;常规的端口号、网卡名、数字类取值不需要额外处理,直接写在YAML中即可正常替换。
内容的提问来源于stack exchange,提问作者Viscosity
相关产品推荐
相关产品推荐

