これは私の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