我想在 Ubuntu netplan yaml 文件中将 DNS IP 地址从 192.168.86.14 更改为 192.168.86.16:
link: ens3
addresses: [192.168.86.12/24]
gateway4: 192.168.86.1
nameservers:
addresses: [192.168.86.14,8.8.8.8,8.8.4.4]
这是我的 ansible 剧本:
- name: test
ansible.builtin.replace:
path: /etc/netplan/00-installer-config.yaml
regexp: '(addresses: \[)+192.168.86.14,'
replace: '\1192.168.86.16,'
我的剧本没有更改文件中的任何内容。尝试转义逗号,但也不匹配任何内容。
出于某种原因,我需要确保 IP 地址位于“addresses [”和“,”之间,所以我不能只使用这样的语法:
- name: test
ansible.builtin.replace:
path: /etc/netplan/00-installer-config.yaml
regexp: '192.168.86.14'
replace: '192.168.86.16'
我对 Ansible 非常陌生,非常感谢任何帮助!
最佳答案
YAML 中的字典是不可变的。但是,您可以在 Jinja2 中更新词典。让我们看一个完整的 netplan 配置文件示例,例如
shell> cat 00-installer-config.yaml
network:
version: 2
renderer: networkd
ethernets:
ens3:
mtu: 9000
enp3s0:
link: ens3
addresses: [192.168.86.12/24]
gateway4: 192.168.86.1
nameservers:
addresses: [192.168.86.14,8.8.8.8,8.8.4.4]
将字典读入变量
- include_vars:
file: 00-installer-config.yaml
name: netplan_conf
给出
netplan_conf:
network:
ethernets:
enp3s0:
addresses:
- 192.168.86.12/24
gateway4: 192.168.86.1
link: ens3
nameservers:
addresses:
- 192.168.86.14
- 8.8.8.8
- 8.8.4.4
ens3:
mtu: 9000
renderer: networkd
version: 2
创建更新名称服务器的模板
shell> cat 00-installer-config.yaml.j2
{% set _dummy = netplan_conf.network.ethernets.enp3s0.nameservers.update({'addresses': _addresses}) %}
{{ netplan_conf|to_nice_yaml }}
下面的任务
- template:
src: 00-installer-config.yaml.j2
dest: 00-installer-config.yaml
vars:
_addresses: "{{ netplan_conf.network.ethernets.enp3s0.nameservers.addresses|
regex_replace('192.168.86.14', '192.168.86.16') }}"
将更新配置文件
shell> cat 00-installer-config.yaml
network:
ethernets:
enp3s0:
addresses:
- 192.168.86.12/24
gateway4: 192.168.86.1
link: ens3
nameservers:
addresses:
- 192.168.86.16
- 8.8.8.8
- 8.8.4.4
ens3:
mtu: 9000
renderer: networkd
version: 2
关于regex - Ansible 正则表达式替换 Ubuntu netplan 文件中的 DNS 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70705707/