このリンク の複雑な.yaml
ファイルを、Amazon Linux 2のEC2インスタンスで実行されている自動化プログラムの一部として実行されるbashスクリプトにフィードする必要があります。上のリンクの.yaml
ファイルには、多くのオブジェクト、およびファイルで定義されている多くのオブジェクトの1つで定義されている環境変数の1つを抽出する必要があります。
具体的には、
192.168.0.0/16
変数のCALICO_IPV4POOL_CIDR
値をbash変数に抽出するにはどうすればよいですか?
- name: CALICO_IPV4POOL_CIDR
value: "192.168.0.0/16"
よりフラットで単純な.yaml
ファイルの解析に関する他の投稿やブログエントリをたくさん読んだことがありますが、この質問でCALICO_IPV4POOL_CIDR
のvalue
のようなネストされた値を抽出する方法を示す例は他にありません。
そこでは2つの問題があります。
Gregory Nisbettの回答を読んで、「DaemonSet」という種類のYAMLドキュメントが必要だと思いました。
Bashスクリプトでこれを実行したいので、システムに既にインストールされている可能性が高いツールのみを使用するようにします。あなたがJQを持っているのは、それがないとBashで多くのことを行うことが難しいためです。
YAMLライブラリの場合、Rubyを使用する傾向があります。
yq を使用することをお勧めしましたが、YAMLドキュメントを抽出できるツールが必要なため、この場合はそれほど役に立ちません。
文書を抽出したら、もう一度Rubyを使用してファイルをJSONとして保存します。その後、jqを使用できます。
YAMLドキュメントの抽出
Rubyを使用してYAMLドキュメントを取得し、JSONとして保存するには:
url=...
curl -s $url | \
Ruby -ryaml -rjson -e \
"puts YAML.load_stream(ARGF.read)
.select{|doc| doc['kind']=='DaemonSet'}[0].to_json" \
| jq . > calico.json
詳細説明:
その応答をjq .
人間が読めるようにフォーマットされていますが、そのステップは実際には必要ありません。 Ruby=でも同じことができますが、Rubyコードを最小限に抑えたいと思います。
必要なキーを選択します
必要なキーを選択するには、次のJQクエリを使用できます。
jq -r \
'.spec.template.spec.containers[].env[] | select(.name=="CALICO_IPV4POOL_CIDR") | .value' \
calico.json
詳細説明:
spec.template.spec.containers[].env[]
すべてのコンテナとその中のすべての環境に対して反復するすべてを一緒に入れて:
#!/usr/bin/env bash
url='https://docs.projectcalico.org/v3.3/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml'
curl -s $url | \
Ruby -ryaml -rjson -e \
"puts YAML.load_stream(ARGF.read)
.select{|doc| doc['kind']=='DaemonSet'}[0].to_json" \
| jq . > calico.json
jq -r \
'.spec.template.spec.containers[].env[] | select(.name=="CALICO_IPV4POOL_CIDR") | .value' \
calico.json
テスト:
▶ bash test.sh
192.168.0.0/16