ansible -网络计划配置名称服务器地址的regexp

rkkpypqq  于 2023-03-24  发布在  其他
关注(0)|答案(3)|浏览(130)

我正在尝试编辑netcfg.yaml并更新名称服务器地址:
目前它有这个:

version: 2
  renderer: networkd
  ethernets:
    enp0s3:
     dhcp4: no
     addresses: [192.168.1.222/24]
     gateway4: 192.168.1.1
     nameservers:
       addresses: [8.8.8.8,8.8.4.4]

我可以用lineinfile编辑所有的行,除了上面的最后一行:addresses: [8.8.8.8.,8.8.4.4]
我试过这个:
regexp:'地址:[[0-9]{1}[.][0-9]{1}[.][0-9]{1}[.][0-9]{1}]'
Ansible playbook没有显示任何错误,但它没有识别它来修改值。

e4eetjau

e4eetjau1#

您的模式是地址之间缺少逗号,,您可以尝试以下模式:
addresses: \[(\d\.\d\.\d\.\d\,?)*\]
参见here演示。

c2e8gylq

c2e8gylq2#

您可以编写转义第一个\[的模式,并可选地重复匹配,,后跟数字和点。
如果要匹配1个或多个数字,可以使用\d+

\baddresses: \[\d\.\d\.\d\.\d(?:,\d\.\d\.\d\.\d)*]

说明

  • \baddresses: \[匹配单词addresses后跟: [
  • \d\.\d\.\d\.\d匹配4个数字,中间带一个点
  • (?:,\d\.\d\.\d\.\d)*可选重复匹配,和前一个模式
  • ]逐字匹配

参见regex demo

jbose2ul

jbose2ul3#

通过 regex 更新此类文件中的IP是非常危险的。在这个简单的例子中有两个属性 addresses。读取YAML字典,更新并写回它会更实用。
声明要更新的内容。例如,从 ethernets 更新每个接口中的名称服务器的地址

ethernets_update:
    nameservers:
      addresses: [127.0.0.53, 8.8.8.8, 8.8.4.4]

给定用于测试的(固定)文件

shell> cat /tmp/netcfg.yaml 
network:
  version: 2
  renderer: networkd
  ethernets:
    enp0s3:
      dhcp4: no
      addresses: [192.168.1.222/24]
      gateway4: 192.168.1.1
      nameservers:
        addresses: [8.8.8.8,8.8.4.4]

声明变量

netcfg: "{{ netcfg_yaml.content|b64decode|from_yaml }}"

然后读文件

- slurp:
        src: /tmp/netcfg.yaml
      register: netcfg_yaml

给予

netcfg:
    network:
      ethernets:
        enp0s3:
          addresses: [192.168.1.222/24]
          dhcp4: false
          gateway4: 192.168.1.1
          nameservers:
            addresses: [8.8.8.8, 8.8.4.4]
      renderer: networkd
      version: 2

更新字典

ethernets: "{{ dict(netcfg.network.ethernets.keys()|
                      zip(netcfg.network.ethernets.values()|
                          product([ethernets_update])|map('combine'))) }}"
  netcfg_update: "{{ [netcfg, {'network': {'ethernets': ethernets}}]|
                     combine(recursive=true) }}"

给予

netcfg_update:
    network:
      ethernets:
        enp0s3:
          addresses: [192.168.1.222/24]
          dhcp4: false
          gateway4: 192.168.1.1
          nameservers:
            addresses: [127.0.0.53, 8.8.8.8, 8.8.4.4]
      renderer: networkd
      version: 2

写入文件

- copy:
        dest: /tmp/netcfg.yaml
        content: |
          {{ netcfg_update|to_yaml }}

给予

shell> cat /tmp/netcfg.yaml 
network:
  ethernets:
    enp0s3:
      addresses: [192.168.1.222/24]
      dhcp4: false
      gateway4: 192.168.1.1
      nameservers:
        addresses: [127.0.0.53, 8.8.8.8, 8.8.4.4]
  renderer: networkd
  version: 2

完整的测试行动手册示例

- hosts: localhost

  vars:

    ethernets_update:
      nameservers:
        addresses: [127.0.0.53, 8.8.8.8, 8.8.4.4]

    netcfg: "{{ netcfg_yaml.content|b64decode|from_yaml }}"
    ethernets: "{{ dict(netcfg.network.ethernets|dict2items|map(attribute='key')|
                        zip(netcfg.network.ethernets|dict2items|map(attribute='value')|
                            product([ethernets_update])|map('combine'))) }}"

    netcfg_update: "{{ [netcfg, {'network': {'ethernets': ethernets}}]|
                       combine(recursive=true) }}"

  tasks:

    - slurp:
        src: /tmp/netcfg.yaml
      register: netcfg_yaml
    - debug:
        var: netcfg

    - debug:
        var: ethernets
    - debug:
        var: netcfg_update|to_yaml

    - copy:
        dest: /tmp/netcfg.yaml
        content: |
          {{ netcfg_update|to_yaml }}

相关问题