如何使用 yq 更改 yaml 中的 dns 服务器?

如何使用 yq 更改 yaml 中的 dns 服务器?

这是我的 yaml 文件:

network:
  ethernets:
    ens160:
      addresses:
      - 10.200.2.148/22
      gateway4: 10.200.0.1
      nameservers:
        addresses:
        - 1.1.1.1
        - 2.2.2.2
        - 3.3.3.3
        - 4.4.4.4
        search:
        - our.domain

我需要将ens160下的所有dns地址替换为两个特定地址。尝试使用这个:

yq write -i /etc/netplan/00-installer-config.yaml  '.network.ethernets.ens160.nameservers.addresses' ['10.10.10.53','10.10.10.54']

但所做的只是将所有列表项转移到一个列表中,如下所示:

network:
  ethernets:
    ens160:
      addresses:
        - 10.200.2.148/22
      gateway4: 10.200.0.1
      nameservers:
        addresses:
          - 1.1.1.1
          - 2.2.2.2
          - 3.3.3.3
          - 4.4.4.4
        search:
          - our.domain

我不想那样。我需要输出看起来像这样

network:
  ethernets:
    ens160:
      addresses:
      - 10.200.2.148/22
      gateway4: 10.200.0.1
      nameservers:
        addresses:
        - 10.10.10.53
        - 10.10.10.54
        search:
        - our.domain

目前还不清楚我如何做到这一点yq,我怎样才能做到这一点?

答案1

无论出于何种原因,我根本无法让 apt 存储库中的版本正常工作。

我最终安装了最新版本,它可以使用此命令

yq -i '.network.ethernets.ens160.nameservers.addresses = ["10.10.10.53","10.10.10.54"]' /etc/netplan/00-installer-config.yaml

答案2

不太熟悉迈克·法拉赫yq,我可能会通过环境变量传入新名称服务器地址的 JSON 数组,然后使用以下命令将其插入到文档中的正确路径中env()

$ addrs='["10.10.10.53","10.10.10.54"]' yq '.network.ethernets.ens160.nameservers.addresses = env(addrs)' file
network:
  ethernets:
    ens160:
      addresses:
        - 10.200.2.148/22
      gateway4: 10.200.0.1
      nameservers:
        addresses: ["10.10.10.53", "10.10.10.54"]
        search:
          - our.domain

添加-i“就地”进行转换的选项,并用于-P漂亮地打印输出(这会将数组展开到几行,如问题中的预期输出所示)。

据我所知, Mike Farahyq不能将任意数量的单独参数作为数组而不将它们编码为 JSON 数组,如上面的命令所示。和安德烈·基斯柳克yq,它是众所周知的jqJSON 处理器的包装器,人们可以这样做:

$ yq -y '.network.ethernets.ens160.nameservers.addresses = $ARGS.positional' file --args 10.10.10.53 10.10.10.54
network:
  ethernets:
    ens160:
      addresses:
        - 10.200.2.148/22
      gateway4: 10.200.0.1
      nameservers:
        addresses:
          - 10.10.10.53
          - 10.10.10.54
        search:
          - our.domain

...这与我们使用 Mike 的几乎相同yq,但允许我们通过将名称服务器地址附加到命令行末尾来添加更多名称服务器地址。由于$ARGS.positional始终是一个数组,因此如果命令行上仅给出一个字符串,则生成的文档将包含单个元素的格式正确的列表。

如果您将其与其或选项一起使用,则会yq进行“就地”编辑。-i--in-place

相关内容