1. 程式人生 > >Openstack元件部署 — 將一個自定義 Service 新增到 Keystone

Openstack元件部署 — 將一個自定義 Service 新增到 Keystone

目錄

Keystone 認證流程

  1. User 使用憑證(username/password) 到 keystone 驗證並獲得一個臨時的 Token 和 Generic catalog(全域性目錄),臨時的 Token 會儲存在 keystone-client(cache UUID locally) 和 keystone-backend 中。
  2. User 使用這個臨時 Token 傳送給 keystone 並獲得一個該 User 能訪問的 Tenants 列表
  3. User 再跟 keystone 傳送一個請求,表明希望訪問的 Tenants
  4. keystone 就會向 User 傳送一個管理這個 Tenants 的 Services 列表和允許訪問這個 Tenants 的 Token (Tenants Token)
  5. User 會通過這個 Services 和 Generic catalog(全域性目錄) 對映找到 Services 的 endpoint,並通過 endpoint 找到實際 Services 元件的位置
  6. 然後 User 再拿著 Tenant Token 和 endpoint 來訪問實際上的 Service 組
  7. Service 元件會拿著這個 User-Tennat Token 對到 keystone 做進一步的驗證(Openstack 要保證每一步操作都是安全的)
  8. 如果通過了 7. 的驗證的話,keystone 會返回一系列的確認資訊和附加資訊(User 希望操作的內容)給 Services
  9. 最後 Services 執行一系列的操作

讓 Keystone 為一個新的專案 Service 提供驗證功能

  • 在新專案的配置檔案中指定使用 Keytone 認證方式
[keystone_authtoken]

auth_uri = http://<keystone_service_ip>:5000
project_domain_id = default
project_name = service
user_domain_id = default
password = fanguiju
username = <new_service_name>
auth_url = http://<keystone_service_ip>:35357
auth_plugin = password

該配置項的意義:
Because most OpenStack services must access the Identity Service, you must configure the IP address of the keystone server to be able to access it. You must also configure the admin_tenant_name, admin_user, and admin_password options for each service to work.

簡而言之, 就是讓每個不同的 Openstack Service 都使用一個特定的註冊在 Keystone 中的 User 去訪問 Keystone Service 並請求獲得驗證服務. 並且該配置項還指定了該專案屬於的 Project(資源), 也就是早期版本中的 Tenant. 這裡設定的是: 該專案屬於 Tenant service. 這個在之後我們會使用到.

  • 所以, 我們首先需要為這個新的專案在 Keystone 中註冊一個使用者.
[email protected]:~/devstack$ keystone user-create --name <new_service_name> --pass fanguiju --enabled true

[email protected]:~/devstack$ openstack user list
+----------------------------------+----------+
| ID                               | Name     |
+----------------------------------+----------+
| 135b2cb86962401c82044fd4ca9daae4 | admin    |
| 40d75aebc9c34978b23081f8c8ca9af5 | <new_service_name>     |
| 626110b81b2b4509becafc1964121b7f | nova     |
| 85c6b9fa9127439880276f070c60dad6 | demo     |
| 887a5e92599847698c1f601d0f337421 | glance   |
| 9dc44b1518184c2cacecb2d2f9f8b050 | alt_demo |
| b340851dd5a24eb39a2383bb3f1ff36c | cinder   |
+----------------------------------+----------+
  • 因為新的專案的Service 屬於 Tenant service, 所以需要在這個 Tenant 中註冊該專案的 Service
[email protected]:~/devstack$ openstack service create --name <new_service_name> --description "<new_service_name> Service" recovery
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | <new_service_name> Service                     |
| enabled     | True                             |
| id          | c22ebcb4cdd24114a2d581ce18cdd0ca |
| name        | <new_service_name>                             |
| type        | recovery                         |
+-------------+----------------------------------+

