vultr.comページに新しいVPSサーバーを構築するための自動化されたスクリプトを構築したいと思います。また、APIにアクセスできるため、作成して必要なものをすべて受け取ることができます。問題は、vultrが各VPSサーバーのキーとして数字を含む応答を送信することです。このコマンドを使用してVPSを作成し、サーバー番号を取得します。
idofserver=$(curl -H 'API-KEY: "HERE IS MY PRIVATE API KEY"' \
https://api.vultr.com/v1/server/create \
--data 'DCID=9' --data 'VPSPLANID=201' --data 'OSID=244' \
| jq '."SUBID"' | /bin/sed 's/"//g')
また、「なしの数字も提供されました。したがって、コマンドラインの応答は2342738と同じです。変数も数字に変更されました。なぜなら、echo $idofserver」と入力すると、数字2342738が表示されるからです。
その行の後に、ループでコマンドを実行します。
echo "VULRT IS WORKING ID: $idofserver"
response=$(curl -H 'API-KEY: "HERE IS MY PRIVATE API KEY"' \
https://api.vultr.com/v1/server/list 100>/dev/null)
status=$(echo "$response" | jq '."$idofserver"' | jq '."status"')
また、「VULTR IS WORKING ID:2342738」も返されます。ただし、$status変数をアクティブに変更しないため、完全なループに残ります。 while ループ条件は次のとおりです。while [ $status != "active" ]; do
手動で応答をエコーし、jq
上記の $status コマンドを使用して送信してみました。しかし、答えは「なし」でした。理由はわかりません。
VULTRのJSONレスポンスは次のとおりです。
{"2342738":{"SUBID":"2342738","os":"Debian 9 x64 (stretch)","ram":"1024 MB","disk":"Virtual 25 GB","main_ip":"11.11.11.11","vcpu_count":"1","location":"Frankfurt","DCID":"9","default_password":"=*{#?HHH*!-(","date_created":"2019-04-22 17:49:28","pending_charges":"0.01","status":"active","cost_per_month":"5.00","current_bandwidth_gb":0,"allowed_bandwidth_gb":"1000","netmask_v4":"255.255.0.0","gateway_v4":"11.11.11.11","power_status":"running","server_state":"installingbooting","VPSPLANID":"201","v6_main_ip":"","v6_network_size":"","v6_network":"","v6_networks":[],"label":"","internal_ip":"","kvm_url":"https:\/\/my.vultr.com\/subs\/vps\/novnc\/api.php?data=jhkjhjhkjhkj","auto_backups":"no","tag":"","OSID":"244","APPID":"0","FIREWALLGROUPID":"0"}}
答え1
まず、-r
withを使用してjq
元のデータを取得します。以下を介して出力を渡さないでくださいsed
。
url='https://api.vultr.com/v1/server'
key='API-KEY: "HERE IS MY PRIVATE API KEY"'
serverid=$( curl -H "$key" "$url/create" \
--data 'DCID=9' \
--data 'VPSPLANID=201' \
--data 'OSID=244' |
jq -r '.SUBID' )
jq
その後、式の周りに一重引用符を使用してシェル変数の拡張を防ぐため、2番目の呼び出しは機能しません。しかしそれはいいえシェル変数をjq
。
代わりに:
printf 'VULRT IS WORKING ID: %s\n' "$serverid"
status=$( curl -s -H "$key" "$url/list" 100 |
jq -r --arg id "$serverid" '.[$id].status' )
を使用すると、経由でアクセスできる値を持つ変数が--arg id "$serverid"
作成されます。キーとして使用するにはを使用します。jq
$id
[$id]
私は私の個人的な好みに合わせてコードの他のいくつかの点を自由に変更することができました。
答え2
問題は、'."$idofserver"'
一重引用符で囲まれているため、その値に拡張されないことです。文字通り「」と呼ばれるキーを$idofserver
探しています。$idofserver
また、パイプは必要ありませんjq | jq
。 jqプログラムでフィルタを一緒にリンクできます。
.["2342738"].status
その結果を得るために参照を変更することができますが、IDを設定するjq変数に渡し、内部参照の問題を完全に回避する方がより安定しています。
jq --arg id "$idofserver" '.[$a].status'
また、可能であればこれを避けることをお勧めしますecho "$response" | jq
。直接パイプするかprintf '%s' "$response" | jq
(好ましくは)orをjq <<<"$response"
代わりに使用します。