使用openstackclient调用Keystone v3 API

时间:2023-02-11 23:14:28

  本文内容属于个人原创,转载务必注明出处:

     http://www.cnblogs.com/Security-Darren/p/4138945.html

  

  考虑到Keystone社区逐渐弃用第二版身份API, 而Keystone原有的客户端keystoneclient将不会在命令行工具上支持Keystone第三版API, 我们有必要了解项目openstackclient及其使用, 这里我们主要探讨如何使用openstackclient调用第三版Keystone身份API.

  openstackclient旨在整合现有的各个OpenStack服务客户端工具, 提供一个统一的命令行接口, 这个项目处于不断的完善中, 但目前已发布的版本对Keystone第三版身份API已经有比较好的支持, 这里我们主要介绍该命令行工具如何操作和管理OpenStack系统中与Keystone相关的内容.

  OpenStack中涉及到的身份管理概念如下, 这些实体都可以由openstackclient提供的命令行工具进行操作.

  *本文仅探讨如何使用openstackclient操作OpenStack中的身份实体. 如果想要全面了解项目"python-openstackclient", 请移步这里.

OpenStack身份管理概念

  项目域 (domain): 一组项目.

  用户组 (group): 一组用户.

  项目 (project): 一组虚拟资源的所有者.

  角色 (role): 一个帮助实现授权的策略对象.

  用户 (user): 使用云资源的个体.

  令牌 (token): 决定能否访问的的一段特殊文字.

  策略 (policy): 决定授权与访问控制的策略.

  服务 (service):一个云服务.

  端点 (endpoint): 用于访问一个具体云服务的URL.

  地理域 (region): 一些物理机的组合.

  消费者 (consumer): 基于OAuth的被授权人.

  请求令牌 (request token): 临时的OAuth令牌.

  访问令牌 (access token): 长期的OAuth令牌.

  凭证 (credential): 针对于身份提供方的凭证.

  身份提供方 (identity provider): 一个提供用户来源和身份认证的机构.

  结盟协议 (federation protocol):

  映射 (mapping):

  
openstackclient的全局选项(选项后的 "ENV" 表示这个选项可以设置为系统的环境变量, 环境变量的名称就是将选项前的"--"去除, 所有字母转为大写并将用于连接的"-"改成下划线"_", 比如"--os-auth-url"对应的环境变量名为"OS_AUTH_URL")

  对应的环境变量 默认值 可选值 作用
--version        
-h, --help        
--debug         
--quiet, -q        
--verbose        
--log-file <file-name>         
--os-cloud <cloud-config-name> Env: OS_CLOUD      
--os-region-name <region> Env: OS_REGION_NAME      
--os-cacert <file>        
--verify        
--insecure         
--os-default-domain <auth-domain> OS_DEFAULT_DOMAIN      
--timing        
--os-compute-api-version <compute-api-version> OS_COMPUTE_API_VERSION 2    
--os-network-api-version <network-api-version> OS_NETWORK_API_VERSION 2    
--os-image-api-version <image-api-version> OS_IMAGE_API_VERSION 1    
--os-volume-api-version <volume-api-version> OS_VOLUME_API_VERSION 1    
--os-identity-api-version <identity-api-version> OS_IDENTITY_API_VERSION 2    
--os-object-api-version <object-api-version> OS_OBJECT_API_VERSION 1    
--os-auth-type <auth-type> OS_AUTH_TYPE  

v2token,

v2password,

v3password,

v3scopedsaml,

v3unscopedadfs,

token,

v3token,

password,

v3unscopedsaml,

osc_password,