[email protected]:~/devstack$ openstack service list
+----------------------------------+-------------+----------------+
| ID                               | Name        | Type           |
+----------------------------------+-------------+----------------+
| 1cfc85bed3e84f2b93c5a9b9c293e1ed | cinder      | volume         |
| 348c1b372deb4c3fa817d340b439728b | ec2         | ec2            |
| 3fa397c2b5d647389edae03515c64583 | nova        | compute        |
| 41cfab784e6942189c8dc48fbda59c4e | glance      | image          |
| 7b534b13bd024a04b44f6eeee882208a | keystone    | identity       |
| 9b8de3d592054fc9b6b992be056ffd0a | nova_legacy | compute_legacy |
| aed90494567e4deababddd494fc33338 | cinderv2    | volumev2       |
| c22ebcb4cdd24114a2d581ce18cdd0ca | <new_service_name>        | recovery       |
+----------------------------------+-------------+----------------+

NOTE: Name 是用於顯示的標識, 實際在 Servces 之間生效的是 Type .

  • 在 Tenant service 中註冊完之後, 還需要建立 endpoint 記錄, 讓不同專案的 Services 之間可以定位到該新專案的服務
[email protected]:~/devstack$ openstack endpoint create --region RegionOne <new_service_name> --publicurl 'http://<new_service_ip>:8760/v1/$(tenant_id)s' --internalurl 'http://<new_service_ip>:8760/v1/$(tenant_id)s' --adminurl 'http://<new_service_ip>:8760/v1/$(tenant_id)s'
+--------------+------------------------------------------+
| Field        | Value                                    |
+--------------+------------------------------------------+
| adminurl     | http://<new_service_ip>:8760/v1/$(tenant_id)s |
| id           | 3c35ecc67e7444648dd079d5c0562f5b         |
| internalurl  | http://<new_service_ip>:8760/v1/$(tenant_id)s |
| publicurl    | http://<new_service_ip>:8760/v1/$(tenant_id)s |
| region       | RegionOne                                |
| service_id   | 513308f8e46944ac8baf1c9758062660         |
| service_name | <new_service_name>                                     |
| service_type | recovery                                 |
+--------------+------------------------------------------+

到目前為止, 其實還沒有完成新專案 Service 的新增, 因為現在為止在 Keystone 中新註冊的 User 是沒有許可權訪問這個 Tenant 的, 那麼自然也無法獲取 Tenant 中的 Services 列表. 所以無法為新專案完成驗證的功能.

  • 將 User 繫結到 Tenant 和 Role 中
# 先獲取 <new_service_id>/<service_id>/<member_id>
openstack user list     # <new_service_id>
keystone tenant-list    # <service_id>
openstack role list     # <member_id>

# 將使用者繫結到 Relo admin 和 Tenant service 中 
keystone user-role-add --user <new_service_id> --role <member_id> --tenant <service_id>
keystone user-role-add --user <new_service_id> --role <admin_id> --tenant <service_id>
  • 驗證 User 的許可權
[email protected]fanguiju:~/devstack$ source openrc <new_user> service
[email protected]fanguiju:~/devstack$ keystone user-list
+----------------------------------+----------+---------+----------------------+
|                id                |   name   | enabled |        email         |
+----------------------------------+----------+---------+----------------------+
| 135b2cb86962401c82044fd4ca9daae4 |  admin   |   True  |                      |
| 9dc44b1518184c2cacecb2d2f9f8b050 | alt_demo |   True  | [email protected] |
| b340851dd5a24eb39a2383bb3f1ff36c |  cinder  |   True  |                      |
| 85c6b9fa9127439880276f070c60dad6 |   demo   |   True  |   [email protected]   |
| 40d75aebc9c34978b23081f8c8ca9af5 |   <new_service_user>   |   True  |                      |
| 887a5e92599847698c1f601d0f337421 |  glance  |   True  |                      |
| 626110b81b2b4509becafc1964121b7f |   nova   |   True  |                      |
+----------------------------------+----------+---------+----------------------+

