前言
同事小伙伴在使用packstack安装openstack时报错,报错信息为oslo_config.cfg.DefaultValueError: Error processing default value control_compute0 for Opt type of HostAddress.
看日志发现是执行下列命令同步neutron数据库时报错:
su -s /bin/sh -c "neutron-db-manage --config-file /etc/neutron/neutron.conf \
--config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head" neutron
问题原因和如何解决
此控制节点的主机名为’control_compute0’,openstack节点的主机名不能有下划线。
检查时:会对hostname进行匹配,要求以 “.” 分隔后不以"-"开头和结尾,[A-Z][0-9]和‘-’,长度为1到63位,字母不区分大小。
解决:更改主机名重新安装。
代码分析
oslo_config.types
# 检查主机名的部分
# 通过使用re进行匹配来检验可用性
class Hostname(ConfigType):
def __init__(self, type_name='hostname value'):
super(Hostname, self).__init__(type_name=type_name)
def __call__(self, value):
# 字符长度大于0小于254
if len(value) == 0:
raise ValueError("Cannot have an empty hostname")
if len(value) > 253:
raise ValueError("hostname is greater than 253 characters: %s"
% value)
# 末尾有.则舍掉进行匹配
if value.endswith("."):
value = value[:-1]
# 匹配的内容为不以"-"开头和结尾,[A-Z][0-9]和‘-’,长度为1到63位,字母不区分大小;
allowed = re.compile("(?!-)[A-Z0-9-]{1,63}(?<!-)$", re.IGNORECASE)
if not re.search('[a-zA-Z-]', value.split(".")[-1]):
raise ValueError('%s contains no non-numeric characters in the '
'top-level domain part of the host name and is '
'invalid' % value)
# 对HostName用'.'分隔后进行匹配,如果有不符合的则匹配失败;
if any((not allowed.match(x)) for x in value.split(".")):
raise ValueError("%s is an invalid hostname" % value)
return value
正则记录
(?!pattern):正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。
(?<!pattern):反向否定预查,与正向否定预查类拟,只是方向相反。
总结
在搭建OpenStack环境时,不能随意设置主机名,不能有"_";
后续:需要多了解正则表达式的内容