token_endpoint

 
--os-user-id <auth-user-id> OS_USER_ID     登陆用户ID,仅用用户ID足以唯一确定用户
--os-username <auth-username> OS_USERNAME     登陆用户名,仅用用户名无法唯一确定用户
--os-user-domain-name <auth-user-domain-name> OS_USER_DOMAIN_NAME     限定用户所在的domain
--os-user-domain-id <auth-user-domain-id> OS_USER_DOMAIN_ID     限定用户所在的domain
--os-password <auth-password> OS_PASSWORD     用户的登陆密码
--os-project-id <auth-project-id> OS_PROJECT_ID     设置登陆的scope为某个poject,仅用project ID就足以唯一确定project
--os-project-name <auth-project-name> OS_PROJECT_NAME     设置登陆的scope为某个poject,仅用project名无法唯一确定project
--os-project-domain-name <auth-project-domain-name> OS_PROJECT_DOMAIN_NAME     限定project所在的domain
--os-project-domain-id <auth-project-domain-id> OS_PROJECT_DOMAIN_ID     限定project所在的domain
--os-domain-name <auth-domain-name> OS_DOMAIN_NAME     设置登陆的scope为某个domain,仅用domain名就可以唯一确定domain
--os-domain-id <auth-domain-id> OS_DOMAIN_ID     设置登陆的scope为某个domain,仅用domain ID也可以唯一确定domain
--os-auth-url <auth-auth-url> OS_AUTH_URL     使用用户名+密码登陆方式时,通过该选项指定要认证的Keystone端点
--os-token <auth-token> OS_TOKEN      
--os-url <auth-url> OS_URL      
--os-endpoint <auth-endpoint> OS_ENDPOINT      
--os-identity-provider-url <auth-identity-provider-url> OS_IDENTITY_PROVIDER_URL      
--os-service-provider-endpoint <auth-service-provider-endpoint> OS_SERVICE_PROVIDER_ENDPOINT      
--os-identity-provider <auth-identity-provider> OS_IDENTITY_PROVIDER      
--os-trust-id <auth-trust-id> OS_TRUST_ID      

  使用openstackclient虽然能够提供更多更一致的操作,仅仅登陆就需要多个选项进行设定,如果不能理解每个选项的含义,是无法正确登陆openstack,也无法正常使用的。在Keystone v3 Identity API中,以下概念的命名空间能够帮助我们理解登陆时各个选项的含义:

1. domain:命名空间是整个keystone,因此一个domain的name和ID都能唯一确定某个domain;

2. user:命名空间是某个domain,因此一个user的name无法唯一确定某个user,必须结合他所在的domain才行;而user ID却能唯一确定某个用户;

3. project:命名空间是某个domain,因此name和ID的作用同user。

  此外Keystone v3 Identity API允许用户选择某一次登陆时获取令牌限定的范围(scope),scope可以是domain, project, trust和没有;如果用户登陆时没有指定scope,那么又视用户是否具有default_project_id这个属性,要么用户此次会话被绑定到默认的project,或者此次会话没有绑定任何scope(unscoped)。

  因此回头查看openstack命令登陆时的选项,关键是通过 --os-auth-type 选择自己需要的认证方式,比如选择 v3password 后,需要提供自己的用户名和密码,此时需要明确由于命名空间的原因,仅仅提供自己的用户名是无法通过Keystone的认证的,所以就可能需要 --os-user-domain-id 或 --os-user-domain-name 来唯一地告诉Keystone自己到底是哪个用户。

  然后就是确定自己这次会话要确定的scope,可以是domain, 也可以是project,需要通过 --os-project-id 、 --os-project-name 或者 --os-domain-name 、 --os-domain-id 来告诉Keystone此次会话要绑定的scope。这时又要注意,由于project的命名空间是某个domain,因此如果使用 --os-project-name 来确定scope,那么还要通过 --os-project-domain-name或 --os-project-domain-id 来唯一确定这个project。

  下面给出几个使用openstackclient登陆openstack的例子,

  1. 使用keystone.conf文件中设置的“admin_token”来登陆,获取系统的最高权限

openstack \
--os-identity-api-version \
--os-auth-type token_endpoint \
--os-token ADMIN \
--os-url http://127.0.0.1:35357/v3

  注意这次会话将使用的是Keystone v3 Identity API,可见keystone.conf的“admin_token”便于初始化Keystone,有趣的是,尽管 --os-auth-type 选择的是“token_endpoint”,却不能使用 --os-endpoint 来指定Keystone的地址。

  另一方面,如果继续使用Keystone v2 Identity API,需要将 --os-identity-api-version 的值设置为2,同时 --os-url 设为http://127.0.0.1:35357/v2.0,尽管都是作为系统的初始化用户登陆,但是如果指定的API版本不同,进入到openstackclient交互空间后,可以看到的操作不同,第二版的Keystone API不存在多domain的概念,也无法执行一些第三版Keystone API才有的CLI命令。

  例如,使用admin_token访问第三版Keystone API,查看能对role执行的操作:

