初次接触 OpenStack ,之前按照官方文档安装了一遍,期间碰到了几个问题,而且是由于官网给出的配置错误导致的,在此总结记录一下。
首先要说明,解决问题最根本的方法就是:看日志,看日志,看日志,而且 OpenStack 各组件之间有调用关系,需要查看多个日志来定位问题所在!

Horizon 安装后,Web 无法访问,报错为 500 Internal Server Error

openstack服务日志位置 openstack日志查看_Web

Horizon使用的是 apache 服务,新版本已经没有了horizon的log,全部整合到了httpd中,所以在控制节点上查看相关日志:tail -f /var/log/httpd/error_log,显示如下内容(只摘出了关键报错):

File "/usr/share/openstack-dashboard/openstack_dashboard/settings.py", line 345, in <module>
    '.secret_key_store'))
  File "/usr/lib/python2.7/site-packages/horizon/utils/secret_key.py", line 69, in generate_or_read_from_file
    key = read_from_file(key_file)
  File "/usr/lib/python2.7/site-packages/horizon/utils/secret_key.py", line 51, in read_from_file
    with open(key_file, 'r') as f:
IOError: [Errno 13] Permission denied: '/usr/share/openstack-dashboard/openstack_dashboard/local/.secret_key_store'

这里提示权限拒绝
定位文件,查看权限:

[root@controller local]# pwd
/usr/share/openstack-dashboard/openstack_dashboard/local
[root@controller local]# ll -a
total 32
drwxr-xr-x.  4 root root 4096 May  3 23:47 .
drwxr-xr-x. 18 root root 4096 May  3 21:27 ..
drwxr-xr-x.  2 root root   96 May  3 21:27 enabled
-rw-r--r--.  1 root root    0 Jan 23 19:29 __init__.py
-rw-r--r--.  2 root root  155 Jan 23 21:46 __init__.pyc
-rw-r--r--.  2 root root  155 Jan 23 21:46 __init__.pyo
drwxr-xr-x.  2 root root  236 May  3 21:27 local_settings.d
lrwxrwxrwx.  1 root root   53 May  3 21:27 local_settings.py -> ../../../../../etc/openstack-dashboard/local_settings
-rw-r-----.  1 root root 1256 May  3 23:47 local_settings.pyc
-rw-r--r--.  1 root root 4276 Jan 23 21:46 local_settings.pyo
-rw-------.  1 root root   64 May  3 22:34 .secret_key_store	# 这里看到文件权限是 0600 
-rw-r--r--.  1 root root    0 May  3 22:34 _usr_share_openstack-dashboard_openstack_dashboard_local_.secret_key_store.lock

尝试修改文件权限为 777,再次访问 Web 界面,看到日志文件中如下报错:

FilePermissionError: Insecure permissions on key file /usr/share/openstack-dashboard/openstack_dashboard/local/.secret_key_store, should be 0600.

但是修改前的文件权限确实是 0600 ,可见不是权限的问题;恢复原来的权限。
……(长久 Google 未果),也尝试过删除文件的方法,但都未能奏效。
于是,自己动手丰衣足食,因为 OpenStack 是用 Python 写的,我恰好略懂一些 Python 皮毛,查看报错文件中的 Python 文件:

File "/usr/share/openstack-dashboard/openstack_dashboard/settings.py", line 345, in <module>
    '.secret_key_store'))

查看此文件的 345 行附近:

334 # Ensure that we always have a SECRET_KEY set, even when no local_settings.py
335 # file is present. See local_settings.py.example for full documentation on the
336 # horizon.utils.secret_key module and its use.
337 if not SECRET_KEY:
338     if not LOCAL_PATH:
339         LOCAL_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)),
340                                   'local')
341 
342     # pylint: disable=ungrouped-imports
343     from horizon.utils import secret_key
344     SECRET_KEY = secret_key.generate_or_read_from_file(os.path.join(LOCAL_PATH,
345                                                        '.secret_key_store'))

这里注释写的很明白:需要从local_settings.py文件中读取SECRET_KEY,如果没有的话,就调用模块from horizon.utils import secret_key来生成。于是查看初始的local_settings.py,找到相关说明:

# Set custom secret key:
# You can either set it to a specific value or you can let horizon generate a
# default secret key that is unique on this machine, e.i. regardless of the
# amount of Python WSGI workers (if used behind Apache+mod_wsgi): However,
# there may be situations where you would want to set this explicitly, e.g.
# when multiple dashboard instances are distributed on different machines
# (usually behind a load-balancer). Either you have to make sure that a session
# gets all requests routed to the same dashboard instance or you set the same
# SECRET_KEY for all of them.
SECRET_KEY='05f67612642d2bc1bf9a'

这里的注释说明:SECRET_KEY是每台机器唯一的,可以手动指定,也可以让horizon来生成;很显然我这里是后者,自动生成的,但是无法使用,提示权限错误。
继续查看下一个错误,是读取文件,跳过该错误,直接查看读取文件的函数/usr/lib/python2.7/site-packages/horizon/utils/secret_key.py,51 行报错:

