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

标签 regex ubuntu ansible

我想在 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/

相关文章:

.net - 使用 .NET 中的 RegEx 规范化 Windows 路径或 URI

ubuntu - Redis 踢出空/空白 pid 文件

docker - ansible即使安装了也找不到python包

ubuntu - 如何在 Ubuntu 上设置系统范围的代理?

amazon-web-services - Ansible - 包含来自远程主机的 vars 文件

ssh - "vagrant provision"有效,但我无法使用 Ansible 发送临时命令

html - 为原子中的结束标记设置颜色

c# - 正则表达式/linq 用计数替换连续字符

javascript - 如何在 JavaScript 中将字符串限制为一组特定的字符?

java - 如何从 Java 应用程序远程执行 Hadoop 命令