私はCentOS 7.5でいくつかのMongoDBコマンドを実行するbashスクリプトを書いています。これらのコマンドの1つはレプリケーションサーバーを設定します。プロジェクトによっては、サーバーの数が異なる場合があります。
サーバーのホスト名とIPである連想配列があります(コードの他の部分で必要なため、連想配列を使用しています)。この例では、3 つのサーバーがあります。
declare -A rep_hostname
rep_hostname=( [test1]='172.1.1.1' [test2]='172.1.1.2' [test3]='172.1.1.3' )
3 台のサーバーがある場合は、以下を実行する必要があります。
rs.initiate( { _id : "opino-rs", members: [ { _id: 0, host: "172.1.1.1:2701" },
{ _id: 1, host: "172.1.1.2:2701" }, { _id: 2, host: "172.1.1.3:2701" } ]})
私のアレイに2つのサーバーがある場合は、次のようになります。
rs.initiate( { _id : "opino-rs", members: [ { _id: 0, host: "172.1.1.1:2701" },
{ _id: 1, host: "172.1.1.2:2701" } ]})
このコマンドを生成して実行する必要があります。問題はそれを生成できないということです。いくつかのコードを試してみましたが、私が望むコードにも近いわけではありません。
どうすればいいですか?
答え1
#!/bin/bash
declare -A rep_hostname
rep_hostname=( [test1]='172.1.1.1' [test2]='172.1.1.2' [test3]='172.1.1.3' )
json=$(
jo _id=opino-rs members="$(
jo -a "${rep_hostname[@]/%/:2701}" |
jq -c 'to_entries | map({ "_id": .key, "host": .value })'
)"
)
printf 'rs.initiate(%s)\n' "$json"
テスト:
$ bash script.sh
rs.initiate({"_id":"opino-rs","members":[{"_id":0,"host":"172.1.1.3:2701"},{"_id":1,"host":"172.1.1.2:2701"},{"_id":2,"host":"172.1.1.1:2701"}]})
これはjo
との両方を使用しますjq
。このjo
ユーティリティは、シェルからJSONを作成するためのツールです。jo
生成されたJSONが正しく引用されてエンコードされていることを確認してください。このjq
ユーティリティは、シェルでJSONを解析して処理するツールです。
私はそれをjo
連想配列のIPアドレスのリストに基づいてJSONホスト名のリストを作成するために使用しています。 JSON配列を作成する前に、:2701
各IPアドレスの末尾にパラメータ置換を追加しました。
$ jo -a "${rep_hostname[@]/%/:2701}"
["172.1.1.3:2701","172.1.1.2:2701","172.1.1.1:2701"]
これを読み、jq
最終JSONのキーに割り当てたいJSONオブジェクトのリストに変更します。members
$ jo -a "${rep_hostname[@]/%/:2701}" | jq -c 'to_entries | map({ "_id": .key, "host": .value })'
[{"_id":0,"host":"172.1.1.3:2701"},{"_id":1,"host":"172.1.1.2:2701"},{"_id":2,"host":"172.1.1.1:2701"}]
jo
これは、最終的なJSON文書を作成するための入力として再利用されます。
rs.initiate()
スクリプトの最後に生成されたJSONドキュメントは、呼び出しを使用して文字列の角かっこに挿入されますprintf
。
私はMongoDBを使用していないので、この結果を最もよく実行する方法はわかりません。
また見なさい: