[Ansible 2.12] 用于在已停止维护的 CentOS 6 上启用 yum 的 Playbook

大家好,
我是系统解决方案部门的Naka,我想利用Ansible提高我的工作效率。
之前写过一篇题为“使 yum 在 EOL CentOS 6 上可用 [存储库更改]”的文章。
CentOS 6 的默认软件仓库已不再可用,导致 yum 无法正常工作。
因此,本文将介绍如何将软件仓库更改为仍然可用的仓库。
然而,上述文章描述的是一种“手动”更改过程。
有多台CentOS 6 服务器,手动更新所有服务器会非常麻烦。
而且,在多台服务器上手动更新会增加出错的几率,所以我还是希望手动更新。
这次,我们将介绍一个适用于“代码”和“Ansible”的“Playbook”,它允许您在已停止维护的 CentOS 6 上使用 yum,并解释如何运行它。
介绍
- 我们不建议在 CentOS 6 上使用它。
由于不可避免的原因而作为 CentOS 6 的临时解决方案。 - 此版本已停止支持。
此外,只是一个临时解决方案不建议使用。
先决条件
问:为什么要修改战术手册?
一个。.
1. “人工操作时,工作时间与机器数量成正比。”
→ 使用 Ansible ,即使机器数量增加,完成工作所需的时间也比人工操作短得多。
因此,机器越多,工作效率就越高。这样可以避免员工整天被工作缠身。
2.“在多台机器上进行人工操作容易发生事故”
→当工作连续进行时,往往会变成流水线作业,很容易出错。通过为此创建操作手册,您可以对所有机器进行相同的更改而不会出错。
3. “剧本也可以像程序手册一样重复使用和传承”
→ 有些情况下,程序手册即使被重复使用,也可能无法保留或需要修改。
然而,剧本通常只需更改目标即可直接使用,因此“不太可能失效”。
问:如果我还是想手动操作呢?
A.我在之前的文章中已经解释过手动操作步骤。
请参考这里。
问:如果出现“(libselinux-python) 未安装!”的错误,手动安装似乎更容易一些。
A. 我认为当 SELinux 没有完全禁用且缺少“libselinux-python”软件包时,就会出现此错误。
人们很容易本末倒置,认为“用同样的手动方式纠正错误更容易
。因此,我们在之前的文章中介绍了一个可以与此结合使用的解决方案手册,请充分利用它。
[Ansible] CentOS 6 Playbook 中“(libselinux-python) 未安装!”问题的解决方案
执行环境
■ Linux 环境
操作系统:AlmaLinux 8.10 版本(WSL2 环境)
Shell:Bash
Docker 版本 26.1.3,构建版本 b72abbb■ Ansible 环境(WSL2 中的 Docker 容器)
操作系统:AlmaLinux 8.9 版
Ansible:Ansible-core 2.12.10■ Windows 环境
操作系统:Windows 11 专业版(版本: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 环境构建流程
由于 CentOS 6 环境通常使用较旧版本的 Python,我们将使用较旧的兼容版本(2.12)Ansible。
在之前的文章中,我们已经解释了如何构建 Ansible 2.12,请参考这篇文章。
剧本
手动任务
:“备份存储库”
、“指定版本”
、“重写基础存储库”
和“删除 yum 缓存”。
以上四个步骤已汇编成一本操作手册。
centos6_repo_change.yml
此剧本通过 main.yml 中的 import_tasks 加载。
(作者倾向于为每个角色创建单独的剧本,以提高可重用性、可读性和可维护性。)
--- ## 变量默认值 # repo_source | default('/etc/yum.repos.d/CentOS-Base.repo') # repo_dest | default(default_repo_path) # repo_url | default('http://ftp.iij.ad.jp/pub/linux/centos-vault/$releasever')" # Base.repo 备份 # 如果当天已存在备份,则不会检索 - name: 检查 base.repo 的备份 ansible.builtin.stat: path: "{{ repo_dest | default('/etc/yum.repos.d/CentOS-Base.repo_' + lookup('pipe', 'date +\"%Y%m%d\"')) }}" register: backup_base_repo_result< - name: 备份 base.repo ansible.builtin.copy: src: "{{ repo_source | default('/etc/yum.repos.d/CentOS-Base.repo') }}" dest: "{{ repo_dest | default('/etc/yum.repos.d/CentOS-Base.repo_' + lookup('pipe', 'date +\"%Y%m%d\"')) }}" mode: "0644" remote_src: yes when: not backup_base_repo_result.stat.exists # 如果 releasever 不存在,则使用当前版本号创建它 - name: 设置 releasever ansible.builtin.shell: cmd: echo "{{ ansible_distribution_version }}" > /etc/yum/vars/releasever args: creates: /etc/yum/vars/releasever - ansible.builtin.debug: var: ansible_distribution_version # 注释掉 repo 中的 mirrorlist 并将 baseurl 更改为可用的存储库以启用它 - name: 替换 mirrorlist ansible.builtin.replace: path: "{{ repo_source | default('/etc/yum.repos.d/CentOS-Base.repo') }}" 正则表达式: "{{ item.regexp }}" 替换: "{{ item.replace }}" 循环: - 正则表达式: '^mirrorlist=http://mirrorlist.centos.org' 替换: '#mirrorlist=http://mirrorlist.centos.org' - 正则表达式: '^#baseurl=http://mirror.centos.org/centos/\$releasever' 替换: "baseurl={{ repo_url | default('http://ftp.iij.ad.jp/pub/linux/centos-vault/$releasever') }}" 注册: replace_result # 更改存储库时,删除 yum 缓存 - 名称: 清理 yum 缓存 ansible.builtin.command: cmd: yum clean all 当: replace_result 更改时
## 变量默认值
指定变量的默认值。
它还可以作为指导,使单独指定变量时更容易理解。
# Base.repo 备份
使用 stat 模块检查它是否存在,并将其存储在寄存器变量中。
这取决于具体时间,如果当天没有存储库的备份,则会获取该备份。
从现在开始,路径目标、存储库等将变为变量,变量的默认值将使用默认过滤器指定。
此外,对于使用查找插件的备份,我们在文件名末尾添加了年、月、日,以便更容易区分。
# 如果 releasever 不存在,则使用当前版本号创建它。
创建一个变量文件,用于在使用 yum 时修复版本问题。
ansible.builtin.shell 模块用于判断和处理。
该模块使用操作系统函数,因此不执行幂等性检查。
但是, args -> creates 参数允许你指定“如果指定的文件不存在则不执行”的条件,所以我使用了它,因为它允许你将其控制到预期的情况。
ansible_distribution_version
在 Ansible 端 ,您可以获取执行环境的当前操作系统版本(本例中为 6.9)。
以上命令用于通过 echo 命令创建文件。
为了确保万无一失,请使用 ansible.builtin.debug 模块在控制台上显示变量的内容。
# 注释掉仓库镜像列表,并将基本 URL 更改为可用的仓库地址以启用它
ansible.builtin.replace 模块重写了标题中所示的两个地方。
这对应于在手动过程中使用 sed 命令重写的部分
我们使用循环来指定两个位置,但也可以使用 with_items 来实现。
执行结果通过寄存器保存,并在下一个进程中使用 when 语句。
# 当仓库发生更改时,删除 yum 缓存
:当 replace_result 发生更改时
yum 模块没有与 yum clean all 等效的函数,该函数会删除 yum 缓存
因此,我们使用 ansible.builtin.command 模块,它以与 shell 相同的方式执行操作系统命令。
使用替换模块重写前面提到的存储库的结果通过寄存器保存,并且只有在确认“已更改”时才会执行。
附注:shell 模块和命令模块的区别
Shell 模块使用 Shell,因此您可以在操作系统中使用环境变量和管道。
它非常方便,因为您还可以执行通常在环境中使用的单行命令。
命令模块不通过 shell 执行操作,因此无法使用环境变量。
这反而是一个优势,因为它避免了因环境变量而导致的意外行为。
然而,由于这些方法使用的是目标操作系统的命令而非 Ansible 的命令,因此无法保证幂等性。
只有在无法使用模块的情况下,才会考虑这种
例子
用于验证环境的库存文件
CentOS 6 (bento/centos-6.9) 环境中可能存在使用密码验证的环境(不推荐)
--- all: vars: ansible_user: vagrant hosts: targetnode: ansible_host: 192.168.33.15 ansible_ssh_pass: vagrant
main.yml
我没有在 main.yml 中编写任务,而是使用 import_tasks 来加载 Playbook。
(作者倾向于为不同的角色创建不同的 Playbook,以提高代码的重用性、可读性和可维护性。)
至于变量,将使用 Playbook 中指定的默认值,因此即使未指定也可以执行。
但是,我们列出了可以用变量更改的项目和内容,因为我们相信这样更容易直观理解。
- name: main.yml hosts: targetnode become: yes vars: wget_repo: "http://ftp.iij.ad.jp/pub/linux/centos-vault" repo_source: "/etc/yum.repos.d/CentOS-Base.repo" repo_dest: "/etc/yum.repos.d/CentOS-Base.repo_{{ lookup('pipe', 'date +\"%Y%m%d\"') }}" repo_url: '{{ wget_repo }}/$releasever' tasks: # 如果 SELinux 未禁用且 libselinux-python 不存在,则安装 - name: Include libselinux-python(wget) ansible.builtin.import_tasks: libselinux-python_wget.yml # 更改 CentOS 6 Base 的初始存储库 - name: Include centos6_repo_change ansible.builtin.import_tasks: centos6_repo_change.yml
libselinux-python_wget.yml是一个用于处理 SElinux 相关错误的 playbook ,如上一篇文章
centos6_repo_change.yml是本次引入的 Playbook。
剧本执行
在本文中,另一篇文章提到的先前 Ansible 版本,从容器中运行它
执行前,请检查验证机器上是否不能使用 yum。
■初步检查 [vagrant@targetnode ~]$ yum info php 已加载插件:fastestmirror 正在确定最快的镜像 无法检索镜像列表 http://mirrorlist.centos.org/?release=6&arch=x86_64&repo=os&infra=stock 错误代码为 14:PYCURL 错误 6 - “无法解析主机 'mirrorlist.centos.org'” 错误:找不到仓库 base 的有效 baseurl *该仓库已不再可用,因此会出现错误,无法使用。
■ 执行 Playbook [root@author 的容器环境 work]# ansible-playbook -i hosts main.yml ~省略~ PLAY RECAP ****************************************************************************************************************************** targetnode : ok=17 changed=8 unreachable=0 failed=0 skipped=0 rescued=0 ignored=2 *两个 Playbook 的执行结果已输出
■确认后 [vagrant@targetnode ~]$ yum info php 已加载插件:fastestmirror 正在确定最快的镜像 base | 3.7 kB 00:00 base/primary_db | 4.7 MB 00:00 extras | 3.4 kB 00:00 extras/primary_db | 30 kB 00:00 updates | 3.4 kB 00:00 updates/primary_db | 8.1 MB 00:00 可用软件包 名称:php 架构:x86_64 版本:5.3.3 ~省略~
运行 playbook 后,仓库错误已解决,元数据已检索完毕。
随后输出 `yum info php` 的结果,确认 yum 现在可以成功使用。
最后
本文基于我之前使用 Ansible 的经验。
当时我匆忙编写的 playbook 比较粗糙,可重用性也比现在的版本差,但我很高兴能够对其进行改进,从而撰写这篇博文。
在需要应对突发情况时才准备应对方案,就会比较仓促,而且方案往往只能当场使用。
如果你时间充裕,准备一份包含通用内容的应对方案或许是个好主意。
希望这篇文章能激发你尝试 Ansible 的兴趣,或者为你提供一些有用的知识和信息。
感谢你读到这里!
参考资料
ansible.builtin.yum 模块 – 使用 yum 包管理器管理软件包
https://docs.ansible.com/ansible/9/collections/ansible/builtin/yum_module.html
ansible.builtin.replace 模块 – 使用反向引用正则表达式替换文件中所有特定字符串的实例
https://docs.ansible.com/ansible/latest/collections/ansible/builtin/replace_module.html
如何更改 CentOS 6 软件源地址? | 阿里云
https://www.alibabacloud.com/help/en/ecs/user-guide/change-the-centos-6-source-address
3