
次のURLへのAPIアクセス権があります。
curl https://api_url.com/device_groups/ -u api_key:
JSON出力:
{
"data":[
{
"type":"device_group",
"id":85015,
"attributes":{
"name":"Initial"
},
"relationships":{
"devices":{
"data":[
]
}
}
},
{
"type":"device_group",
"id":85683,
"attributes":{
"name":"mode-4"
},
"relationships":{
"devices":{
"data":[
]
}
}
},
{
"type":"device_group",
"id":85684,
"attributes":{
"name":"Employees-3"
},
"relationships":{
"devices":{
"data":[
{
"type":"device",
"id":506044
},
{
"type":"device",
"id":658670
},
{
"type":"device",
"id":506034
},
{
"type":"device",
"id":506037
},
{
"type":"device",
"id":506038
},
{
"type":"device",
"id":506046
},
{
"type":"device",
"id":506043
},
{
"type":"device",
"id":658669
},
{
"type":"device",
"id":506036
},
{
"type":"device",
"id":502256
}
]
}
}
},
{
"type":"device_group",
"id":91589,
"attributes":{
"name":"Subcontractors-2"
},
"relationships":{
"devices":{
"data":[
{
"type":"device",
"id":658668
},
{
"type":"device",
"id":658671
},
{
"type":"device",
"id":506051
},
{
"type":"device",
"id":506048
},
{
"type":"device",
"id":506040
},
{
"type":"device",
"id":506050
},
{
"type":"device",
"id":506042
},
{
"type":"device",
"id":502236
},
{
"type":"device",
"id":506041
},
{
"type":"device",
"id":523577
},
{
"type":"device",
"id":506053
},
{
"type":"device",
"id":655780
},
{
"type":"device",
"id":508070
},
{
"type":"device",
"id":506052
},
{
"type":"device",
"id":506047
},
{
"type":"device",
"id":506035
},
{
"type":"device",
"id":506045
},
{
"type":"device",
"id":506039
},
{
"type":"device",
"id":506049
},
{
"type":"device",
"id":589426
}
]
}
}
},
{
"type":"device_group",
"id":92316,
"attributes":{
"name":"Employees-2"
},
"relationships":{
"devices":{
"data":[
{
"type":"device",
"id":673452
},
{
"type":"device",
"id":576554
},
{
"type":"device",
"id":672077
},
{
"type":"device",
"id":589167
}
]
}
}
},
{
"type":"device_group",
"id":92325,
"attributes":{
"name":"Employees"
},
"relationships":{
"devices":{
"data":[
]
}
}
},
{
"type":"device_group",
"id":94908,
"attributes":{
"name":"mode 2"
},
"relationships":{
"devices":{
"data":[
{
"type":"device",
"id":501727
}
]
}
}
},
{
"type":"device_group",
"id":95017,
"attributes":{
"name":"Mode 1"
},
"relationships":{
"devices":{
"data":[
]
}
}
},
{
"type":"device_group",
"id":95381,
"attributes":{
"name":"Employees-test"
},
"relationships":{
"devices":{
"data":[
{
"type":"device",
"id":658672
}
]
}
}
},
{
"type":"device_group",
"id":95382,
"attributes":{
"name":"Subcontracters-test"
},
"relationships":{
"devices":{
"data":[
]
}
}
}
],
"has_more":false
}
各デバイスを事前定義されたデバイスグループIDに移動し、最初のJSONカールから取得した元のグループにデバイスを返す必要があります。
例えば。
curl https://api_url.com/group/$predefined_group_id/devices/506044 -u api_key: -X POST
curl https://api_url.com/group/$original_group_id/devices/506044 -u api_key: -X POST
IDまたは説明に基づいて特定のdevice_groupを変数として除外できますか?
答え1
jq
コマンド
jq -r '
.data.id as $groupid |
.data.relationships.devices.data[].id |
@sh "https://api_url.com/group/\($groupid)/devices/\(.)"' file
...グループIDを抽出し、配列id
のすべての値を抽出しますdata
。各id
値に対して出力するURLを設定します。
呼び出し時に生成されたURLを使用するにはcurl
:
jq -r '
.data.id as $groupid |
.data.relationships.devices.data[].id |
@sh "https://api_url.com/group/\($groupid)/devices/\(.)"' file |
xargs -I {} curl -X POST -u api_key: {}
質問のJSON文書が与えられると、次のコマンドが実行されます。
curl -X POST -u api_key: https://api_url.com/group/85684/devices/506044
curl -X POST -u api_key: https://api_url.com/group/85684/devices/506034
curl -X POST -u api_key: https://api_url.com/group/85684/devices/506037
curl -X POST -u api_key: https://api_url.com/group/85684/devices/506038
curl -X POST -u api_key: https://api_url.com/group/85684/devices/506046
curl -X POST -u api_key: https://api_url.com/group/85684/devices/506043
curl -X POST -u api_key: https://api_url.com/group/85684/devices/658669
curl -X POST -u api_key: https://api_url.com/group/85684/devices/506036
curl -X POST -u api_key: https://api_url.com/group/85684/devices/502256
xargs
また、次のURLを使用してできるだけ少ない呼び出しを行うこともできます。curl
jq -r '
.data.id as $groupid |
.data.relationships.devices.data[].id |
@sh "https://api_url.com/group/\($groupid)/devices/\(.)"' file |
xargs curl -X POST -u api_key:
これにより、単一のコマンドが生成されます。
curl -X POST -u api_key: https://api_url.com/group/85684/devices/506044 https://api_url.com/group/85684/devices/506034 https://api_url.com/group/85684/devices/506037 https://api_url.com/group/85684/devices/506038 https://api_url.com/group/85684/devices/506046 https://api_url.com/group/85684/devices/506043 https://api_url.com/group/85684/devices/658669 https://api_url.com/group/85684/devices/506036 https://api_url.com/group/85684/devices/502256
some_groupid
次のようにデータで見つかったグループID(変数を使用)を使用する代わりに、コマンドラインからグループIDを指定できます。
jq -r --arg groupid "$some_groupid" '
.data.relationships.devices.data[].id |
@sh "https://api_url.com/group/\($groupid)/devices/\(.)"' file
答え2
それはまさに私が望んでいたものです。 @Theyがよりエレガントに見えるようになると確信していますが、それは私が必要とすることを行います。
#!/bin/bash
# Set groupid also read and write API variables
group="80000"
read_api="read_api"
write_api="write_api"
# get all devicesid and groupid and create groups.json file
curl https://api_url.com/device_groups -u "$read_api": > groups.json
# Move all devices into predefined groupid
jq -r --arg groupid $group '
.data[].relationships.devices.data[].id |
@sh "https://api_url.com/device_groups/\($groupid)/devices/\(.)"' groups.json |
xargs curl -X POST -u "$write_api":
# Wait for the groupid to propagate
sleep 60;
# Move all devices into original groupid
jq -r '
.data[] |
"https://api_url.com/device_groups/\(.id)/devices/\(.relationships.devices.data[].id)"' groups.json |
xargs curl -X POST -u "$write_api":