(.venv)root@os-VirtualBox:/opt/keystone# openstack \
> --os-identity-api-version \
> --os-auth-type token_endpoint \
> --os-token ADMIN \
> --os-url http://127.0.0.1:35357/v3
(openstack) help role
Command "role" matches:
role remove
role create
role delete
role add
role list
role assignment list
role set
role show

  类似地,使用admin_token访问第二版Keystone API,同样查看能对role执行的操作:

openstack \
--os-identity-api-version \
--os-auth-type token_endpoint \
--os-token ADMIN \
--os-url http://127.0.0.1:35357/v2.0
(openstack) help role
Command "role" matches:
role remove
role create
role delete
role list
role add
role show

  类似地,可以看到,第二版Keystone API不能执行一些第三版Keystone API的很多功能,而且由于社区已经逐渐弃用第二版Keystone API,我们将关注第三版Keystone API的功能。

  2. 使用用户名+密码登陆,scope限定为某个domain

openstack \
--os-identity-api-version \
--os-auth-type v3password \
--os-username darren \
--os-password 123456 \
--os-user-domain-id default \
--os-domain-id default \
--os-auth-url http://127.0.0.1:5000/v3

  scope限定为某个domain时,用户在该domain上必须已经被授予了某个role,而且这个role具有执行一些命令一些权限,才能执行后续的操作,否则用户无法在openstackclient的交互空间执行命令。

  3. 使用用户名+密码登陆,scope限定为某个project

openstack \
--os-identity-api-version \
--os-auth-type v3password \
--os-username darren \
--os-password \
--os-user-domain-id default \
--os-project-name darren \
--os-project-domain-id default \
--os-auth-url http://127.0.0.1:5000/v3

使用openstackclient初始化Keystone

  使用openstackclient的一个问题是如何初始化整个Keystone,我们可以通过:

    1. 采用上面例1中的admin_token方式登陆,完成下面2、 3的初始化;

    2. 创建一个新的管理domain,作为云服务提供商所在的domain,其他的domain视为租户。为了向后兼容,所有使用第二版Keystone API的对象都属于ID为"default"的domain,第三版Keystone API则没有这个限制;

    3. 在这个管理domain里面添加用户(组)、角色、项目等,为用户授予管理员角色(可以绑定到domain、project或group),记录下这个管理domain的ID;

    4. 退出当前的会话,修改默认的policy.v3cloudsample.json文件,将规则:

"cloud_admin": "rule:admin_required and domain_id:REPLACE_ADMIN_DOMAIN_HERE"

  中"domain_id"后面的值替换成实际创建的管理domain的ID,

    5. 修改keystone.conf文件,将policy_file设置为policy.v3cloudsample.json的路径,然后重启Keystone;

    6. 使用openstackclient,采用上面例2中将会话scope绑定为domain的方式登陆,然后就可以作为云管理员操作了。注意能够以绑定到domain的形式进行操作的前提是用户具有domain级的role,否则即使进入openstackclient的交互空间,也无法执行操作;

    7. 下面可以从keystone.conf中注释掉"admin_token",并从keystone-paste.ini文件的Paste pipeline中移除过滤器admin_token_auth,这样,以后就不能使用初始化系统的“admin_token”登陆了:

[pipeline:api_v3]
pipeline = sizelimit url_normalize request_id build_auth_context token_auth admin_token_auth json_body ec2_extension_v3 s3_extension simple_cert_extension revoke_extension federation_extension oauth1_extension endpoint_filter_extension endpoint_policy_extension service_v3

改为

[pipeline:api_v3]
pipeline = sizelimit url_normalize request_id build_auth_context token_auth json_body ec2_extension_v3 s3_extension simple_cert_extension revoke_extension federation_extension oauth1_extension endpoint_filter_extension endpoint_policy_extension service_v3

openstackclient Keystone v3 API--基于1.1.0版openstackclient

