OpenStack雲第三天
部署OpenStack Identity服務。
繼OpenStack雲第二天,本文翻譯自OpenStack安裝與部署指南第五章内容,内容主要是安裝OpenStack Identity Service(身份認證服務) 。OpenStack Identity服務負責管理使用者與客戶,項目以及提供為其他OpenStack元件提供通用身份認證系統。
目錄:
一、基本概念
二、安裝與配置Identity服務
三、驗證
身份認證服務包括兩個主要功能:
使用者管理:時時跟蹤使用者以及使用者被賦予了什麼權限。
服務編錄:提供一份可用服務的目錄并可以定位這些服務的API。
1.1 使用者管理
Identity使用者管理包括三個主要概念:
使用者(Users)
租戶(Tenants)
角色(Roles)
使用者表示擁有使用者名,密碼,郵箱等帳号資訊的自然人。這裡給出建立使用者名為"alice”的使用者:
租戶可以被了解為一個項目,團隊或組織。你必須指定一個相應的租戶(tenant)才可以申請OpenStack服務,例如你指定以某租戶申請Compute服務來查詢目前運作的執行個體清單,則你将收到的是該租戶的運作執行個體清單。這裡是建立一個名為"acme”租戶的例子:
$ keystone tenant-create --name=acme
注意事項:由于在早期的版本中使用項目術語來表示租戶,是以有些指令行工具使用--project_id替代--tenant_id給客戶配置設定一個ID号。
角色代表特定的租戶中的使用者使用者操作權限,可以使用如下指令建立角色:
$ keystone role-create --name=compute-user
譯者批注:你可以了解租戶為那些使用你雲環境的客戶,這些客戶可以是一個項目組、工作組、公司,這些客戶中會建立不同的帳号(使用者)及其對應的權限(角色).
Identity服務将使用者與租戶及角色結合在一起,繼續剛才的例子,我們也許希望在acme租戶中為alice使用者配置設定compute-user角色。
$ keystone user-list
+---------------------------------+----------+------+-------+
|id | enabled | email | name |
+----------------------------------+----------+------+-------+
| 96a6ebba0d4c441887aceaeced892585 | True | ... | alice |
$ keystone role-list
+----------------------------------+------------------+
|id | name |
| f8dd5a2e4dc64a41b96add562d9a764e | compute-user |
$ keystone tenant-list
+----------------------------------+-------+----------+
| id | name | enabled |
| 2395953419144b67955ac4bab96b8fd2 | acme | True |
$ keystone user-role-add \
--user=96a6ebba0d4c441887aceaeced892585 \
--role=f8dd5a2e4dc64a41b96add562d9a764e \
--tenant_id=2395953419144b67955ac4bab96b8fd2
一個使用者可以在不同的租戶中被配置設定不同的角色,例如Alice也可以在Cyberdyne租戶中使用者admin角色。一個使用者也可以在同一個租戶中配置設定多個角色。
/etc/[服務代碼名稱]/policy.json控制着哪些使用者可以擁有什麼樣的服務,如:/etc/nova/policy.json定義了Compute服務的通路政策,/etc/glance/policy.json定義Image服務的通路政策,以及/etc/keystone/policy.json定義Identity服務的通路政策。
Compute,Identity,Image服務的預設policy.json檔案僅識别admin角色:所有的操作無需admin角色即可被租戶中擁有任何角色的使用者均可以通路。
如果你希望限制使用者在Compute服務中所執行的操作,你需要在Identity服務中建立一個角色并修改/etc/nova/policy.json,實作僅提供該角色才可以執行Compute操作。
執行個體,以下在/etc/nova/policy.json中的配置設定卷建立的操作對使用者無任何限制,在租戶中的使用者使用者任何角色均可以建立卷。
"volume:create": [],
如果你需要僅擁有compute-user角色的使用者才可以建立卷,你就需要添加一行”role:compute-user”,具體配置如下:
"volume:create": ["role:compute-user"],
如我們需要對所有Compute服務的請求均需要指定的角色,你的配置檔案應該作類似于如下這樣的配置:
{
"admin_or_owner": [["role:admin"], ["project_id:%(project_id)s"]],
"default": [["rule:admin_or_owner"]],
"compute:create": ["role":"compute-user"],
"compute:create:attach_network": ["role":"compute-user"],
"compute:create:attach_volume": ["role":"compute-user"],
"compute:get_all": ["role":"compute-user"],
"admin_api": [["role:admin"]],
"compute_extension:accounts": [["rule:admin_api"]],
"compute_extension:admin_actions": [["rule:admin_api"]],
"compute_extension:admin_actions:pause": [["rule:admin_or_owner"]],
"compute_extension:admin_actions:unpause": [["rule:admin_or_owner"]],
"compute_extension:admin_actions:suspend": [["rule:admin_or_owner"]],
"compute_extension:admin_actions:resume": [["rule:admin_or_owner"]],
"compute_extension:admin_actions:lock": [["rule:admin_api"]],
"compute_extension:admin_actions:unlock": [["rule:admin_api"]],
"compute_extension:admin_actions:resetNetwork": [["rule:admin_api"]],
"compute_extension:admin_actions:injectNetworkInfo": [["rule:admin_api"]],
"compute_extension:admin_actions:createBackup": [["rule:admin_or_owner"]],
"compute_extension:admin_actions:migrateLive": [["rule:admin_api"]],
"compute_extension:admin_actions:migrate": [["rule:admin_api"]],
"compute_extension:aggregates": [["rule:admin_api"]],
"compute_extension:certificates": ["role":"compute-user"],
"compute_extension:cloudpipe": [["rule:admin_api"]],
"compute_extension:console_output": ["role":"compute-user"],
"compute_extension:consoles": ["role":"compute-user"],
"compute_extension:createserverext": ["role":"compute-user"],
"compute_extension:deferred_delete": ["role":"compute-user"],
"compute_extension:disk_config": ["role":"compute-user"],
"compute_extension:extended_server_attributes": [["rule:admin_api"]],
"compute_extension:extended_status": ["role":"compute-user"],
"compute_extension:flavorextradata": ["role":"compute-user"],
"compute_extension:flavorextraspecs": ["role":"compute-user"],
"compute_extension:flavormanage": [["rule:admin_api"]],
"compute_extension:floating_ip_dns": ["role":"compute-user"],
"compute_extension:floating_ip_pools": ["role":"compute-user"],
"compute_extension:floating_ips": ["role":"compute-user"],
"compute_extension:hosts": [["rule:admin_api"]],
"compute_extension:keypairs": ["role":"compute-user"],
"compute_extension:multinic": ["role":"compute-user"],
"compute_extension:networks": [["rule:admin_api"]],
"compute_extension:quotas": ["role":"compute-user"],
"compute_extension:rescue": ["role":"compute-user"],
"compute_extension:security_groups": ["role":"compute-user"],
"compute_extension:server_action_list": [["rule:admin_api"]],
"compute_extension:server_diagnostics": [["rule:admin_api"]],
"compute_extension:simple_tenant_usage:show": [["rule:admin_or_owner"]],
"compute_extension:simple_tenant_usage:list": [["rule:admin_api"]],
"compute_extension:users": [["rule:admin_api"]],
"compute_extension:virtual_interfaces": ["role":"compute-user"],
"compute_extension:virtual_storage_arrays": ["role":"compute-user"],
"compute_extension:volumes": ["role":"compute-user"],
"compute_extension:volumetypes": ["role":"compute-user"],
"volume:create": ["role":"compute-user"],
"volume:get_all": ["role":"compute-user"],
"volume:get_volume_metadata": ["role":"compute-user"],
"volume:get_snapshot": ["role":"compute-user"],
"volume:get_all_snapshots": ["role":"compute-user"],
"network:get_all_networks": ["role":"compute-user"],
"network:get_network": ["role":"compute-user"],
"network:delete_network": ["role":"compute-user"],
"network:disassociate_network": ["role":"compute-user"],
"network:get_vifs_by_instance": ["role":"compute-user"],
"network:allocate_for_instance": ["role":"compute-user"],
"network:deallocate_for_instance": ["role":"compute-user"],
"network:validate_networks": ["role":"compute-user"],
"network:get_instance_uuids_by_ip_filter": ["role":"compute-user"],
"network:get_floating_ip": ["role":"compute-user"],
"network:get_floating_ip_pools": ["role":"compute-user"],
"network:get_floating_ip_by_address": ["role":"compute-user"],
"network:get_floating_ips_by_project": ["role":"compute-user"],
"network:get_floating_ips_by_fixed_address": ["role":"compute-user"],
"network:allocate_floating_ip": ["role":"compute-user"],
"network:deallocate_floating_ip": ["role":"compute-user"],
"network:associate_floating_ip": ["role":"compute-user"],
"network:disassociate_floating_ip": ["role":"compute-user"],
"network:get_fixed_ip": ["role":"compute-user"],
"network:add_fixed_ip_to_instance": ["role":"compute-user"],
"network:remove_fixed_ip_from_instance": ["role":"compute-user"],
"network:add_network_to_project": ["role":"compute-user"],
"network:get_instance_nw_info": ["role":"compute-user"],
"network:get_dns_domains": ["role":"compute-user"],
"network:add_dns_entry": ["role":"compute-user"],
"network:modify_dns_entry": ["role":"compute-user"],
"network:delete_dns_entry": ["role":"compute-user"],
"network:get_dns_entries_by_address": ["role":"compute-user"],
"network:get_dns_entries_by_name": ["role":"compute-user"],
"network:create_private_dns_domain": ["role":"compute-user"],
"network:create_public_dns_domain": ["role":"compute-user"],
"network:delete_dns_domain": ["role":"compute-user"]
}
1.2 服務管理
服務管理有兩個主要的概念:
服務
終端
Identity服務同時維護着一份與各個服務相同的使用者(如:Compute服務有一個對應的使用者名nova),以及一個名為service的特殊服務租戶。
2.1.安裝Identity服務
你可以安裝Identity服務在任何能被其他服務主機通路的伺服器上,以root身份運作如下指令:
# yum install openstack-utils openstack-keystone
安裝後,你需要删除sqlite資料庫并修改配置檔案将其指向MySQL資料庫。這樣的配置更容易部署多個Keystone前段指向相同的後端資料庫伺服器。
删除/var/lib/keystone目錄下的keystone.db檔案。
備注:據譯者親身實驗,使用以上的yum源安裝時該檔案并不會産生,省去了删除檔案的步驟。
配置生産環境的資料庫存儲來取代預設的目錄功能以備份服務及終端資料,這裡以MySQL為例。
安裝MySQL(需要root權限):
# yum install mysql mysql-server
安裝過程中會提示為mysql的root帳号設定密碼,根據提示設定密碼。
設定Mysql為開機啟動程序:
# chkconfig --level 2345 mysqld on
# service mysqld start
以下系列指令将建立一個名為"keystone”的資料庫,以及一個名為"keystone”的mysql使用者名,該使用者擁有通路keystone資料庫的所有權限。預設,密碼與使用者名同名。
在Fedora,RHEL,CentOS系統上,你可以通過openstack-db指令建立Keystone資料庫。
$ duso openstack-db --init --service keystone
也可以通過手動的方式建立資料庫。
$ mysql -u root -p
根據提示:需要輸入mysql root的密碼,建立keystone資料庫。
mysql> CREATE DATABASE keystone;
接着再建立一個對建立keystone資料庫具有完全權限的mysql賬戶,注意為使用者選擇安全的密碼,方法參考以下指令。
mysql> GRANT ALL ON keystone.* TO 'keystone’@'%’ IDENTIFIED BY ‘你的密碼’;
退出MySQL資料庫: mysql> quit
回想以下,我們在OpenStack第二天文檔中對雲環境的構思中建設雲控制節點的IP為192.168.106.130。
現在一個Keystone已經安裝完成,你可以通過主配置檔案修改配置(/etc/keystone/keystone.conf),以及通過指令行初始化資料。預設Keystone的資料儲存在sqlite中,在/etc/keystone/keystone.conf修改如下一行connection定義來改變資料存儲位置:
connection = mysql://keystone:[密碼]@192.168.206.130/keystone
備注:據譯者親身實驗,現在的keystone版本預設就将資料庫指向了本機的MySQL資料庫。
同時,要確定keystone.conf檔案中配置了合适的服務辨別符,你可以使用自己的随機字串,像下面這樣:
admin_token = 012345SECRET99TOKEN012345
或者通過指令行設定随機字串:
$ export ADMIN_TOKEN=$(openssl rand -hex 10)
$ sudo openstack-config --set /etc/keystone/keystone.conf DEFAULT admin_token $ADMIN_TOKEN
譯者備注:export ADMIN_TOKEN=$(openssl rand -hex 10)是調用openssl指令産生10位随機字串,并将結果賦予ADMIN_TOKEN全局變量;再通過openstack-config指令修改keystone.conf配置檔案就admin_token參數的取值為剛剛定義的全局變量ADMIN_TOKEN的值(10位随機字串)。
下一步,重新開機keystone服務,并設定為開機啟動項。
$ sudo service keystone restart && sudo chkconfig keystone on
譯者備注:在新的版本中keystone的啟動腳本不是keystone,而是openstack-keystone,是以實際工作中你需要将以上指令修改為sudo service openstack-keystone restart && sudo chkconfig openstack-keystone on
最後初始化新的keystone資料庫,需要root權限:
# keystone-manage db_sync
2.2.配置Identity服務
設定租戶,使用者與角色,你最少需要定義一個租戶、使用者、角色以通過Identity服務的身份驗證與授權獲得其他服務。
腳本配置:
在Fedora,RHEL或CentOS系統上,你可以通過運作腳本更新資料。
$ sudo ADMIN_PASSWORD=$OS_PASSWORD SERVICE_PASSWORD=servicepass openstack-keystone-sample-data
譯者注:系統指令openstack-keystone-sample-data運作的就是位于/usr/share/openstack-keystone目錄下的sample_data.sh腳本。
此外,任何使用者pyton工具的分布,都可以通過keystone用戶端的API運作keystone-init腳本完成初始化動作。
$ git clone https://github.com/nimbis/keystone-init.git
為你的伺服器編輯config.yaml檔案中的IP位址,你可以在config.yaml目錄下運作以下指令快速替換:
$ sed -i.bak s/192.168.206.130/172.16.150.12/g config.yaml
譯者備注:sed将把config.yaml檔案中所有的192.168.206.130替換為172.16.150.12,生成一份新的config.yaml,老的檔案自動備份為config.yaml.bak。
使用root身份運作腳本:
# ./keystone-init.py config.yaml
手動配置
這裡我們可以無需腳本、手動配置這些步驟。首先我們建立一個預設tenant(租戶),名字叫openstackDemo。
$ keystone --token 012345SECRET99TOKEN012345 \
tenant-create \
--name openstackDemo \
--description "Default Tenant" \
--enabled true
建立名為adminUser的預設使用者:
$keystone --token 012345SECRET99TOKEN012345 \
user-create \
--tenant_id b5815b046cfe47bb891a7b64119e7f80 \
--name adminUser \
--pass secretword --enabled true
譯者備注:英文原文此處有誤,指令建立的是adminUser,結果顯示name的值為admin。
建立預設角色,admin與memberRole
role-create \
--name admin
role-create \
--name memberRole
通過uesr-role-add指令選項,在openstackDemo租戶中為adminUser使用者賦予admin的角色。
user-role-add \
--user a4c2d43f80a549a19864c89d759bb3fe \
--tenant_id b5815b046cfe47bb891a7b64119e7f80 \
--role e3d9d157cc95410ea45d23bbbc2e5c10
這條指令沒有輸出。
建立一個服務租戶,這個租戶中包括我們已知的所有服務的服務目錄。
tenant-create \
--name service \
--description "Service Tenant" \
--enabled true
在Service租戶中建立Glance Service使用者,我們将在Keystone服務目錄中為所有的服務都添加這樣的使用者。
$keystone --token 012345SECRET99TOKEN012345 \
user-create \
--tenant_id eb7e0c10a99446cfa14c244374549e9d \
--name glance \
--pass glance \
<a href="http://manual.blog.51cto.com/attachment/201208/27/3300438_13460281748iou.png"></a>
在service租戶中為使用者glance配置設定admin的角色。
--user 46b2667a7807483d983e0b4037a1623b \
--tenant_id eb7e0c10a99446cfa14c244374549e9d \
這個指令沒有輸出。
在Service租戶中建立一個Nova Service使用者:
--name nova \
--pass nova \
在service租戶中為nova使用者配置設定admin的角色。
user-role-add \
--user 54b3776a8707834d983e0b4037b1345c \
--tenant_id eb7e0c10a99446cfa14c244374549e9d \
在Service租戶中建立EC2 Service使用者:
--name ec2 \
--pass ec2 \
在service租戶中為ec2使用者配置設定admin的角色:
--user 32e7668b8707834d983e0b4037b1345c \
在Service租戶中建立Object Storage服務使用者:
--name swift \
--pass swiftpass \
在service租戶中為swift使用者配置設定admin的角色:
--user 4346677b8909823e389f0b4037b1246e \
後面我們還需要建立服務的定義。
為了使Keystone内置的S3 API與Swift相容,請確定在keystone.conf檔案中定義一個新的過濾器并啟用:
定義過濾:
[filter:s3_extension]
paste.filter_factory = keystone.contrib.s3:S3Extension.factory
更新admin_api管道:
将
[pipeline:admin_api]
pipeline = token_auth admin_token_auth xml_body json_body debug ec2_extension crud_extension admin_service
更改為:
pipeline = token_auth admin_token_auth xml_body json_body debug ec2_extension s3_extension crud_extension admin_service
2.3.定義服務
Keystone還擔任着服務編錄的角色,為其他的OpenStack系統指定哪裡有相關的API終端位置。尤其是OpenStack的控制台(Dashborad)更需要這個編錄的服務。
譯者備注:Keystone的服務編錄類似于系統資料庫,在這裡我們把OpenStack所有服務的endpoint(終端)寫入服務編錄中,服務之間的調用需要經過Keystone的驗證,并通過這個服務編錄找到目标服務的終端(endpoint)位置。
使用keystone定義服務的方式有兩種:
使用模版檔案定義服務
使用後端資料庫定義服務
使用模版檔案的方式因為其比較簡單,但除非是像DevStack這樣的開發環境否則我們并不推薦使用這種模式。使用模版檔案不支援通過keystone指令對服務編錄執行CRUD操作,但不妨礙你使用service-list指令。而後端資料庫則是一種更可靠的、高可用、提供資料備援的方式。這節我們将描述如何使用後端資料庫架構服務編錄,你需要将/etc/keystone/keystone.conf檔案中的[catalog]選項修改為如下這種配置:
[catalog]
driver = keystone.catalog.backends.sql.Catalog
Keystone服務編錄條目的要素
對于目錄中的每個服務條目,你都需要執行兩個keystone操作:
1).使用keystone service-create指令為服務建立資料庫條目,指令選項如下:
--name 服務名稱(如:nova,ec2,glance,keystone)
--type 服務類型(如:compute,ec2,image,idnetity)
--description 服務描述(如:"Nova Compute Servece”)
2).使用keystone endpoint-create指令建立資料庫條目,描述用戶端如果連接配接不同類型的服務,即指定各個服務的終端位置,指令選項如下:
--region 你為OpenStack雲取的區域名稱(如:RegionOne)
--service_id 通過keystone service-create指令傳回的服務ID(如:935fd37b6fa74b2f9fba6d907fa95825)
--internalurl 服務終端對内提供的URL(典型案例是使用與publicurl相同的值)
--adminurl 提供服務管理界面的URL
Keystone允許URL使用變量,這些變量在運作期間會自動替換為正确的,例如使用類似于tenant_id這樣的變量。你可以使用%(變量名)或$(變量名)辨別正在使用變量。
建立keystone服務與服務終端(service endpoints)
這裡我們會定義服務及其終端。
定義Identity服務:
service-create \
--name=keystone \
--type=identity \
--description="Keystone Identity Service"
endpoint-create \
--region RegionOne \
--service_id=15c11a23667e427e91bc31335b45f4bd \
--adminurl=http://192.168.206.130:35357/v2.0
定義Compute服務,需要為不同的租戶(tenant)需要獨立的endpoint,這裡我們使用上節建立的service租戶(tenant)。
--name=nova \
--type=compute \
--description="Nova Compute Service"
--service_id=abc0f03c02904c24abdcc3b7910e2eed \
--adminurl='http://192.168.206.130:8774/v2/%(tenant_id)s'
定義卷(Volume)服務,不同的tenant需要獨立的endpoint:
--name=volume \
--type=volume \
--description="Nova Volume Service"
--service_id=1ff4ece13c3e48d8a6461faebd9cd38f \
--adminurl='http://192.168.206.130:8776/v1/%(tenant_id)s'
定義鏡像服務(Image service):
--name=glance \
--type=image \
--description="Glance Image Service"
--service_id=7d5258c490144c8c92505267785327c1 \
--adminurl=http://192.168.206.130:9292/v1
定義EC2相容服務:
--name=ec2 \
--type=ec2 \
--description="EC2 Compatibility Layer"
--service_id=181cdad1d1264387bcc411e1c6a6a5fd \
--adminurl=http://192.168.206.130:8773/services/Admin
定義Object Storage服務:
--name=swift \
--type=object-store \
--description="Object Storage Service"
--service_id=272efad2d1234376cbb911c1e5a5a6ed \
--internalurl 'http://127.0.0.1:8080/v1/AUTH_%(tenant_id)s'
Keystone的日志檔案為/var/log/keystone.log,如果需要排除可以檢視該檔案。
三、驗證
安裝curl,一個運作REST API請求的指令行工具,同時還需要安裝openssl,通過yum安裝可以解決依賴包問題:
# yum install curl openssl
你可以運作如下指令,確定你的Identity服務可以正常工作:
curl -d '{"auth": {"tenantName": "adminTenant", "passwordCredentials":{"username": "adminUser", "password": "secretword"}}}' \
作為adminUser使用者,你将收到如下響應:
"access": {
"serviceCatalog": {},
"token": {
"expires": "2012-04-12T00:40:12Z",
"id": "cec68088d08747639c682ee5228106d1"
},
"user": {
"id": "6b0141904f09480d810a5949d79ea0f3",
"name": "adminUser",
"roles": [],
"roles_links": [],
"username": "adminUser"
或者你可以運作以下指令:
curl -d '{"auth": {"tenantName": "openstackDemo", "passwordCredentials":{"username": "adminUser", "password": "secretword"}}}' \
你會收到類似于如下的資訊:
"expires": "2012-04-12T00:41:21Z",
"id": "a220bfdf313b404fa5e063fcc7cc1f3e",
"tenant": {
"description": "Default Tenant",
"enabled": true,
"id": "50af8cc655c24ada96f73010c96b70a2",
"name": "openstackDemo"
這裡另外還有一種快速的方法判斷Keystone是否工作正常。首先,需要設定如下環境變量:
export ADMIN_TOKEN=012345SECRET99TOKEN012345
export OS_USERNAME=adminUser
export OS_PASSWORD=secretword
export OS_TENANT_NAME=openstackDemo
export OS_AUTH_URL=http://127.0.0.1:5000/v2.0/
通過輸入keystone user-list指令,你可以看到使用者清單。
$ keystone user-list
未完待續… …
本文轉自丁丁曆險51CTO部落格,原文連結:http://blog.51cto.com/manual/973921 ,如需轉載請自行聯系原作者