使用openstackclient调用Keystone v3 API

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

     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_VERSION2  
--os-network-api-version <network-api-version>OS_NETWORK_API_VERSION2  
--os-image-api-version <image-api-version>OS_IMAGE_API_VERSION1  
--os-volume-api-version <volume-api-version>OS_VOLUME_API_VERSION1  
--os-identity-api-version <identity-api-version>OS_IDENTITY_API_VERSION2  
--os-object-api-version <object-api-version>OS_OBJECT_API_VERSION1  
--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 3 \
--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 3 \
> --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 2 \
--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 3 \
--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 3 \
--os-auth-type v3password \
--os-username darren \
--os-password 123465 \
--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 tokencreateoauth1
cataloglist, show 
consumercreate, list, set, delete, showoauth1
credentialcreate, list, set, delete, show 
domaincreate, list, set, delete, show 
endpointcreate, list, set, delete, show 
federation projectlistfederation
federation domainlistfederation
federation protocolcreate, list, set, delete, showfederation
group

create, list, set, delete, show

add user, remove user, contains user

 
identity providercreate, list, set, delete, showfederation
mappingcreate, list, set, delete, show 
policycreate, list, set, delete, show 
projectcreate, list, set, delete, show 
regioncreate, list, set, delete, show 
request tokenauthorize, createoauth1
rolecreate, list, set, delete, show, add, remove 
role assignmentlist 
servicecreate, list, set, delete, show 
tokenissue 
trustcreate, list, delete, show 
user passwordset 
usercreate, 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 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值