Ansible replace模块复制替换值
问题:Ansible 2.9将在替换模块的“替换:”字段中重复条目 要更改的文件(/etc/netplan/50 cloud init.yaml): 代码: 结果:Ansible replace模块复制替换值,replace,ansible,duplicates,netplan,Replace,Ansible,Duplicates,Netplan,问题:Ansible 2.9将在替换模块的“替换:”字段中重复条目 要更改的文件(/etc/netplan/50 cloud init.yaml): 代码: 结果: 如果原始文件只有一个条目,如“-10.10.8.110”,则“之后”和“之前”之间的章节将被替换。但是,如果再次运行,Expansable将复制条目 再次运行脚本后,文件内容将如下所示: network: ethernets: ens160: addresses: - 10.10.8.11
- 如果原始文件只有一个条目,如“-10.10.8.110”,则“之后”和“之前”之间的章节将被替换。但是,如果再次运行,Expansable将复制条目
network:
ethernets:
ens160:
addresses:
- 10.10.8.112/24
gateway4: 10.10.8.1
nameservers:
addresses:
- 10.10.8.110
- 10.10.8.111
search:
- server.com
optional: true
- 10.10.8.110
- 10.10.8.111
search:
- server.com
optional: true
version: 2
我相信这与幂等性有关,并且可以用正则表达式来修正。然而,我不知道如何做到这一点。我要做的就是始终替换介于after和before之间的所有值
我怎样才能做到这一点呢?我不会指望在
之前和之后,而是构建一个与我要查找的内容完全匹配的regexp,并替换为反向引用。类似以下内容(不是性感而是功能性的)
-名称:调整yaml文件
替换:
路径:/etc/netplan/50-cloud-init.yaml
regexp:>-
(^\s*名称服务器:\n\s*地址:\n)[\s\s]*(版本:2)$
替换:|-
\g-10.10.8.110
- 10.10.8.111
搜索:
-server.com
可选:true\g
同时,请注意,由于您的文件是yaml,因此有其他方法可以更简单地修改数据(合并
对象等)
- name: Check yaml has correct DNS values
hosts: guest
gather_facts: yes
become: yes
tasks:
- name: Adjust yaml file
replace:
path: /etc/netplan/50-cloud-init.yaml
after: ' addresses:'
before: ' version: 2'
regexp: '^(.+)$'
replace: ' - 10.10.8.110\n - 10.10.8.111\n search:\n - server.com\n optional: true'
network:
ethernets:
ens160:
addresses:
- 10.10.8.112/24
gateway4: 10.10.8.1
nameservers:
addresses:
- 10.10.8.110
- 10.10.8.111
search:
- server.com
optional: true
- 10.10.8.110
- 10.10.8.111
search:
- server.com
optional: true
version: 2