다음과 같은 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":