使用 <new_user> 也能夠訪問完全的 User list, 表示該 User 具有了 admin 的許可權.

最後

小結:
1. Openstack Service 需要一個註冊在 Keystone 中的 User 來訪問 Keystone service
2. Openstack Service 應該屬於 Tenant service 中, 屬於服務資源.
3. 這個 User 對 Tenant service 應該具有 admin 或者 member 許可權, 所以需要將 User/ Tenant service/Role admin 繫結到一起.
4. 為了 Openstack services 之間可以相互訪問, 需要在 service 的 URL 註冊到 endpoint 中.

相關推薦

Openstack元件部署一個定義 Service 新增Keystone

目錄 Keystone 認證流程 User 使用憑證(username/password) 到 keystone 驗證並獲得一個臨時的 Token 和 Generic catalog(全域性目錄),臨時的 Token 會儲存在 keystone-

js一串隨機數字每四位加一個定義符號(格式:1234-5678-90)

方法一:      let string = '1234567890',result = '', index = 0; for(let i=0; i<string.length; i++){      result +=

C# 兩個不同的dataTable合併到一個定義的dataTable中

[csharp]  view plain  copy //比較三種情況        &

v-model語法糖介紹,實現一個定義input元件

html: <template> <div class="jsInput"> <div class="jsInput-content"> <input class="my-input" :type="type" @focus=

Matlab中如何定義)函式作為引數傳遞給另一個函式

原文連結:http://blog.sina.com.cn/s/blog_53f2911901000a1h.html 假如我們編寫了一個積分通用程式,想使它更具有通用性,那麼可以把被積函式也作為一個引數。在c/c++中,可以使用函式指標來實現上邊的功能,在matlab中如何實現呢?使用函式控

C#使用者定義控制元件新增到工具箱中

組裝使用者自定義的窗體 為了複用和便於維護,在C#中如何用已有窗體組裝自己的窗體,並且可以在以後需要的時候隨意拖拽使用? 在專案或專案中的某個資料夾上右鍵——新增——使用者控制元件 然後就可以編輯了。 將使用者自定義控制元件新增到工具箱中, 這樣在以後的專案中

springmvc在處理請求過程中出現異常資訊交由異常處理器進行處理,自定義異常處理器可以實現一個系統的異常處理邏輯。為了區別不同的異常通常根據異常型別自定義異常類,這裡我們建立一個自定義系統異常,如果controller、service、dao丟擲此類異常說明是系統預期處理的異常資訊。

springmvc在處理請求過程中出現異常資訊交由異常處理器進行處理,自定義異常處理器可以實現一個系統的異常處理邏輯。 1.1 異常處理思路 系統中異常包括兩類:預期異常和執行時異常RuntimeException,前者通過捕獲異常從而獲取異常資訊,後者主要通過規範程式碼開發、測試通過手段減少執

springmvc在處理請求過程中出現異常信息交由異常處理器進行處理,自定義異常處理器可以實現一個系統的異常處理邏輯。為了區別不同的異常通常根據異常類型自定義異常類,這裏我們創建一個自定義系統異常,如果controller、service、dao拋出此類異常說明是系統預期處理的異常信息。

ansi req -type this spring 進行 name ext code springmvc在處理請求過程中出現異常信息交由異常處理器進行處理,自定義異常處理器可以實現一個系統的異常處理邏輯。 1.1 異常處理思路 系統中異常包括兩類:預期異常和運行時異常Ru

用Kotlin擼一個定義字母索引控制元件,效能優化

之前App使用Kotlin重構之後,最大的感觸就是kotlin簡潔的語法以及擴充套件函式等特性極大的提升了我們編寫程式碼的速度。 如果說Java是K、T開頭的普通火車的話,那Kotlin就是D、G開頭的動車高鐵了! 嗯,相信我,去用一用吧,絕對很爽。 好了,開

