привязки и доступность libselinux-python
Извините за ответ на мой собственный вопрос, но я видел это на нескольких форумах, поэтому я хотел опубликовать это в надежде, что это поможет кому-то другому.
Основная проблема возникает при попытке запустить Ansible в старых интерпретаторах Python, особенно Python 2.6 в RedHat 5, и при получении сообщений об ошибках "привязки libselinux недоступны" или подобных ошибках.
Хотя это может произойти с любым приложением на основе Python, я чаще всего вижу это на Ansible. Ansible предполагает, что модуль selinux доступен, и всегда будет пытаться импортировать его во время выполнения.
2 ответа
Привязки libselinux-python не являются простым модулем python. Модуль должен быть скомпилирован как для целевой версии Python, так и для целевой версии libselinux. Хорошие ребята, поддерживающие репозитории RedHat 5 EPEL, не создали модуль Python 2.6/libselinux 1.33.
"Существующий" модуль libselinux-python из стандартных репозиториев не будет работать, потому что он специфичен для поставляемого интерпретатора Python 2.4. Если вы скопировали модуль из другой установки Python 2.6, скажем, из системы RedHat 6, это тоже не сработает, потому что он построен на неправильной версии libselinux. Хотя вы можете развлекаться с различными ошибками, создаваемыми различными комбинациями, Ansible не станет различать их; он просто укажет, что привязки недоступны.
Решение состоит в том, чтобы создать "заглушку" модуля Python selinux для усмирения Ansible. Создать файл
/usr/lib64/python2.6/site-packages/selinux/__init__.py
со следующим содержанием:
def is_selinux_enabled():
return False
def is_selinux_mls_enabled():
return False
(Это код Python, поэтому не забывайте об отступах.) Это фактически отключает работу Ansible с selinux. Кроме того, задачи, выполняемые в этих системах, не должны включать никаких атрибутов selinux, таких как setype или seuser. (Честно говоря, я не тестировал его полностью.) Но базовые модули, такие как lineinfile или command, теперь работают правильно.
Это не требует отключения selinux; он только не позволяет Ansible манипулировать атрибутами selinux. При необходимости вы всегда можете использовать один из командных модулей для написания сценария вокруг него.
Я хотел бы опубликовать это как комментарий к ответу @crankyeldergod (поскольку его ответ заставил меня выяснить, как исправить эту проблему), но у меня пока недостаточно сообщений для комментариев.
Я также продолжал получать
"Aborting, target uses selinux but python bindings (libselinux-python) aren't installed!"
ошибка, несмотря на установленные пакеты libselinux-python. я вошел в
/usr/lib64
и проверил каталоги python, которые я нашел там, пока не нашел тот, в котором присутствуют файлы selinux. Я обратил внимание на эту версию Python и явно объявил ее в своем файле инвентаря, т.е.
ansible_python_interpreter=/usr/bin/python3.6
в моем случае, и это решило проблему.