環境:
Python3.8.8 + VSCode
主要介紹一下怎麼通過python去調用openstack的接口來實作開發
openstack文檔點此進入,連結可能失效,請以官網實時文檔為主
查詢openstack rest api的最重要的網址,裡面包含openstack各個服務對應的接口,比如:compute API(對應Navo服務),Identity API(對應KeyStone服務),Networking API(對應Neutron服務)等,開發時重點參考,因為公司主要以開發openstack為主。
比較重要的幾個開發參考網址如下:
http://www.openstack4j.com/
openstack4j官網。
http://www.openstack4j.com/learn
openstack4j接口介紹及執行個體,學習openstack4j的入門級教程。
http://www.openstack4j.com/javadoc/
openstack4j javadoc,類清單。
https://github.com/ContainX/openstack4j/issues
openstack4j的issues,有問題可以在這裡檢索,重點參考網址。
openstack API調用過程:
下面通過調試例子介紹整個調試過程:
1.通過身份認證擷取 X-Subject-Token
OpenStack身份驗證調試,通過使用者id和密碼及Project id擷取擷取通路各個服務的token。對應的服務為KeyStone,對應Identity API,身份驗證鑒權有很多方式,主要是參數的不同,我們這裡選擇的是“/v3/auth/tokens”中的Password authentication with scoped authorization方式。
URL:http://XX.XX.XX.XX:5000/v3/auth/tokens。手動填寫,其中的位址和端口可以通過Openstack DashBoard(Openstack網頁版管理入口,對應Horizon服務)中的項目->計算->通路&安全->通路API(清單)中的位址進行調試。
json格式的請求資料如下:
請求url: https://xxx.xxx.xxx.xxx:5000/v3/auth/tokens
對應的body參數:
{
"auth": {
"identity": {
"methods": [
"password"
],
"password": {
"user": {
"id": "ff1679d06f6446b0b780ee9552878cd3",
"password": "pass"
}
},
"scope":
{
"project": {
"id": "398d04f5f64d4d668d077c7ed1db1244"
}
}
}
}
}
請求完成檢視header中的 X-Subject-Token
其中id即登入DashBoard的使用者名對應的id(DashBoard登入之後的身份管理->使用者清單中可以查到),密碼就是登入DashBoard的密碼。project id也是通過DashBoard中的身份管理->項目清單中查找。Openstack V3
開始需要在鑒權的時候scope到一個Project上,否則沒有權限通路服務。
這裡我也準備了一個curl的方法
//請求擷取token
curl -k -i -X 'POST' 'https://xxx.xxx.xxx.xxx:5000/v3/auth/tokens' -H 'Content-type: application/json' -d '{"auth": { "identity": {"methods": ["password"],"password": {"user": {"id": "ff1679d06f6446b0b780ee9552878cd3","password": "pass"}},"scope": {"project": {"id": "398d04f5f64d4d668d077c7ed1db1244"}}}}}' | grep X-Subject-Token | awk '{print $2}'
2.通過X-Subject-Token調用api接口
擷取到token後就可以帶着token去通路其他子產品的接口了,因為所有接口都需要驗證,必須帶上token這裡以安全組為例,擷取所有的安全組,如下所示
下面再介紹另一種調用方式
即通過封裝好的方法去調用
不多說了,直接上代碼
首先下載下傳對應的包,這裡建議配置阿裡的pip源,清華的可能沒有
pip install keystoneauth1
pip install neutronclient
----------------------------下面是代碼---------------------------
from keystoneauth1 import identity
from keystoneauth1 import session
from neutronclient.v2_0 import client
username = 'admin'
password = 'pass'
project_name = 'admin'
project_domain_id = 'default'
user_domain_id = 'default'
auth_url = 'https://xxx.xxx.xxx.xxx:5000/v3'
auth = identity.Password(auth_url=auth_url,
username=username,
password=password,
project_name=project_name,
project_domain_id=project_domain_id,
user_domain_id=user_domain_id)
sess = session.Session(auth=auth, verify=False)
neutron = client.Client(session=sess)
res = neutron.list_security_groups()
print(res)