OpenStack命令行工具與API
從這一刻起本指南中,我們假設(shè)你已經(jīng)有一個(gè)OpenStack環(huán)境運(yùn)行起來了。本章節(jié)將幫助建立你的工作環(huán)境并使用它來帶領(lǐng)你漫步云端。
命令行工具
我們推薦Openstack命令行工具和Openstack的Dashboard兩者結(jié)合使用。一些用戶由于使用過其他云技術(shù)背景的,可能會(huì)使用EC2兼容的API,相對(duì)于我們需要使用到的Openstack原生的API,這些EC2兼容的API使用了不同命名習(xí)慣。
我們強(qiáng)烈建議你從Python Package Index(PyPI)(https://pypi.python.org/)安裝命令行客戶端,而不是從Ubuntu或者Fedora的軟件包??蛻舳碎_發(fā)的很快,所以有可能在你安裝的時(shí)候,操作系統(tǒng)自帶發(fā)行的軟件包已經(jīng)過時(shí)。”pip”可以從大多數(shù)的linux發(fā)行版里通過”python-pip”這個(gè)軟件包得到,這個(gè)工具是用來管理PyPi的安裝包。每個(gè)Openstack項(xiàng)目有自己的客戶端,所以根據(jù)你使用的服務(wù)選擇某些或者所有以下的軟件包:
- python-novaclient(nova CLI)
- python-glanceclient(glance CLI)
- python-keystoneclient(keystone CLI)
- python-cinderclient(cinder CLI)
- python-swiftclient(swift CLI)
- python-quantumclient(quantum CLI)
安裝工具
使用root從PyPi安裝(升級(jí)):
- # pip install [–upgrade] <package-name>
卸載軟件
- # pip uninstall <package-name>
如果你需要更加新的客戶端版本,可以用pip加-e參數(shù)直接從git庫安裝。你必須為需要安裝的Python egg指定名稱。例如:
- # pip install -e git+https://github.com/openstack/python-novaclient.git#egg=python-novaclient
如果你需要在你的云上支持EC2 API的話,你還需要安裝”euca2ools”軟件包或者一些其他的EC2 API的工具,這樣你可以和你的用戶有相同的視圖。如何使用EC2 API工具超出了這本手冊(cè)的范圍,但是我們會(huì)討論如何得到使用EC2的認(rèn)證。
管理命令行工具
以下是幾種 *-manage命令行工具:
- nova-manage glance-manage keystone-manage cinder-manage
與上文提到的客戶端工具不同,*-manage工具必須在由root在控制節(jié)點(diǎn)上運(yùn)行,因?yàn)檫@些命令需要有訪問配置文件的權(quán)限,例如/etc/nova.conf,并且需要直接查詢數(shù)據(jù)庫而不是通過Openstack的API接口。
-manage工具存在是一個(gè)遺留問題。openstack項(xiàng)目最終的目標(biāo)是把這些遺留的-manage工具移植到正規(guī)的客戶端工具中去。到目前為止,你仍舊需要通過ssh登錄到控制節(jié)點(diǎn)上運(yùn)行*-manage工具進(jìn)行維護(hù)管理操作。
獲取證書
如果你要使用命令行工具對(duì)你的Openstack云平臺(tái)進(jìn)行操作,你必須有合適的證書。目前最方便的得到認(rèn)證證書的方式是使用horizon dashboard。在頂部的導(dǎo)航欄,點(diǎn)擊Setting鏈接,進(jìn)入用戶配置頁面,在頁面里你可以為dashboard視圖設(shè)置語言和時(shí)區(qū)。更重要的是,這個(gè)操作改變了左列的導(dǎo)航欄,里面包含了Openstack API和EC2 Credentials鏈接,這兩個(gè)鏈接將會(huì)得到可以在你的shell環(huán)境中source的文件,文件包含了命令行工具所需要的servide endpoints地址和你的認(rèn)證信息。
點(diǎn)擊Openstack API鏈接。頂部的部分列出了你的Service Endpoints的URL地址,底部是Download Openstack RC File。為了以管理員的身份查看云平臺(tái),你可以從下拉菜單中選擇admin。選擇你需要的project項(xiàng)目,然后點(diǎn)擊Download RC。于是會(huì)得到一個(gè)名為openrc.sh的文件,內(nèi)容類似如下:
#!/bin/bash # With the addition of Keystone, to use an openstack cloud you should # authenticate against keystone, which returns a Token and Service # Catalog. The catalog contains the endpoint for all services the # user/tenant has access to - including nova, glance, keystone, swift. # # NOTE: Using the 2.0 auth api does not mean that compute api is 2.0. # We use the 1.1 compute api export OS_AUTH_URL=http://203.0.113.10:5000/v2.0 # With the addition of Keystone we have standardized on the term tenant # as the entity that owns the resources. export OS_TENANT_ID=98333aba48e756fa8f629c83a818ad57 export OS_TENANT_NAME=”test-project” # In addition to the owning entity (tenant), openstack stores the entity # performing the action as the user. export OS_USERNAME=test-user # With Keystone you pass the keystone password. echo “Please enter your OpenStack Password: ” read -s OS_PASSWORD_INPUT export OS_PASSWORD=$OS_PASSWORD_INPUT |
注意這個(gè)操作不會(huì)以文本保存你的密碼,這樣做是好事情。但是當(dāng)你想用這個(gè)文件source或者運(yùn)行腳本,它會(huì)提示你輸入你的密碼,并且保存在環(huán)境變量OS_PASSWORD中。記住這個(gè)過程需要手動(dòng)交互。如果你想要一個(gè)不需要交互的操作,那么把值直接保存在腳本中。但是這樣做你需要格外小心這個(gè)腳本文件的安全和權(quán)限。
EC2兼容的認(rèn)證可以從左邊導(dǎo)航欄中的”EC2 Credentials”鏈接下載,選擇你需要的項(xiàng)目,點(diǎn)擊”Download EC2 Credentials”。會(huì)得到一個(gè)提供x509證書的zip文件和一個(gè)shell腳本。和前面的openrc文件不同,這些證書包含了所有可以訪問你的云平臺(tái)的認(rèn)證信息,所以在安全的地方創(chuàng)建一個(gè)新目錄,在新目錄中解開zip文件。你會(huì)得到cacert.pem, cert.pem, ec2rc.sh and pk.pem。ec2rc.sh文件內(nèi)容類似如下:
#!/bin/bash NOVARC=$(readlink -f “${BASH_SOURCE:-${0}}” 2>/dev/null) ||NOVARC=$(python -c ‘import os,sys; print os.path.abspath(os.path.realpath(sys.argv[1]))’ “${BASH_SOURCE:-${0}}”) NOVA_KEY_DIR=${NOVARC%/*} export EC2_ACCESS_KEY=df7f93ec47e84ef8a347bbb3d598449a export EC2_SECRET_KEY=ead2fff9f8a344e489956deacd47e818 export EC2_URL=http://203.0.113.10:8773/services/Cloud export EC2_USER_ID=42 # nova does not use user id, but bundling requires it export EC2_PRIVATE_KEY=${NOVA_KEY_DIR}/pk.pem export EC2_CERT=${NOVA_KEY_DIR}/cert.pem export NOVA_CERT=${NOVA_KEY_DIR}/cacert.pem export EUCALYPTUS_CERT=${NOVA_CERT} # euca-bundle-image seems to require this set alias ec2-bundle-image=”ec2-bundle-image –cert $EC2_CERT –privatekey $EC2_PRIVATE_KEY –user 42 –ec2cert $NOVA_CERT” alias ec2-upload-bundle=”ec2-upload-bundle -a $EC2_ACCESS_KEY -s $EC2_SECRET_KEY –url $S3_URL –ec2cert $NOVA_CERT” |
把EC2 credentials放到你的環(huán)境里,source這個(gè)ec2rc.sh文件。
命令行的技巧和陷阱
命令行工具可以通過–debug標(biāo)記來顯示調(diào)用Openstack API的過程,例如
- # nova –debug list
這個(gè)例子會(huì)顯示從客戶端來的HTTP請(qǐng)求和從endpoints的回應(yīng),這些對(duì)于對(duì)Openstack API定制化客戶端有幫助
Keyring Support(https://wiki.openstack.org/wiki/KeyringSupport)可能就是一個(gè)困惑的東西,自這篇文章寫的時(shí)候,有一個(gè)bug(https://bugs.launchpad.net/python-novaclient/+bug/1020238)。這個(gè)bug狀態(tài)是open,然后解決,但是仍然有問題,又被重新open。這個(gè)bug的問題是在某些條件,命令行工具嘗試使用一個(gè)python的鑰匙作為證書的緩存,在這些情況的一個(gè)子集中,會(huì)要求在每次使用時(shí)會(huì)提示一個(gè)鑰匙密碼。如果你發(fā)現(xiàn)你遇到了這個(gè)不幸的情況,添加–no-cache標(biāo)識(shí)或者設(shè)置環(huán)境變量OS_NO_CACHE=1來避免證書緩存。注意:這會(huì)造成命令行工具在每次交互的時(shí)候都需要認(rèn)證。
cURL
優(yōu)先使用Openstack API而不是命令行工具,他是一個(gè)跑在HTTP協(xié)議上的RESTful API。多數(shù)情況你會(huì)希望直接使用API而不是命令行工具,因?yàn)槟骋粋€(gè)命令行可能會(huì)存在bug。最好的使用方式是,結(jié)合cURL(http://curl.haxx.se)和其他工具來語法分析響應(yīng)的JSON,例如jq(http://stedolan.github.com/jq/)
第一件事情你必須使用你的證書來認(rèn)證來獲取authentication token。證書包含了用戶名、密碼和tenant(項(xiàng)目)。你可以從上面我們談到的openrc.sh文件中得到他們。token允許你不需要再次認(rèn)證就能和其他的service endpoints交互。Tokens通常存在24小時(shí)比較好,當(dāng)token過期后,你將會(huì)收到一個(gè)401(未被授權(quán)的)響應(yīng),然后你可以再請(qǐng)求一個(gè)token。
查看你的Openstack服務(wù)條目:
- $ curl -s -X POST http://203.0.113.10:35357/v2.0/tokens
- -d ‘{“auth”: {“passwordCredentials”: {“username”:”test-user”, “password”:”test-password”}, “tenantName”:”test-project”}}’ -H “Content-type: application/json” | jq .
通過閱讀JSON的響應(yīng)切身體會(huì)一下目錄是如何被安排的。
為了使后續(xù)的請(qǐng)求更方便,我們把token儲(chǔ)存在環(huán)境變量中。
- $ TOKEN=`curl -s -X POST http://203.0.113.10:35357/v2.0/tokens
- -d ‘{“auth”: {“passwordCredentials”: {“username”:”test-user”, “password”:”test-password”}, “tenantName”:”test-project”}}’ -H “Content-type: application/json” | jq -r .access.token.id`
現(xiàn)在你可以在命令行里面使用變量$TOKEN來得到你的token值 從服務(wù)目錄中選擇一個(gè)服務(wù)endpoint,譬如計(jì)算的服務(wù),然后嘗試著發(fā)出一個(gè)請(qǐng)求,例如列出實(shí)例。
- $ curl -s -H “X-Auth-Token: $TOKEN” http://203.0.113.10:8774/v2/98333aba48e756fa8f629c83a818ad57/servers | jq .
要查詢API請(qǐng)求是如何組織的,可以閱讀Openstack API Reference(http://api.openstack.org/api-ref.html)??梢允褂胘q來細(xì)細(xì)研究返回的請(qǐng)求響應(yīng),閱讀jq Manual(http://stedolan.github.com/jq/manual/)
在cURL命令中使用-s選項(xiàng)可以避免顯示過程信息。如果你在使用cURL時(shí)遇到困難,把這個(gè)標(biāo)記去掉。同樣的,加上-v選項(xiàng)會(huì)輸出詳細(xì)信息,幫助排錯(cuò)。在cURL中還有更多有用的功能,參考man幫助手冊(cè)查詢所有的選項(xiàng)。
服務(wù)器和服務(wù)
作為一個(gè)管理員,通過使用Openstack工具來讓你查看你的Openstack云平臺(tái)。這部分將會(huì)告訴你如何總覽你的云,組成,大小和狀態(tài)。
首先,你可以查詢哪些服務(wù)器屬于你的Openstack云平臺(tái),通過運(yùn)行
- $ nova-manage service list | sort
輸出類似如下:
Binary Host Zone Status State Updated_At nova-cert cloud.example.com nova enabled :-) 2013-02-25 19:32:38 nova-compute c01.example.com nova enabled :-) 2013-02-25 19:32:35 nova-compute c02.example.com nova enabled :-) 2013-02-25 19:32:32 nova-compute c03.example.com nova enabled :-) 2013-02-25 19:32:36 nova-compute c04.example.com nova enabled :-) 2013-02-25 19:32:32 nova-compute c05.example.com nova enabled :-) 2013-02-25 19:32:41 nova-consoleauth cloud.example.com nova enabled :-) 2013-02-25 19:32:36 nova-network cloud.example.com nova enabled :-) 2013-02-25 19:32:32 nova-scheduler cloud.example.com nova enabled :-) 2013-02-25 19:32:33 |
輸出顯示有5個(gè)計(jì)算節(jié)點(diǎn)和1個(gè)云控制結(jié)點(diǎn)。你可以看到一個(gè)笑臉:-),表明這個(gè)服務(wù)是起的并運(yùn)行著。如果一個(gè)服務(wù)不可用,:-)會(huì)變成XXX。這表明你應(yīng)該排錯(cuò)一下為什么服務(wù)down了。
如果你用了nova-volume(這個(gè)服務(wù)在Folsom版本后不贊成使用),你會(huì)看到一行nova-volume的服務(wù)條目。
如果你是用了Cinder,運(yùn)行如下命令將會(huì)看到。
- $cinder-manage host list | sort
- host zone c01.example.com nova c02.example.com nova c03.example.com nova c04.example.com nova c05.example.com nova cloud.example.com nova
通過這兩個(gè)表,你現(xiàn)在已經(jīng)對(duì)組成你的云平臺(tái)的服務(wù)器和服務(wù)有了總的概況。
你也可以使用認(rèn)證服務(wù)(Keystone)查看什么服務(wù)在你的云平臺(tái)可用,什么服務(wù)被配置了endpoints。
以下這個(gè)命令需要你在shell中設(shè)置了合適的管理權(quán)限的變量。
- $ keystone service-list
id | name | type | description |
... | cinder glance nova_ec2 keystone nova | volume image ec2 identity compute | Cinder Service OpenStack Image Service EC2 Service OpenStack Identity Service OpenStack Compute Service |
輸出顯示有5個(gè)配置的服務(wù)
查看每個(gè)服務(wù)的endpoint,運(yùn)行
- $ keystone endpoint-list
+—–+—————————————–+-/+—————————————–+ | id | publicurl | | adminurl | +—–+—————————————–+-/+—————————————–+ | ... | http://example.com:8774/v2/%(tenant_id)s| | http://example.com:8774/v2/%(tenant_id)s| | ... | http://example.com:8773/services/Cloud | /| http://example.com:8773/services/Admin | | ... | http://example.com:9292/v1 | | http://example.com:9292/v1 | | ... | http://example.com:5000/v2.0 | /| http://example.com:35357/v2.0 | | ... | http://example.com:8776/v1/%(tenant_id)s| | http://example.com:8776/v1/%(tenant_id)s| +—–+—————————————–+-/+—————————————–+
服務(wù)和endpoint之間應(yīng)該是一對(duì)一的映射,注意一些服務(wù)的公共URL和管理URL是不同的URLs和端口。
網(wǎng)絡(luò)
接下來,看看你的云環(huán)境中的Fixed IP網(wǎng)絡(luò)
- $ nova-manage network list
- id IPv4 IPv6 start address DNS1 DNS2 VlanID project uuid 1 10.1.0.0/24 None 10.1.0.3 None None 300 2725bbd beacb3f2 2 10.1.1.0/24 None 10.1.1.3 None None 301 none d0b1a796
輸出顯示兩個(gè)被配置的網(wǎng)絡(luò),每個(gè)網(wǎng)絡(luò)包含255個(gè)IP。第一個(gè)網(wǎng)絡(luò)被分配給一個(gè)專門的項(xiàng)目,第二個(gè)網(wǎng)絡(luò)沒有分配。你可以手動(dòng)分配,或者他也會(huì)自動(dòng)被分配當(dāng)一個(gè)項(xiàng)目啟動(dòng)第一個(gè)實(shí)例的時(shí)候
查看云平臺(tái)中的floating ip,運(yùn)行:
- $ nova-manage floating list
- 2725bbd458e2459a8c1bd36be859f43f 1.2.3.4 None nova vlan20 None 1.2.3.5 48a415e7-6f07-4d33-ad00-814e60b010ff nova vlan20
這里,兩個(gè)floating IP可用,第一個(gè)已經(jīng)被分配,第二個(gè)空間
用戶和項(xiàng)目
列出云平臺(tái)下的項(xiàng)目列表,運(yùn)行
- $ keystone tenant-list
id | name | enabled |
... | jtopjian alvaro everett admin services jonathan lorin anne rhulsker tom adam | True True True True True True True True True True True |
用戶列表,運(yùn)行
- $ keystone user-list
id | name | enabled | |
... | everett jonathan nova rhulsker lorin alvaro anne admin cinder glance jtopjian adam tom | True True True True True True True True True True True True True | everett.towne@backspace.com jon@sfcu.edu nova@localhost ryan.hulkster@cyberalbert.ca lorinhoch@nsservices.com Alvaro.Perry@cyberalbert.ca anne.green@backspace.com root@localhost cinder@localhost glance@localhost joe.topjian@cyberalbert.com adam@ossmanuals.net fafield@univm.edu.au |
注意,有時(shí)候用戶和組是一一對(duì)應(yīng)的。通常在標(biāo)準(zhǔn)的系統(tǒng)用戶是這樣的,例如cinder, glance, nova, swift或者一個(gè)組里面就一個(gè)用戶。
在運(yùn)行的實(shí)例
顯示運(yùn)行中的實(shí)例列表:
- $ nova list –all-tenants
ID | Name | Status | Networks |
... | Windows cloud controller compute node 1 devbox devstack initial lorin-head | ACTIVE ACTIVE ACTIVE ACTIVE ACTIVE ACTIVE ACTIVE | novanetwork_1=10.1.1.3, 199.116.232.39 novanetwork_0=10.1.0.6; jtopjian=10.1.2.3 novanetwork_0=10.1.0.4; jtopjian=10.1.2.4 novanetwork_0=10.1.0.3 novanetwork_0=10.1.0.5 nova_network=10.1.7.4, 10.1.8.4 nova_network=10.1.7.3, 10.1.8.3 |
不幸的是這個(gè)命令沒法告訴你更多的關(guān)于實(shí)例的細(xì)節(jié),例如實(shí)例跑在哪個(gè)計(jì)算節(jié)點(diǎn),實(shí)例的配置等等。你可以使用下面的命令來單獨(dú)查看每個(gè)實(shí)例的細(xì)節(jié):
- $ nova show <uuid>>
舉例:
- # nova show 81db556b-8aa5-427d-a95c-2a9a6972f630
Property | Value |
OS-DCF:diskConfig OS-EXT-SRV-ATTR:host OS-EXT-SRV-ATTR:hypervisor_hostname OS-EXT-SRV-ATTR:instance_name OS-EXT-STS:power_state OS-EXT-STS:task_state OS-EXT-STS:vm_state accessIPv4 accessIPv6 config_drive created flavor hostId id image key_name metadata name novanetwork_0 network progress security_groups status tenant_id updated user_id |
MANUAL c02.example.com c02.example.com instance-00000029 1 None active 2013-02-13T20:08:36Z m1.small (6) ... ... Ubuntu 12.04 cloudimg amd64 (...) jtopjian-sandbox {} devstack 10.1.0.5 0 [{u’name’: u’default’}] ACTIVE ... 2013-02-13T20:08:59Z ... |