簡體   English   中英

使用OpenStack Python API獲取主機的CPU,內存和HDD信息

[英]Get CPU, memory and HDD info of a host with the OpenStack Python API

我有一個有效的Python程序,使用OpenStack API來創建實例,列出實例等。身份驗證運行良好;)。

我想獲得特定主機的CPU,內存和HDD信息。 根據python-novaclient文檔,方法get(host)是我需要的。

一個Python示例:

from novaclient.client import Client
cl = Client(VERSION, USERNAME, PASSWORD, PROJECT_ID, AUTH_URL)
hosts_list = cl.hosts.list()
for h in hosts_list:
  print h # this works and there are elements in hosts_list
cl.hosts.get(hosts_list[0]) # this does not work

我收到以下錯誤:

無法找到計算主機<Host:my-host.example.com>。 (HTTP 404)(請求ID:req-338f5bdd-b9ec-49cf-8f5c-59eb825de2c7)

編輯my-host.example.com是正常的,我出於隱私原因更改了它。

我做對了嗎? 我發現文檔很空。 我正在尋找更詳細的文檔,但我覺得這是唯一的。

任何幫助將不勝感激。


更新

nova host-list命令(在控制器上)給我這個輸出(為了隱私原因編輯):

+-----------------------+-------------+----------+
| host_name             | service     | zone     |
+-----------------------+-------------+----------+
| my-host-A.example.com | consoleauth | internal |
| my-host-A.example.com | scheduler   | internal |
| my-host-A.example.com | conductor   | internal |
| my-host-A.example.com | cert        | internal |
| my-host-B.example.com | compute     | nova     |
| my-host-B.example.com | cert        | internal |
| my-host-C.example.com | compute     | nova     |
| my-host-C.example.com | cert        | internal |
| my-host-B.example.com | network     | internal |
| my-host-C.example.com | network     | internal |
+-----------------------+-------------+----------+

當我執行nova host-describe my-host-A.example.com ,我得到:

ERROR: Compute host my-host-A.example.com could not be found. (HTTP 404) (Request-ID: req-5563c44b-b784-420a-bd73-68c546240076)

但是當我為host-B和host-C執行相同的命令時,我得到:

+---------------------------+------------+-----+-----------+---------+
| HOST                      | PROJECT    | cpu | memory_mb | disk_gb |
+---------------------------+------------+-----+-----------+---------+
| my-host-{B,C}.example.com | (total)    | 4   | 7987      | 206     |
| my-host-{B,C}.example.com | (used_now) | 0   | 512       | 0       |
| my-host-{B,C}.example.com | (used_max) | 0   | 0         | 0       |
+---------------------------+------------+-----+-----------+---------+

我得出結論,只有擁有計算服務的主機才能正常工作,這看起來很正常。 所以我改變了我的Python示例:

for h in hosts_list:
  try:
    hostname = str(h.host_name)
    print "Try to get system info from: " + hostname
    print cl.hosts.get(hostname)
  except Exception as e:
    logger.error(e)

實際上,當我嘗試從主機-A獲取信息時,我得到了相同的404錯誤。 但我也為其余的主機收到錯誤:

Try to get system info from: my-host-{B,C}.example.com
2015-03-11 15:24:22 my-host-{B,C}.example.com urllib3.connectionpool[24249] DEBUG Setting read timeout to None
2015-03-11 15:24:22 my-host-{B,C}.example.com urllib3.connectionpool[24249] DEBUG "GET /v2/951c7a1decb44b4e8fcab59e49f2932f/os-hosts/my-host-{B,C}.example.com HTTP/1.1" 200 413
2015-03-11 15:24:22 my-host-{B,C}.example.com mylogger[24249] ERROR host_name

錯誤host_name不是真的可以理解。

我設法解決了我的問題。 我想分享我的逐步解決方案,因為它可以幫助像我這樣的其他初學者。

使用tcpdump檢查網絡請求

使用tcpdump我設法看到我的程序發送的請求,並獲得完整的響應。

tcpdump -A -i lo -n "src host my-IP and dst host my-IP and port 8774"

端口8774是Compute / Nova API服務使用的端口。 根據給定的輸出,我意識到我的請求和響應是完美的:

{"host": 
  [
    {"resource": {"project": "(total)", "memory_mb": 32166, "host": "my-host-{B,C}.example.com", "cpu": 8, "disk_gb": 531}},
    {"resource": {"project": "(used_now)", "memory_mb": 512, "host": "my-host-{B,C}.example.com", "cpu": 0, "disk_gb": 0}},
    {"resource": {"project": "(used_max)", "memory_mb": 0, "host": "my-host-{B,C}.example.com", "cpu": 0, "disk_gb": 0}}
  ]
}

所以我猜測問題將出現在我的程序正在使用的庫上,可能是在從json到Python變量的解析過程中。

檢查庫正在做什么

我在控制器上運行我的Python程序。 在此節點上安裝並運行Compute / Nova服務是有道理的。 多虧了它,我不需要安裝python-novaclient 我的代碼使用的是OpenStack安裝中的庫。

為了調試我的代碼,我決定在庫中放置一些print調用,但我發現設置virtualenv並安裝正確的包更容易:

virtualenv env
source env/bin/activate
pip install python-novaclient

這時我在Python環境中安裝的lib中放了一些print調用。 當我重新啟動程序時,它執行沒有任何問題。

全球安裝的Nova Python庫可能已經過時了。 它試圖在json響應中找到鍵“ host_name ”,但鍵是“ host ”。 這就是我遇到麻煩的原因。

如何使用給定的變量

正如您在tcpdump響應中看到的,有很多數據。 該庫使用response_key解析內容,該響應是“ host ”。 給定變量,我們稱之為foo ,如下所示:

[<Host: my-host-{B,C}.example.com>,
 <Host: my-host-{B,C}.example.com>,
 <Host: my-host-{B,C}.example.com>]

有了這個foo[0].project ,我得到“ (總) ”,用foo[1].memory_mb ,我得到512 ,依此類推。

我希望這會對其他人有所幫助,因為互聯網上沒有關於這個主題的教程或文檔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM