使用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_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 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 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 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM