dockerが2-UIに深く入り込んだportainerはAPIを通じてサービスのACLを更新する


docker 2-UIのportainerはAPIを通じてサービスのACL 2018/11/5を更新する

準備作業

  • 文書
    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
  • を読む
  • 本例はmacで動作、httpieを用いて要求brew install httpie
  • を送信する.
  • jqによりデータ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