我有一个有效的Python程序,使用OpenStack API创建实例,列出实例等。身份验证运行良好;)。
我想获取特定主机的CPU,内存和HDD信息。根据{{3}}文档,方法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
我收到以下错误:
计算主机<主持人: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 |
+---------------------------+------------+-----+-----------+---------+
我的结论是,只有具有 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 并不是真的可以理解。
答案 0 :(得分:0)
我设法解决了我的问题。我想分享我的逐步解决方案,因为它可以帮助像我这样的其他初学者。
使用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环境中安装了一些print
调用。当我重新启动程序时,它执行没有任何问题。
全球安装的Nova Python库可能已过时。它试图找到密钥" host_name "在json响应中但关键是" 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
,我得到&#34; (总计)&#34;,foo[1].memory_mb
,我得 512 ,等等。
我希望这会对其他人有所帮助,因为互联网上没有关于这个主题的教程或好的文档。