[Ansible] CentOS 6 Playbook 的“(libselinux-python)未安装!”的解决方案
大家好。
我是中,系统解决方案部的成员,我突然很想吃沾面和意大利面。
往往会出现错误“ (libselinux-python) isn'tinstalled! ”
我认为这个错误通常可以手动处理。
然而即使机器数量很多并且您想使用Ansible麻烦。
在这种情况下,我想,“用 Ansible 解决这个问题会更容易”,并写了一本剧本。
这次,我们将介绍并解释 CentOS 6 的“(libselinux-python)未安装!”解决方案。
前言
- 我们不建议在 CentOS 6 上运行。
这只是对 CentOS 6 的紧急应对 - 您使用的版本不再受支持。
这也是为了紧急使用,不建议使用。
基本原因
(libselinux-python)未安装!
当使用文件操作等需要更改的模块时,
- 并未完全禁用
- 并且(*1)不包含 libselinux-python 软件包(*2)
这是一个错误,发生在以下情况:
*1. 如果禁用 SELinux,则不会出现此错误。
*2. 由于 Ansible 在 Python 上运行,因此这是 Python 运行 SELinux 所必需的。
*对于Python 3,它是“python3-libselinux”,但似乎一般不为CentOS 6提供它。
手动解决
# sudo yum 安装 libselinux-python
如果目标端包含“libselinux-python”,问题就基本解决了。
*“python3-libselinux”适用于 Python 3
但是,CentOS 6 已停产,如果存储库保持默认状态,您很可能无法使用 yum 。
在这种情况下,您将需要使用可用存储库中的 wget 和 rpm 执行本地安装。
因此,多种环境下的人工处理相对困难。
问:为什么要使用剧本来更改它?
A. 我想用 Ansible 来做这项工作,但是事先手动做很痛苦...不仅因为手动做很痛苦,还因为很
容易想到,“如果我需要做手动,我会手动完成这一切,”所以我想避免本末倒置。因此,我们的立场是, “我们希望积极地将可以用 Ansible 稳定完成的事情做到这一点。”
问:它与 CentOS 7 不兼容吗?
答:我认为通过分离剧本并在包含/导入阶段做出决策/分支来处理版本差异会更明智。
我担心如何使其兼容,但它已经包含了无法使用“yum”时的分支,这使得它有点复杂。
由于存储库的目录层次结构名称可能会根据操作系统版本而变化,因此会有更多分支。
我们没有包含它,因为我们认为在单个剧本中创建版本分支会降低可读性和可维护性。
执行环境
■ Linux 环境
操作系统:AlmaLinux 版本 8.5(WSL2 环境)
Shell:Bash
Docker:26.1.0,内部版本 9714adc■ Ansible 环境(WSL2 中的 Docker 容器)
操作系统:AlmaLinux 版本 8.9
Ansible:Ansible-core 2.12.10■ Windows 环境
操作系统:Windows11 Pro(版本:23H2)
语言设置:更改为日语■ CentOS 6 环境(Vagrant + VirtualBox)
操作系统:CentOS 6.9(bento / centos-6.9)
Vagrant:2.4.1
VirtualBox:7.0.18 r162988(Qt5.15.2)
IP:192.168.33.15
Ansible 2.12环境搭建步骤
使用对应的旧版本(2.12)
在上一篇文章中,我解释了如何构建 Ansible 2.12,请参考。
剧本
在 CentOS 6 环境中执行 playbook 时,旨在预防性使用, “如果先包含/导入它,则可以执行它而不会导致错误”
*当然,您也可以在出现错误后使用此playbook来解决问题。
libselinux-python_wget.yml
格式是使用 main.yml 端的 import_tasks 来加载此 playbook。
(因为作者喜欢将playbook分成角色,以提高可重用性、可读性和可维护性)
--- ## 变量默认值 # wget_repo | 默认值 ("http://ftp.iij.ad.jp/pub/linux/centos-vault") - 名称: 检查 SELinux ansible.builtin.command: cmd: getenforce 注册: SELinux_result - ansible.builtin.debug: var: SELinux_result.stdout - 名称: 检查 libeselinux-python ansible.builtin.shell: cmd: rpm -aq | grep libselinux-python 寄存器: rpm_resultignore_errors: yes - ansible.builtin.debug: var : rpm_result.stdout # 如果SELinux被禁用,Ansible无需添加即可执行,因此不会执行。 # 另外,如果已经安装了libselinux-python,则不会执行 - name: yum install libselinux-python ansible.内置 .yum: 名称: libselinux-python 状态: 存在 寄存器: yum_libselinux_resultignore_errors: yes 何时: not ( SELinux_result.stdout is search("disabled") ) and not ( rpm_result.stdout is search("libselinux-python*")) # 如果使用 yum 安装失败,请使用 wget 安装 - name: Setup libselinux-python when: yum_libselinux_result is failed and not ( rpm_result.stdout is search("libselinux-python*")) block: # 由于版本差异,自安装包名称也会更改,将包列表的 HTML 存储在变量中 -name: 获取 OS_version 包 ansible.builtin.uri: url: "{{ wget_repo | default('http://ftp.iij.ad.jp/pub /linux/centos-vault') }}/{{ ansible_distribution_version }}/os/x86_64/Packages/" method: GET return_content: yes register: packages_content # 从 HTML 中获取“libselinux-python”的 rpm 名称 - name:提取 rpm_name ansible.builtin.set_fact: rpm_name: "{{ packages_content.content | regex_search('libselinux-python-(.*?)\\.x86_64\\.rpm') }}" - ansible.builtin.debug: var : rpm_name # 使用获得的rpm名称进行下载 - name: 下载 libselinux-python ansible.builtin.get_url: url: "{{ wget_repo | default('http://ftp.iij.ad.jp/pub/linux/centos- Vault') }}/{{ ansible_distribution_version }}/os/x86_64/Packages/{{ rpm_name }}" dest: "/tmp/{{ rpm_name }}" # 在无法使用 yum 的情况下使用 rpm 安装 - name:安装 libselinux-python ansible.builtin.命令: rpm -ivh /tmp/"{{ rpm_name }}"
我主要在评论中写下了我的意图,但我也会在下面解释它们。
# wget_repo:| 默认(“http://ftp.iij.ad.jp/pub/linux/centos-vault”)
如果您无法使用 yum,请直接从存储库获取 libselinux-python。
此时使用的存储库由变量指定,但如果未指定,则在开头进行注释以指定使用 IIJ 的存储库。
- 名称:检查 SELinux
- 名称:检查 libeselinux-python
在禁用 SELinux 的环境中,没有必要这样做,因为它将在没有“libselinux-python”的情况下运行。
首先,我检查状态,然后将其放入变量中进行判断。
另外,考虑到 yum 无法在 CentOS 6 上使用,我们将检查是否已使用 shell 模块中的 rpm 安装。
这也保存在一个变量中以供判断。
-名称:yum install libselinux-python
SELinux 状态为“已禁用”以外且未安装“libselinux-python”执行
尝试用yum模块安装,如果已经安装或者已经安装了就OK了。
如果“yum”无法使用并失败,则继续“ignore_errors: yes” ,将任务的失败放入变量中进行判断,并在后续任务中尝试直接从存储库中检索。
- 名称:Setup libselinux-python
当:yum_libselinux_result 失败时
块:
当使用“yum”安装失败时(when 条件)。
一个任务块,用于直接从存储库获取包并。
首先,使用ansible_facts的“ansible_distribution_version”从存储库的目录层次结构中获取与操作系统次要版本匹配的“libselinux-python”官方包名称,并将其保存在变量中。
然后使用该变量通过 get_uri 模块下载并通过命令模块使用 rpm 在本地安装。
执行示例
验证环境清单文件
CentOS 6(bento/centos-6.9)默认是密码认证,但可能存在不推荐
-- 全部: vars:ansible_user:流浪者主机:targetnode:ansible_host:192.168.33.15 ansible_ssh_pass:流浪者
主.yml
main.yml 端没有编写任何任务,并且使用 import_tasks 加载 playbook。
(因为作者喜欢将playbook分成角色,以提高可重用性、可读性和可维护性)
- 名称:libselinux-python 主机:targetnode< 变为:yes vars:wget_repo:“http://ftp.iij.ad.jp/pub/linux/centos-vault”任务 - 名称:包括 libeselinux-python(wget) ansible .builtin.import_tasks:libselinux-python_wget.yml
剧本执行
在本文中,我们将从具有早期 Ansible 版本的容器中运行它。
[root@author 容器环境工作]# ansible-playbook -i 主机 main.yml
最后
虽然花费了很多时间,但我尝试将可以标准化的工作合并到Ansible中。
之后,您可以多次重复使用它,这很好,因为我在习惯 Ansible 方面学到了很多东西。
CentOS 6 环境下大概率无法使用 yum,导致安装 Ansible 的门槛很高,所以
希望这篇文章能给阅读本文的人一个尝试 Ansible 的机会或者提供一些有用的知识/信息。
感谢您阅读本文!
参考资料
ansible.builtin.yum 模块 – 使用 yum 包管理器管理包
https://docs.ansible.com/ansible/9/collections/ansible/builtin/yum_module.html