dockerが2-UIに深く入り込んだportainerはAPIを通じてサービスのACLを更新する
docker 2-UIのportainerはAPIを通じてサービスのACL 2018/11/5を更新する
文書 を読む本例はmacで動作、httpieを用いて要求 を送信する. jqによりデータ をフォーマットする.作業の目次
portainerが1.19.2にアップグレードされると、特別な変化があります.
1.19.2
Breaking changes
This version changes the default ownership for externally created resources from Public to Administrator restricted (#960, #2137). The migration process will automatically migrate any existing resource declared as Public to Administrators only.
サービスにACLを設定していましたが、アップグレード後にすべてAdministrators権限にリセットされました.
次に、具体的な例を示します.
1.認証tokenを取得
2.teams情報のリスト
例:jsonデータをテキストから読み出してPOST要求を送信する
例:サービス接頭辞によるフィルタリング後のステータスの取得
3.サービス接頭辞によりフィルタされたIDを取得する
4.上記情報に基づき、複数のAPIを一括して実行してteamに対するACL権限を作成する(注意:ここでapiドキュメントによればPOSTメソッドを使用する)
5.【例えば、権限設定が間違っている場合】上記の情報に基づいて、teamに対するACL権限を一括してAPIを実行して更新する(注意:ここでapiドキュメントによれば、PUTメソッドを使用する)
1、Portainer-API-docshttps://app.swaggerhub.com/apis-docs/deviantony/Portainer/1.19.2#/2、issuecommenthttps://github.com/portainer/portainer/pull/2137#issuecomment-4264219503、releases-tag-1.19.2https://github.com/portainer/portainer/releases/tag/1.19.2
準備作業
resource_controls
Manage access control on Docker resources
POST
/resource_controls
Create a new resource control
PUT
/resource_controls/{id}
Update a resource control
DELETE
/resource_controls/{id}
Remove a resource control
brew install httpie
brew install jq
/tmp/httpie
の原因となる
portainerが1.19.2にアップグレードされると、特別な変化があります.
1.19.2
Breaking changes
This version changes the default ownership for externally created resources from Public to Administrator restricted (#960, #2137). The migration process will automatically migrate any existing resource declared as Public to Administrators only.
サービスにACLを設定していましたが、アップグレード後にすべてAdministrators権限にリセットされました.
一時的な解決策:APIによってACLをリセットする
次に、具体的な例を示します.
1.認証tokenを取得
http POST http://your-portainer-addr/api/auth Username="admin" Password="portainer"
{
"jwt": "xxJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJhZG1pbiIsInJvbGUiOjEsImV4cCI6MTUzOTYxNzcwNX0.ifadEaqEo7LNWPuPBl8zQMZqeFvxfVPgAD6asNdMQYY"
}
2.teams情報のリスト
http GET http://your-portainer-addr/api/teams \
"Authorization: Bearer xxJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJhZG1pbiIsInJvbGUiOjEsImV4cCI6MTUzOTYxNzcwNX0.ifadEaqEo7LNWPuPBl8zQMZqeFvxfVPgAD6asNdMQYY"
[
{
"Id": 1,
"Name": "dev"
},
{
"Id": 2,
"Name": "qa"
},
{
"Id": 3,
"Name": "ops"
}
]
例:jsonデータをテキストから読み出してPOST要求を送信する
mkdir /tmp/httpie && cd /tmp/httpie
http POST http://your-portainer-addr/api/resource_controls \
"Authorization: Bearer xxJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJhZG1pbiIsInJvbGUiOjEsImV4cCI6MTUzOTYxNzcwNX0.ifadEaqEo7LNWPuPBl8zQMZqeFvxfVPgAD6asNdMQYY" \
@/tmp/httpie/1.json
例:サービス接頭辞によるフィルタリング後のステータスの取得
http GET http://your-portainer-addr/api/endpoints/5/docker/services\?filters\='{"name":["dev-app1"]}' \
"Authorization: Bearer xxJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJhZG1pbiIsInJvbGUiOjEsImV4cCI6MTUzOTYxNzcwNX0.ifadEaqEo7LNWPuPBl8zQMZqeFvxfVPgAD6asNdMQYY" |jq '.[] | {name: .Spec.Name, id: .ID, teams: .Portainer.ResourceControl.TeamAccesses[0].TeamId}'
3.サービス接頭辞によりフィルタされたIDを取得する
http GET http://your-portainer-addr/api/endpoints/5/docker/services\?filters\='{"name":["dev-app1"]}' \
"Authorization: Bearer xxJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJhZG1pbiIsInJvbGUiOjEsImV4cCI6MTUzOTYxNzcwNX0.ifadEaqEo7LNWPuPBl8zQMZqeFvxfVPgAD6asNdMQYY" |jq '.[].ID' > .id
4.上記情報に基づき、複数のAPIを一括して実行してteamに対するACL権限を作成する(注意:ここでapiドキュメントによればPOSTメソッドを使用する)
s1='{"Type": "service", "Public": false, "ResourceID": "'
s2='", "Users": [], "Teams": [2]}'
for ID in `cat .id |sed 's/"//g'`;do
echo $ID
echo ${s1}${ID}${s2} >acl-create.json
http POST http://your-portainer-addr/api/resource_controls \
"Authorization: Bearer xxJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJhZG1pbiIsInJvbGUiOjEsImV4cCI6MTUzOTYxNzcwNX0.ifadEaqEo7LNWPuPBl8zQMZqeFvxfVPgAD6asNdMQYY" \
@/tmp/httpie/acl-create.json
echo '---------'
done
5.【例えば、権限設定が間違っている場合】上記の情報に基づいて、teamに対するACL権限を一括してAPIを実行して更新する(注意:ここでapiドキュメントによれば、PUTメソッドを使用する)
s3='{"Public": false, "Users":[], "Teams":[2]}'
for ID in `cat .id |sed 's/"//g'`;do
echo ${ID}
echo ${s3} >acl-update.json
echo '[+] Portainer.ResourceControl.ID:'
portainer_svc_rc_id=`http GET "http://your-portainer-addr/api/endpoints/5/docker/services/${ID}" \
"Authorization: Bearer xxJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJhZG1pbiIsInJvbGUiOjEsImV4cCI6MTUzOTYxNzcwNX0.ifadEaqEo7LNWPuPBl8zQMZqeFvxfVPgAD6asNdMQYY" |jq '.Portainer.ResourceControl.Id'`
echo ${portainer_svc_rc_id}
echo '[+] Update:'
http PUT "http://your-portainer-addr/api/resource_controls/${portainer_svc_rc_id}" \
"Authorization: Bearer xxJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJhZG1pbiIsInJvbGUiOjEsImV4cCI6MTUzOTYxNzcwNX0.ifadEaqEo7LNWPuPBl8zQMZqeFvxfVPgAD6asNdMQYY" \
@/tmp/httpie/acl-update.json
echo '---------'
done
ZYXW、参考
1、Portainer-API-docshttps://app.swaggerhub.com/apis-docs/deviantony/Portainer/1.19.2#/2、issuecommenthttps://github.com/portainer/portainer/pull/2137#issuecomment-4264219503、releases-tag-1.19.2https://github.com/portainer/portainer/releases/tag/1.19.2