0

很抱歉回答我自己的问题,但我已经在多个论坛中看到了这个问题,所以我想发布这个希望它可以帮助其他人。

当尝试针对较旧的 Python 解释器(尤其是 RedHat 5 上的 Python 2.6)运行 Ansible 并收到有关“libselinux 绑定不可用”或类似错误的错误消息时,就会出现基本问题。

虽然这可能发生在任何基于 Python 的应用程序中,但我在 Ansible 上最常见。Ansible 假定 selinux 模块是可用的,并且总是会尝试在运行时导入它。

4

2 回答 2

1

我本来想将此作为对@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就我而言,这解决了这个问题。

于 2022-01-09T19:19:54.287 回答
0

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 不会费心去区分它们;它只会声明绑定不可用。

解决方案是创建一个“存根”selinux python 模块来安抚 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 属性,例如setypeseuser。(老实说,我还没有完全测试它。)但是像lineinfilecommand这样的基本模块现在可以正常工作了。

这不需要禁用 selinux;它只会阻止 Ansible 操纵 selinux 属性。如有必要,您始终可以使用其中一个命令模块围绕它编写脚本。

于 2020-04-14T15:42:08.943 回答