概念 操作 功能
access token create oauth1
catalog list, show  
consumer create, list, set, delete, show oauth1
credential create, list, set, delete, show  
domain create, list, set, delete, show  
endpoint create, list, set, delete, show  
federation project list federation
federation domain list federation
federation protocol create, list, set, delete, show federation
group

create, list, set, delete, show

add user, remove user, contains user

 
identity provider create, list, set, delete, show federation
mapping create, list, set, delete, show  
policy create, list, set, delete, show  
project create, list, set, delete, show  
region create, list, set, delete, show  
request token authorize, create oauth1
role create, list, set, delete, show, add, remove  
role assignment list  
service create, list, set, delete, show  
token issue  
trust create, list, delete, show  
user password set  
user create, list, set, delete, show  

一. 消费者(consumer)相关操作

创建消费者

    consumer create
[--description <consumer-description>]

删除消费者

    consumer delete
<consumer>

更新消费者

    consumer set
[--description <new-consumer-description>]
<consumer>

查看单个消费者明细

    consumer show
<consumer>

列出所有消费者

    consumer list

二. 凭证(credential)相关操作

创建凭证

    credential create
[--type <type>]
[--project <project>]
<user>
<data>

删除凭证

    credential delete
<credential-id>

更新凭证

    credential set
[--user <user>]
[--type <type>]
[--data <data>]
[--project <project>]
<credential-id>

查看单个凭证明细

    credential show
<credential-id>

列出所有凭证

    credential list

三. 域(domain)相关的操作

创建域

    domain create
[--description <domain-description>]
[--enable | --disable]
<domain-name>

删除域

    domain delete
<domain>

更新域

    domain set
[--name <new-domain-name>]
[--description <domain-description>]
[--enable | --disable]
<domain>

查看单个域明细

    domain show
<domain>

列出所有域

    domain list 

四. 端点(endpoint )相关的操作

创建端点

    endpoint create
[--region <region>]
[--enable | --disable]
<service>
<interface>
<url>

删除断点

    endpoint delete
<endpoint>

更新端点

  endpoint set
    [--interface <interface>]
    [--url <url>]
    [--service <service>]
    [--region <region>]
    [--enable | --disable]
    <endpoint>  

查看单个端点明细

    endpoint show
<endpoint>

列出所有端点

    endpoint list 

五. 结盟协议(federation protocol )相关操作

创建结盟协议

    federation protocol create
[--identity-provider <identity-provider>]
[--mapping <mapping>]
<name>

删除结盟协议

    federation protocol delete
[--identity-provider <identity-provider>]
<name>

列出所有结盟协议

    federation protocol list
[--identity-provider <identity-provider>]

更新结盟协议

    federation protocol set
[--identity-provider <identity-provider>]
[--mapping <mapping>]
<name>

查看单个结盟协议明细

    federation protocol show
[--identity-provider <identity-provider>]
<name>

列出已结盟的域

    federation domain list 

列出已结盟的项目

    federation project list 

六. 用户组(group )相关的操作

为用户组添加用户

    group add user
<group>
<user>

验证用户组是否包含某个用户

    group contains user
<group>
<user>

创建用户组

    group create
[--domain <group-domain>]
<group-name>

删除用户组

    group delete
[--domain <domain>]
<group> [<group> ...]

列出所有用户组

    group list
[--domain <domain>]
[--user <user>]

从用户组种删除用户

    group remove user
<group>
<user>

更新用户组

    group set
[--name <new-group-name>]
[--domain <group-domain>]
[--description <group-description>]
<group>

查看单个用户组明细

    group show
<group>

七. 身份提供方(identity provider )相关的操作

创建身份提供方

    identity provider create
[--description <description>]
[--enable | --disable]
<identity-provider-id>

删除身份提供方

    identity provider delete
<identity-provider-id>

更新身份提供方

    identity provider set
[--enable | --disable]
<identity-provider-id>

查看单个身份提供方明细

    identity provider show
<identity-provider-id>

列出所有身份提供方

    identity provider list 

八. 映射(mapping )相关操作

创建映射

    mapping create
[--rules <rules>]
<name>

删除映射

    mapping delete
