docker深入2-UI之portainer通过API来更新service的ACL

作者:佚名 上传时间:2019-03-21 版权申诉

docker深入2-UI之portainer通过API来更新service的ACL
2018/11/5

准备工作

  1. 阅读文档

    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
  2. 本例在 mac 下操作,使用 httpie 来发送请求
    brew install httpie

  3. 通过 jq 来格式化数据
    brew install jq

  4. 干活的目录
    /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.
>>

尽管之前为 service 设置过 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
示例: 获得通过service前缀过滤后的状态
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. 获得通过service前缀过滤后的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. 【例如权限设置错误的场景】根据上述信息,批量执行API来更新针对team的ACL权限(注意:此处,根据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-docs
https://app.swaggerhub.com/apis-docs/deviantony/Portainer/1.19.2#/
2、issuecomment
https://github.com/portainer/portainer/pull/2137#issuecomment-426421950
3、releases-tag-1.19.2
https://github.com/portainer/portainer/releases/tag/1.19.2

免责申明:文章和图片全部来源于公开网络,如有侵权,请通知删除 server@dude6.com

用户评论
相关推荐
docker深入2-UIportainer通过API更新serviceACL
docker深入2-UI之portainer通过API来更新service的ACL2018/11/5准备工作阅读文档resource_controlsManage access
docker深入2-UIportainer二次开发使用yarn管理前端环境
docker深入2-UI之portainer的二次开发之使用yarn管理前端环境2018/10/19问题点前端后端前端当前(2018-10)给前端贡献代码时,环境变成了y
portainer docker镜像
portainer docker镜像
TAR
75.51MB
2021-01-16 19:41
如何调用docker swarm serviceAPI创建及更新服务
平衡的推进,先作一个原型吧。 #!/usr/bin/env python# -*- coding: utf-8 -*-import requestsimport json
docker_portainer.tar
Portainer 1.13.3,启动命令:docker run -d --privileged=true --name docker_admin -p 9000:9000 -v /var/run/d
TAR
9.92MB
2020-09-03 22:53
Docker Portainer Template源码
Portainer容器模板 注意: Portainer 2.0模板。 从SelfhostedPro分叉 先决条件 服务器Docker引擎Portainer容器 正在安装 广告网址到外部模板。 *仅支持
ZIP
30KB
2021-05-04 15:20
使用portainer连接远程docker教程
Portainer是一个轻量级的docker环境管理UI,可以用来管理docker宿主机和docker swarm集群,这篇文章主要介绍了使用portainer连接远程docker的方法,需要的朋友可
PDF
167KB
2020-11-08 22:04
docker:轻量级图形页面管理Portainer
1.介绍docker 图形化管理提供了很多工具,有Portainer、Docker UI、Shipyard等等,本文主要介绍Portainer。 Portainer是一个开源、轻量
深入剖析Docker Service Discovery服务发现
Docker Service Discovery服务发现是一个非常重要的功能,可以使Docker容器更易于管理和互相通信。在本文中,我们将深入剖析这一功能的原理和实现方法,介绍常用的Service D
pdf
193.03KB
2023-04-13 12:37
Docker Swarm集群Portainer使用总结
一、安装Docker 1.windows7下安装docker 是的,现在还是有人用windows7的,因为没有Hyper-V,所以并不能使用docker for windows,但是可以使用docke
PDF
241KB
2021-01-10 22:10