使用 OpenStack Python API 获取主机的 CPU、内存和硬盘信息
Get CPU, memory and HDD info of a host with the OpenStack Python API
我有一个正在运行的 Python 程序,它使用 OpenStack API 创建实例、列出实例等。身份验证运行良好 ;)。
我想获取特定主机的CPU、内存和硬盘信息。根据 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
我收到以下错误:
Compute host < Host: my-host.example.com > could not be found. (HTTP 404) (Request-ID: req-338f5bdd-b9ec-49cf-8f5c-59eb825de2c7)
EDIT: 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)
但是当我对主机 B 和主机 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 |
+---------------------------+------------+-----+-----------+---------+
我得出结论,只有具有 compute 服务的主机才应该工作,这似乎很正常。所以我改变了我的 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 服务并 运行ning 是有道理的。多亏了它,我才不需要安装 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, 等等。
我希望这对其他人有所帮助,因为 Internet 上没有关于此主题的教程或好的文档。
我有一个正在运行的 Python 程序,它使用 OpenStack API 创建实例、列出实例等。身份验证运行良好 ;)。
我想获取特定主机的CPU、内存和硬盘信息。根据 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
我收到以下错误:
Compute host < Host: my-host.example.com > could not be found. (HTTP 404) (Request-ID: req-338f5bdd-b9ec-49cf-8f5c-59eb825de2c7)
EDIT: 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)
但是当我对主机 B 和主机 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 |
+---------------------------+------------+-----+-----------+---------+
我得出结论,只有具有 compute 服务的主机才应该工作,这似乎很正常。所以我改变了我的 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 服务并 运行ning 是有道理的。多亏了它,我才不需要安装 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, 等等。
我希望这对其他人有所帮助,因为 Internet 上没有关于此主题的教程或好的文档。