<name>

更新映射

    mapping set
[--rules <rules>]
<name>

查看单个映射明细

    mapping show
<name>

列出所有映射

    mapping list 

九. 策略(policy )相关操作

创建策略

    policy create
[--type <policy-type>]
<blob-file>

删除策略

    policy delete
<policy-id>

列出所有策略

    policy list
[--include-blob]

更新策略

    policy set
[--type <policy-type>]
[--blob-file <blob_file>]
<policy-id>

查看单个策略明细

    policy show
<policy-id>

十. 项目(project )相关操作

创建项目

    project create
[--domain <project-domain>]
[--description <project-description>]
[--enable | --disable]
[--property <key=value>]
<project-name>

删除项目

    project delete
<project>

列出所有项目

    project list
[--long]
[--domain <project-domain>]

更新项目

    project set
[--name <new-project-name>]
[--domain <project-domain>]
[--description <project-description>]
[--enable | --disable]
[--property <key=value>]
<project>

列出所有项目

    project usage list 

查看单个项目明细

    project show
<project>

十一. 物理域(region )相关操作

创建物理域

    region create
[--parent-region <parent-region>]
[--description <region-description>]
[--url <region-url>]
<region-id>

列出所有物理域

    region list
[--parent-region <parent-region>]

删除某个物理域

    region delete
<region-id>

查看某个物理域明细

    region show
<region-id>

更新物理域

    region set
[--parent-region <parent-region>]
[--description <region-description>]
[--url <region-url>]
<region>

十二. 角色(role)相关的操作

创建角色

    role create
<role-name>

删除角色

    role delete
<role> [<role> ...]

列出所有角色

    role list
[--domain <domain> | --project <project>]
[--user <user> | --group <group>]

更新角色

    role set
[--name <new-role-name>]
<role>

查看单个角色明细

    role show
<role>

授予用户角色

role add
[--user <user> | --group <group>]
[--domain <domain> | --project <project>]
<role>

撤销用户角色

    role remove
[--domain <domain> | --project <project>]
[--user <user> | --group <group>]
<role>

列出所有角色授予记录

    role assignment list
[--effective]
[--role <role>]
[--user <user> | --group <group>]
[--domain <domain> | --project <project>]

  其中

    --effective 只返回 effective role assignments

十三. 服务(service )相关操作

创建服务

    service create
[--name <service-name>]
[--enable | --disable]
<service-type>

删除服务

    service delete
<service> <service> -- Service to delete (type or ID)

列出所有服务

    service list 

更新服务

    service set
[--type <service-type>]
[--name <service-name>]
[--enable | --disable]
<service>

查看单个服务明细

    service show
<service>

十四. 用户(user )相关操作

创建用户

    user create
[--password <user-password>]
[--project <project>]
[--domain <domain>]
[--enable | --disable]
<user-name>

删除用户

    user delete
[--domain <domain>]
<user> [<user> ...]

列出所有用户

    user list
[--domain <domain>]
[--group <group> | --project <project>]
[--long]

更新用户

    user set
[--name <new-user-name>]
[--password <user-password>]
[--password-prompt]
[--email <user-email>]
[--domain <domain>]
[--project <project>]
[--description <description>]
[--enable | --disable]
<user>

修改当前用户密码

    user password set
[--password <password>]

查看单个用户明细

    user show
[--domain <domain>]
<user>

十五. oauth相关操作

授权请求令牌

    request token authorize
[--request-key <request-key>]
[--role-ids <role-ids>]

创建请求令牌

    request token create
[--consumer-key <request-key>]
[--consumer-secret <consumer-secret>]
--project-id <project-id>

创建访问令牌

    access token create
[--consumer-key <consumer-key>]
[--consumer-secret <consumer-secret>]
[--request-key <request-key>]
[--request-secret <request-secret>]
[--verifier <verifier>]

签发令牌

    token issue 

 

