可靠的替换模块重复替换值



问题:Ansible 2.9将在"替换:";替换模块的字段。

要更改的文件(/etc/netplan/50-cloud-init.yaml(:

network:
ethernets:
ens160:
addresses:
- 10.10.8.112/24
gateway4: 10.10.8.1
nameservers:
addresses:
- 10.10.8.15
version: 2

代码:

- 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.110n                - 10.10.8.111n                search:n                - server.comn            optional: true'

结果:

  • 如果原始文件只有一个条目,那么说"-10.10.8.110";,将在";在";以及";在"之前";。但是,如果再次运行,expansible将复制条目

再次运行脚本后,文件内容将如下所示:

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之间的所有值。

我怎样才能做到这一点?

我不会指望beforeafter,而是构建一个与我想要的完全匹配的正则表达式,并用反向引用替换。类似以下的东西(不性感,但功能(


- name: Adjust yaml file
replace:
path: /etc/netplan/50-cloud-init.yaml
regexp: >-
(^s*nameservers:ns*addresses:n)[Ss]*(version: 2)$
replace: |-
g<1>           - 10.10.8.110
- 10.10.8.111
search:
- server.com
optional: trueg<2>

同时,请注意,由于您的文件是yaml,因此还有其他更简单的方法来修改数据(combine对象等(。

您使用的代码是正确的,您只需要删除或beforeafter,如果同时使用它们,文本将被插入2次。

您需要执行类似操作(在之前删除(:

- 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:'
regexp: '^(.+)$'
replace: '                - 10.10.8.110n                - 10.10.8.111n                search:n                - server.comn            optional: true'

最新更新