puppet-puppetboard
puppet-puppetboard copied to clipboard
ModuleNotFoundError: No module named 'flask' on RHEL 8
After days of attempting to solve the problem myself I'm forced to realize that I don't have the skills to debug Python or Apache.
On a brand new RHEL8 system with @minimal installed, I am unable to get Puppetboard installed properly due to an error about the flask module not being found.
Using a simple:
class { 'puppetboard':
manage_git => true,
manage_virtualenv => true,
}
Apache barks with:
[Tue Mar 29 08:57:24.729351 2022] [wsgi:error] [pid 6074] [remote 1.17.1.5:58516] mod_wsgi (pid=6074): Failed to exec Python script file '/srv/puppetboard/puppetboard/wsgi.py'.
[Tue Mar 29 08:57:24.729453 2022] [wsgi:error] [pid 6074] [remote 1.17.1.5:58516] mod_wsgi (pid=6074): Exception occurred processing WSGI script '/srv/puppetboard/puppetboard/wsgi.py'.
[Tue Mar 29 08:57:24.729764 2022] [wsgi:error] [pid 6074] [remote 1.17.1.5:58516] Traceback (most recent call last):
[Tue Mar 29 08:57:24.729823 2022] [wsgi:error] [pid 6074] [remote 1.17.1.5:58516] File "/srv/puppetboard/puppetboard/wsgi.py", line 14, in <module>
[Tue Mar 29 08:57:24.729831 2022] [wsgi:error] [pid 6074] [remote 1.17.1.5:58516] from puppetboard.app import app as application
[Tue Mar 29 08:57:24.729840 2022] [wsgi:error] [pid 6074] [remote 1.17.1.5:58516] File "/srv/puppetboard/puppetboard/puppetboard/app.py", line 7, in <module>
[Tue Mar 29 08:57:24.729845 2022] [wsgi:error] [pid 6074] [remote 1.17.1.5:58516] from flask import render_template, Response
[Tue Mar 29 08:57:24.729863 2022] [wsgi:error] [pid 6074] [remote 1.17.1.5:58516] ModuleNotFoundError: No module named 'flask'
Now, Puppetboard does seem to install properly but it's the Python module (I hope I'm describing it properly) that's giving me trouble.
Apache is running, but I get the following from curl/browser:
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator at [no address given] to inform them of the time this error occurred, and the actions you performed just before this error.
More information about this error may be available in the server error log.
A manual run of the WSGI yeilds:
[root@rhel8gold ~]# python3.8 /srv/puppetboard/puppetboard/wsgi.py
Traceback (most recent call last):
File "/srv/puppetboard/puppetboard/wsgi.py", line 14, in <module>
from puppetboard.app import app as application
File "/srv/puppetboard/puppetboard/puppetboard/app.py", line 7, in <module>
from flask import render_template, Response
ModuleNotFoundError: No module named 'flask'
It's been about four years since I've implemented a Puppet environment so I'm a bit rusty. I've tried the recommendations here:
https://github.com/voxpupuli/puppetboard/issues/527
and here:
https://github.com/voxpupuli/puppetboard/issues/582
but to no avail.
I've had even less success with RHEL7.
SELinux is off and the local firewall allows incoming TCP/80.
Here's my apache vhost config:
<VirtualHost *:80>
ServerName rhel8gold-puppetboard
## Vhost docroot
DocumentRoot "/srv/puppetboard/puppetboard"
## Directories, there should at least be a declaration for /srv/puppetboard/puppetboard
<Directory "/srv/puppetboard/puppetboard">
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Require all granted
</Directory>
## Logging
ErrorLog "/var/log/httpd/rhel8gold-puppetboard_error.log"
ServerSignature Off
CustomLog "/var/log/httpd/rhel8gold-puppetboard_access.log" combined
## WSGI configuration
WSGIDaemonProcess puppetboard group=puppetboard python-home=/srv/puppetboard/virtenv-puppetboard threads=5 user=puppetboard
WSGIProcessGroup puppetboard
WSGIScriptAlias / "/srv/puppetboard/puppetboard/wsgi.py"
</VirtualHost>
Update:
If I set variable puppetboard::python_version: '3.6' then puppetboard does install properly and runs. The RedHat.8.yaml sets the python version to '3.8' and only when python is set to 3.6 does the virtual environment initialize properly.
Same as #333?
Yep, nearly identical. When I changed the Python version to 3.6 everything worked. I'll rebuild my VM with python 3.8 and post the errors.
Hello everyone! I think I've chased down the issue here. Couple things to keep in mind:
- The RHEL 8 system version of Python is 3.6, so if you install the python3-whatever RPM, the Python
whatever
module gets installed in the Python 3.6 directories (e.g. /usr/lib64/python3.6/site-packages) - As noted above, this module specifies Python 3.8 as its default desired version
So if you have a puppetboard::apache::vhost
section on a RHEL server and take the defaults, this module:
- Uses Python 3.8 in the virtual environment it sets up
- Calls puppetlabs-apache's
apache::mod::wsgi
class with defaults (see e.g.puppetboard::apache::vhost
lines 56-58) -
apache::mod::wsgi
installs the python3-mod_wsgi RPM, its default package for RHEL 8 (remember, this will be the Python 3.6 mod_wsgi package) - The puppet-python module gets invoked and tries to install
python3
andpython3-pip
, which fails (but you can work around this by telling it to install whichever version of Python you really want, e.g.:
class { 'python':
version => 'python38',
}
Note that this module requires you to specify the Python version including the decimal point between major and minor release, but the RHEL packages do not have a decimal.
The upshot of all this is that at first the modules don't even get installed in the virtual environment, and then if you fix the problem with the puppet-python package trying to install the wrong version, they are installed but don't work, because the mod_wsgi that's installed is looking for packages in the Python 3.6 paths (I got this error by making wsgi.py write out sys.path: [Tue Jun 14 14:27:32.182043 2022] [wsgi:error] [pid 3519] ['/srv/puppetboard/puppetboard', '/usr/lib64/python36.zip', '/usr/lib64/python3.6', '/usr/lib64/python3.6/lib-dynload']
). If you manually uninstall the python3-mod_wsgi RPM and install (assuming Python 3.8) python38-mod_wsgi, Puppetboard starts working after an Apache restart (but of course Puppet hates that and so do I ;-) ). Thus, it seems to me the solution is for this module to be more specific about the package name on RHEL8 servers when calling apache::mod::wsgi
, especially since thanks to DNF modules people might be using a variety of Python versions.
Hello again, I've found a workaround for the "wrong mod_wsgi" issue: use Hiera to declare some class defaults for apache::mod::wsgi
. I added the following to my node's Hiera YAML file (continuing to use Python 3.8 as the example version):
---
apache::mod::wsgi::package_name: 'python38-mod_wsgi'
apache::mod::wsgi::mod_path: 'modules/mod_wsgi_python3.so'
...and now Puppet runs and sets up Puppetboard without issues. Note you do need both, if you try to specify just package_name
it complains that it needs mod_path
also. In case you prefer it, the full path to the module on RHEL is /usr/lib64/httpd/modules/mod_wsgi_python3.so
. Hope this is helpful!