単一コマンドでIPアドレスを確認して設定を編集する

単一コマンドでIPアドレスを確認して設定を編集する

Dockerコンテナの内部IPを確認し、それをyaml設定ファイルの値として使用しようとしています。 IPを確認するコマンドは次のとおりです。

docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' controller-control-plane

そして、設定を編集するには、次を使用しています。

yq -i '.kubeslice.controller.endpoint = "https://<output_from_previous_command>:6443"'  values.yaml

最初のコマンドを次のパラメーターとして使用するには、次のようにします。

yq '.kubeslice.controller.endpoint = "https://$(docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' controller-control-plane):6443"'  values.yaml

これにより、出力が期待どおりに機能しなくなります。

kubeslice:
  controller:
    loglevel: info
    rbacResourcePrefix: kubeslice-rbac
    projectnsPrefix: kubeslice
    endpoint: https://$(docker inspect -f {{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}} controller-control-plane):6443

エンドポイントがコマンド文字列の代わりに正しいIP値を取得するようにこれを正しく実行するにはどうすればよいですか?

答え1

主な問題は、単一引用符で囲まれた文字列とコマンド置換を使用しようとしていることです。以内に一重引用符で囲まれた文字列。一重引用符で囲まれた文字列には一重引用符を含めることはできません。一重引用符で囲まれた文字列内では、置換項目は通常無視されます。

その後の質問は、コマンド置換の結果を挿入したいようです。まっすぐ編集中のYAMLに追加してください。データを引用またはエンコードする必要があるため、これは不適切です。

代わりにAndrey Kislyukyqhttps://kislyuk.github.io/yq/、コマンドを使用してデータを抽出し、エンドポイントURL値を設定するために使用できるdocker inspect内部変数を初期化します。yq

yq -y -i --arg addr "$(
    docker inspect \
        -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' \
        controller-control-plane
    )" \
    '.kubeslice.controller.endpoint = "https://" + $addr + ":6443"' values.yaml

Mike Farahのを使用している場合は、yq代わりにviaを介して往復してjqデータを正しく挿入できます。

yq -o json values.yaml |
jq --arg addr "$(
    docker inspect \
        -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' \
        controller-control-plane
    )" \
    '.kubeslice.controller.endpoint = "https://" + $addr + ":6443"' |
yq -P -o yaml >values.yaml.new &&
mv values.yaml.new values.yaml

これはマイクを使用してyqYAMLをJSONに変換するか、その逆に変換します。これを実行できる他のプログラムを使用できます。例えば、スティーブン・レビンyj

答え2

x = "y"渡された項目に二重引用符を使用する必要があるとしますyq

yq -i ".kubeslice.controller.endpoint = \"https://$(docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' controller-control-plane):6443\"" values.yaml

答え3

xargs を使用して、最初のコマンドの出力を構成を編集する2番目のコマンドの引数として渡すことができます。

docker inspect -f \
'{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' \
controller-control-plane | xargs -I{} yq \
'.kubeslice.controller.endpoint = "https://{}:6443"' values.yaml

出力:

kubeslice:
  controller:
    loglevel: info
    rbacResourcePrefix: kubeslice-rbac
    projectnsPrefix: kubeslice
    endpoint: https://172.18.0.3:6443

関連情報