android studio引入一個定義的佈局,定義控制元件,避免每一個活動中都編寫一樣佈局程式碼的問題

本次演示的是標題欄上建立按鈕,即 引入自定義佈局和自定義控制元件的應用十分的廣泛,它的形成的效果很多的應用程式都有,我們可以自定義標題欄,因為普通的標題欄就是一行文字,但是,我們可以發現,很多手機軟體的標題欄上都有返回,或者 進入的按鈕,尤其是全面屏的手機。而且它還能解

[微信小程式]實現一個定義遮罩層元件(完整示例程式碼附效果圖)

 有問題可以掃碼加我微信,有償解決問題。承接小程式開發。 微信小程式開發交流qq群   173683895  、 526474645 ; 正文: 先上效果圖: 點選按鈕Show顯示遮罩層,再次點選

winform中一個定義控制元件呼叫父窗體中的事件

//1定義個委託用來掉方法 MyEventArgs類要你自己寫裡面可以加些你認為有用的屬性,不想用的話可以不加這個引數, public delegate void 相關事件的委託(object sen

手擼一個定義日曆控制元件

引言 日曆控制元件在android開發中也是比較常見的一個控制元件,並且目前大部分開源的日曆控制元件也已經做得很漂亮,很完善了,功能也相當豐富; 今天這個日曆控制元件就是我在別人的基礎上進行修改了的,首先很感謝這個開源庫(https://github.com/c

[WPF定義控制元件] 開始一個定義控制元件庫專案

1. 目標 我實現了一個自定義控制元件庫,並且打算用這個控制元件庫作例子寫一些部落格。這個控制元件庫主要目標是用於教學,希望通過這些部落格初學者可以學會為自己或公司建立自定義控制元件,並且對WPF有更深入的瞭解。 控制元件庫已放在Github上,並且也以釋出到NuGet。 現階段我的目標是實現一些簡單的控

一個ros包下怎麽使用另外一個定義ros包裏的message

com doc pack .cn .html docs ssa ace hit 假設自定義消息包my_message_package https://answers.ros.org/question/206257/catkin-use-ros-message-from-an

創建一個定義比較器

rac void ger 接口 table string pre ride com 雙列集合: -------------| Map 如果是實現了Map接口的集合類,具備的特點: 存儲的數據都是以鍵值對的形式存在的,鍵不可重復,值可以重復。 ---------------

openstack 權限控制 (添加定義角色)keystone等組件

們的 ner req cts 做的 自己 rul 去重 cin 每一個平臺、系統都會對於用戶的權限進行嚴格的管理與控制。 openstack是一個開源的項目,我們可以直接下載其源碼,進行更改以達到我們的要求。 這裏只是針對於用戶的權限進行管理,以keystone: ke

spring-cloud中zuul定義service級別,api級別的路由白名單

als tex let simple 配置 api ring mat ng- 主要實現對在白名單中的service級別或者api級別的網關路由。 一.service和api級別的路由 1.service級別的網關路由 public class ServiceIdWhiteT

Flutter:教你用CustomPaint畫一個定義的CircleProgressBar

  注意:這其實是一篇CustomPaint的使用教程!! 原始碼地址:github.com/yumi0629/Fl…   在Flutter中,CustomPaint就像是Android中的Paint一樣,可以用它繪製出各種各樣的自定義圖形。確實,Paint的使用比較複雜,我覺得直接講API的話也太無聊了

duilib中將xml封裝為控制元件簡單示例(簡單定義控制元件,封裝幾個基本控制元件合為1個定義控制元件)

使用duilib的時候,難免會有這樣的需求: 某一塊Container(Layout)以及裡面的佈局需要重複用,不想每次都複製貼上這麼多,要不然xml太大了; 通過繼承來自定義一個控制元件,比如CButtonUIEx之類的,想讓他像button一樣在xml中被識別; xml裡面的東西