使用openstackclient调用Keystone v3 API的更多相关文章

  1. OpenStack Keystone v3 API新特性

    原连接 http://blog.chinaunix.net/uid-21335514-id-3497996.html keystone的v3 API与v2.0相比有很大的不同,从API的请求格式到re ...

  2. OpenStack IdentityService Keystone V3 API Curl实战

    v3 API Examples Using Curl <Tokens> 1,Default scope 获取token Get an token with default scope (m ...

  3. Keystone V3 API Examples

    There are few things more useful than a set of examples when starting to work with a new API. Here a ...

  4. &lbrack;转&rsqb;OpenStack Keystone V3

    Keystone V3 Keystone 中主要涉及到如下几个概念:User.Tenant.Role.Token.下面对这几个概念进行简要说明. User:顾名思义就是使用服务的用户,可以是人.服务或 ...

  5. OpenStack Keystone V3 简介

    Keystone V3 简介 Keystone 中主要涉及到如下几个概念:User.Tenant.Role.Token.下面对这几个概念进行简要说明. User:顾名思义就是使用服务的用户,可以是人. ...

  6. 在Keystone V3基础上改进的分布式认证体系

    目标 使用java实现keystone v3相关功能与概念: api client authentication service discovery distributed multi-tenant ...

  7. C&num;调用百度地图 api

    转  http://blog.csdn.net/kkkkkxiaofei/article/details/8663377 这一篇,记录一下我调用的地图API实现的功能.下面介绍的都是一些片段的节选,不 ...

  8. &lbrack;转&rsqb;Setting Keystone v3 domains

    http://www.florentflament.com/blog/setting-keystone-v3-domains.html The Openstack Identity v3 API, p ...

  9. C&num;调用百度地图API经验分享(四)

    这一篇,记录一下我调用的地图API实现的功能.下面介绍的都是一些片段的节选,不能直接复制就运行.在实现之前肯定要加载地图,先放一个webbroser控件,然后如下: private void Form ...

随机推荐

  1. 用hexdump获取event的输出信息

    当我们在调试输入设备时,如:键盘,触摸屏 会使用到hexdump工具.其内容如下: 1. 键盘: # cat /dev/input/event0 | hexdump 0000000 f6a6 4e15 ...

  2. Vijos1056 图形面积

    描述 桌面上放了N个平行于坐标轴的矩形,这N个矩形可能有互相覆盖的部分,求它们组成的图形的面积. 格式 输入格式 输入第一行为一个数N(1≤N≤100),表示矩形的数量.下面N行,每行四个整数,分别表 ...

  3. 50个实用的jQuery代码段让你成为更好的Web前端工程师

    本文会给你们展示50个jquery代码片段,这些代码能够给你的javascript项目提供帮助.其中的一些代码段是从jQuery1.4.2才开始支持的做法,另一些则是真正有用的函数或方法,他们能够帮助 ...

  4. 网络流&lpar;最大流&rpar; POJ 1637 Sightseeing tour

    Sightseeing tour Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8628   Accepted: 3636 ...

  5. ferror,clearerr和EOF含义

    1.我们并不是实时操纵文件,也不是实时生效,它依赖于缓冲区.非缓冲模式编程与常规区别,就是实时与不实时的区别. 2.//fgetc fputc, fgets fputs, fgetwc fputwc, ...

  6. lr-web services协议

    1.web services协议简介 web services协议是建立可交互操作的分布式应用程序的新平台,它通过一系列标准和协议来保证程序之间的动态链接,其中最基本的协议包括soap,wsdl,ud ...

  7. java基础题刷题中的知识点复习

    将变量转换为字符串方法:(String)待转对象..toString().String.valueOf(待转对象) 对字符串进行操作的方法,使用StringBuffer和StringBuilder定义 ...

  8. 页面倒计时跳转页面效果,js倒计时效果

    页面倒计时跳转页面效果,js倒计时效果 >>>>>>>>>>>>>>>>>>>> ...

  9. linux下redis的最佳实践&lpar;Master-Slave&rpar;

    本文演示了redis在同一台linux上的安装及运行多个实例,并演示了主从复制,以及如何进行主从的切换. 1. 下载 $ wget http://download.redis.io/releases/ ...

  10. FW 执行Git命令时出现各种 SSL certificate problem 的解决办法

    比如我在windows下用Git clone gitURL 就提示  SSL certificate problem: self signed certificate 这种问题,在windows下出现 ...