我已经使用包含 MAAS 的安装模式部署了 Ubuntu 14.04。
当我调试节点时,一切看起来都很好(它们进入就绪状态)。但是,我无法使用 juju bootstrap,因为它失败了。
在正在调试的节点的控制台上,我收到一系列500 INTERNAL SERVER ERROR
消息(共 7 条),随后是几条成功消息。使用 tcpdump,我能够看到当节点报告 lshw 结果 (POST /MAAS/metadata//2012-03-01) 时发生这种情况。
在 maas.log 文件中,我看到“整数超出范围”异常。为了进一步挖掘,我向文件添加了一些日志消息commissioningscript.py
,发现问题发生在解析 XML 之后,即当数据保存到数据库时。
因此,由于这是一个 DB 错误,我查看了 postgres 日志文件并发现了以下内容:
2015-05-28 13:50:39 EDT STATEMENT:
UPDATE "maasserver_node" SET "created" = '2015-05-28 10:03:26.748794', "updated" = '2015-05-28 13:50:39.679737',
"system_id" = 'node-4faee0de-0542-11e5-9313-0050568ea9a6',
"hostname" = 'vmachine02',
"status" = 1,
"owner_id" = NULL,
"distro_series" = '',
"architecture" = 'amd64/generic',
"routers" = ARRAY['18:9c:5d:f6:02:55'::macaddr],
"agent_name" = '',
"zone_id" = 1,
"cpu_count" = 8,
"memory" = 32768,
"storage" = 17592186050704,
"power_type" = 'ipmi',
"power_parameters" = '{"power_driver": "LAN_2_0", "power_address": "10.0.0.12", "power_pass": "ADMIN", "power_user": "ADMIN", "mac_address": "0c:c4:7a:06:ff:fd"}',
"token_id" = NULL,
"error" = 'finished [6/6]',
"netboot" = true,
"nodegroup_id" = 1 WHERE "maasserver_node"."id" = 2
2015-05-28 13:50:55 EDT ERROR: integer out of range
仔细查看该 SQL,我可以看到问题所在。'storage' 值大于 postgresql 的 maxint (+2147483647)。
回到commissioningscript.py
文件,我可以看到 XPATH 用于提取存储总量,方法是将节点上的所有可用存储量相加,然后除以 1024 两次(因此会生成一个 MB 数)。就我而言,得出 17592186050704 MB 的总存储量意味着我以某种方式在我的家庭实验室中发明了一种非常神奇的存储设备(数以千万亿字节计!)。显然这是不对的。
为了解决这个问题,我在文件commissioningscript.py
使用 XPATH 检索存储号码后添加了一个测试:如果它太大(意味着未知),我会测试并将其设置为 0:
if storage > 2147483647:
storage = 0
有了这个变化,事情就好转了。我认为,为了使调试更加可靠,测试 lshw 解析出来的超出范围的数字是明智之举(针对所有内容,不仅仅是存储,还包括内存和 CPU 等)。以防万一!
我不确定如何将从 lshw 获得的输出附加到这篇文章,所以如果开发人员想看看它是什么样子,请直接联系我,我会发送它。