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アドレスを2つの特定のアドレスに置き換える必要があります。これを試してください:

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「in-place」変換を実行し、出力をきれいに印刷するオプションを追加します-P(質問の予想される出力に示すように、配列は複数行に拡張されます)。

私が知る限り、Mike Farahはyq上記のコマンドに示されているようにJSON配列にエンコードしない限り、別のパラメータを配列として使用することはできません。そしてアンドレイ・キースリュークyq、よく知られているJSONプロセッサをjq囲むラッパーの場合は、次のことができます。

$ 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

関連情報