46 def read_from_file(key_file='.secret_key'):
 47     if (os.stat(key_file).st_mode & 0o777) != 0o600:
 48         raise FilePermissionError(
 49             "Insecure permissions on key file %s, should be 0600." %
 50             os.path.abspath(key_file))
 51     with open(key_file, 'r') as f:
 52         key = f.readline()
 53         return key

查看不到有什么异常问题。放弃!所以,只能曲线救国了。。。

解决方法

前面提到需要从local_settings.py文件中读取SECRET_KEY,那我直接在文件里面指定SECRET_KEY就好了啊!
于是,查看.secret_key_store中的内容,将其写入local_settings.py中:

[root@controller local]# pwd
/usr/share/openstack-dashboard/openstack_dashboard/local
[root@controller local]# more .secret_key_store
GUM4T1AwQbF536JpKNQk10Vq0EpOIIudUQ0hpoAPBdTvDkgvUuuuGagAE4xajUVx
[root@controller local]# echo "SECRET_KEY='GUM4T1AwQbF536JpKNQk10Vq0EpOIIudUQ0hpoAPBdTvDkgvUuuuGagAE4xajUVx'" >> local_settings.py

重启服务systemctl restart httpd,页面正常,可以显示出来了(正常流程应该是可以访问了,但是我这里还是不行,出现了新的错误,见下!!!)。
(这个问题可能是由于 Python 读取 Linux 系统中文件有权限问题?希望有大佬解惑)

The requested URL /auth/login/ was not found on this server.

第一个问题中,500 的错误解决了,又报出来一个 无法找到页面 orz…

官方文档中说,通过http://controller/dashboard进行访问 Web 端

这次是 404 错误,显然服务已经正常启动,所以 log 中也查看不到有错误日志,但是看起来链接跳转的不对(这是事后结论)

openstack服务日志位置 openstack日志查看_openstack服务日志位置_02


查看 httpd 中 dashboard 的配置文件vim /etc/httpd/conf.d/openstack-dashboard.conf

WSGIScriptAlias /dashboard /usr/share/openstack-dashboard/openstack_dashboard/wsgi/django.wsgi
Alias /dashboard/static /usr/share/openstack-dashboard/static

<Directory /usr/share/openstack-dashboard/openstack_dashboard/wsgi>
  Options All
  AllowOverride All
  Require all granted
</Directory>

<Directory /usr/share/openstack-dashboard/static>
  Options All
  AllowOverride All
  Require all granted
</Directory>

发现其中定义了两个别名,意思就是访问http://10.1.1.128/dashboard会重定向到django.wsgi文件,网站的静态文件在/dashboard/static中,但是提示 404 错误的 URL 是 http://10.1.1.128/auth/login/?next=/dashboard/如上图,经过查看,static 文件夹下也确实有 auth/login相关的文件。

修改链接,尝试访问:http://10.1.1.128/dashboard/auth/login/?next=/dashboard/,发现可以访问,只是缺少了 CSS 样式:

openstack服务日志位置 openstack日志查看_linux_03


可以发现这个问题是由于 Web 路径错误导致的。

解决办法:

方法一:修改local_settings.py文件,添加网站根目录WEBROOT = '/dashboard' ,重启服务,修复问题。

pwd
/usr/share/openstack-dashboard/openstack_dashboard/local

echo "WEBROOT = '/dashboard'" >> local_settings.py
systemctl restart httpd

openstack服务日志位置 openstack日志查看_linux_04


方法二:修改 httpd 配置文件,将别名中的/dashboard删除,然后通过http://10.1.1.128/直接进行访问!

# 删除配置文件的 dashboard,但要保留 /
WSGIScriptAlias / /usr/share/openstack-dashboard/openstack_dashboard/wsgi/django.wsgi
Alias /static /usr/share/openstack-dashboard/static

openstack服务日志位置 openstack日志查看_配置文件_05

RuntimeError: Unable to create a new session key. It is likely that the cache is unavailable.

Web 界面可以登录进来了,但是输入域,用户名,密码之后,无法登录进去!
查看 log:

[Sun May 04 23:42:22.839562 2020] [:error] [pid 37959] RuntimeError: Unable to create a new session key. It is likely that the cache is unavailable.

提示SESSION相关的问题。。。
解决办法

原文:

/etc/openstack-dashboard/local_settings中的:
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'修改为
SESSION_ENGINE = 'django.contrib.sessions.backends.file',重启服务,问题解决。

虚拟机异常掉电后,计算节点掉线…

通过命令行启动了一个实例,然而一直显示在调度中,一开始以为虚拟机性能不够,等了 10 分钟还显示调度中后,事情似乎不简单了 -,-:

# nova list 查看实例信息
+--------------------------------------+-------------------+--------+------------+-------------+----------+
| ID                                   | Name              | Status | Task State | Power State | Networks |
+--------------------------------------+-------------------+--------+------------+-------------+----------+
| 33d59558-8ed5-47f0-914c-4830e963b2fb | my-first-instance | BUILD  | scheduling | NOSTATE     |          |
+--------------------------------------+-------------------+--------+------------+-------------+----------+

因为我只部署了一个计算节点,基本不存在调度的问题,检查了一下计算节点的状态:

openstack compute service list --service nova-compute
	+----+--------------+-----------------------+------+---------+-------+----------------------------+
	| ID | Binary       | Host                  | Zone | Status  | State | Updated At                 |
	+----+--------------+-----------------------+------+---------+-------+----------------------------+
	|  5 | nova-compute | localhost.localdomain | nova | enabled | down  | 2020-05-03T12:35:23.000000 |
	|  6 | nova-compute | compute1              | nova | enabled | down  | 2020-05-04T03:33:44.000000 |
	+----+--------------+-----------------------+------+---------+-------+----------------------------+

嗯,计算节点宕机了。
查看计算节点的 log 信息tailf /var/log/nova.log

AccessRefused: (0, 0): (403) ACCESS_REFUSED - Login was refused using authentication mechanism AMQPLAIN. For details see the broker logfile.

错误信息显示一直在重连队列服务,也就是 rabbitmq,一直报登录失败的错误。
检查配置/etc/nova/nova.conf无误后,到控制节点查看 rabbitmq 的日志信息:

Error on AMQP connection <0.3350.0> (10.1.1.128:36550 -> 10.1.1.128:5672, state: starting):
AMQPLAIN login refused: user 'openstack' - invalid credentials

控制节点收到了大量的连接请求,但是无法连接成功,提示用户openstack不正确。
解决方法
提示用户不正确,那就重新创建一次用户呗:

rabbitmqctl add_user openstack RABBIT_PASS
rabbitmqctl set_permissions openstack ".*" ".*" ".*"

之后检查计算节点,已经上线。(问题出现的原因尚不得知,我只是前一天晚上异常关机了而已……)

ResourceProviderRetrievalFailed: Failed to get resource provider with UUID 4d252eb7-2eb6-4622-99c8-4b5ef0e0de04

继续创建实例,又有了新问题!
这次我直接开了一个窗口,通过tail -f /var/log/nova.log实时查看日志信息……
上述问题解决办法,修改 placement 配置文件/etc/httpd/conf.d/00-nova-placement-api.conf,添加以下内容:

出处:https://ask.openstack.org/en/question/103325/ah01630-client-denied-by-server-configuration-usrbinnova-placement-api/

<Directory /usr/bin>
    <IfVersion >= 2.4>
        Require all granted
    </IfVersion>
    <IfVersion < 2.4>
        Order allow,deny
        Allow from all
    </IfVersion>
</Directory>

No DHCP agents available

通过openstack network agent list检查发现我的网络服务基本都不正常。

通过上面参考链接,得出一个结论:

官网文档安装网络服务 Neutron 那一节中/etc/neutron/plugins/ml2/ml2_conf.ini这个配置文件有点问题,这里留空后,网络服务就异常了:

openstack服务日志位置 openstack日志查看_openstack_06


经过查阅百度,我这里最终填上了flat(我创建的是最简单的二层网络)

修改完配置文件后,再次查看网络服务就正常了 orz,控制节点的网络服务索性全部重启了一遍systemctl restart neutron-server neutron-linuxbridge-agent neutron-dhcp-agent neutron-metadata-agent。记得计算节点也要修改,修改配置文件后要重启服务systemctl restart neutron-linuxbridge-agent.service

openstack服务日志位置 openstack日志查看_linux_07


具体为何异常,我也不懂啊,等以后深入学习了 Neutron 之后,再来看看吧。

实例启动后,无法从硬盘启动 Booting from Hard Disk… GRUB

openstack服务日志位置 openstack日志查看_openstack_08


解决办法:修改计算节点的配置文件

出处:https://ask.openstack.org/en/question/101928/instance-get-stuck-when-booting-grub/

# 在计算节点修改配置文件 /etc/nova/nova.conf
[libvirt]
virt_type = qemu
cpu_mode = none
# 修改后重启计算节点服务
systemctl restart libvirtd.service openstack-nova-compute

问题原因:这是嵌套虚拟化的问题,需要修改计算节点的nova.conf。报错的原因在于 openstack 的 libvirt 默认 hyper 是 kvm 而不是纯 qemu ,redhat 系列的 linux 下 kvm 不支持嵌套虚拟化。这种修改方式只适用于做实验学习(忘了从哪看到的一句话

重启实例,可以看到实例启动成功!!!

openstack服务日志位置 openstack日志查看_Web_09


通过 SSH 也可以登录到实例上:

openstack服务日志位置 openstack日志查看_配置文件_10

如果有其他问题,会继续更新……