问题: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之间的所有值。
我怎样才能做到这一点?
我不会指望before
和after
,而是构建一个与我想要的完全匹配的正则表达式,并用反向引用替换。类似以下的东西(不性感,但功能(
- 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
对象等(。
您使用的代码是正确的,您只需要删除或before
或after
,如果同时使用它们,文本将被插入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'