用于替换 Ubuntu netplan 文件中的 DNS 地址的 Ansible 正则表达式

Ansible regex to replace the DNS address in Ubuntu netplan file

我想在 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: '92.168.86.16,'

我的剧本没有更改文件中的任何内容。试图转义逗号,但也不匹配任何内容。

出于某种原因,我需要确保 IP 地址在“地址 [”和“,”之间,所以我不能只使用这样的语法:

 - 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