[Ansible 2.12] 在 EOL CentOS 6 上使用 yum 的 Playbook
大家好。
我是系统解决方案部门的成员,希望使用 Ansible 提高工作效率。
之前写过一篇题为“在 EOL CentOS 6 上使用 yum [存储库更改]”
CentOS 6 EOL 的默认存储库不再可用,并且由于错误而无法使用 yum。
所以,内容就是把repository改成还可以用的东西。
然而,在上面的文章中,更改是“手动”完成的。
你的环境有多个CentOS 6 服务器,手动支持所有服务器将会很痛苦。
另外,如果手动操作多个单元,则发生事故的可能性很高,因此我想使用“代码”来处理这个问题。
这次,我们将介绍“代码”和“Ansible 的 playbook 以在 EOL CentOS 6 上启用 yum”并解释如何运行它。
前言
- 我们不建议在 CentOS 6 上运行。
这只是对 CentOS 6 的紧急应对 - 您使用的版本不再受支持。
这也是为了紧急使用,不建议使用。
前提解释
问:为什么要使用剧本来更改它?
一个。
1.“如果手动执行,工作时间与机器数量成比例增加”
→ 使用 Ansible ,即使机器数量增加,与手动工作相比,也可以在更短的时间内处理。
因此,单位越多,工作效率就越高。您可以避免让您的人员整天忙于工作。
2. “多台机器上的手工作业容易发生事故。”
→ 当工作连续进行时,它往往会变成流水线作业,并且很容易出现作业错误。通过将其转换为剧本,您可以对所有机器进行相同的更改,而不会犯任何错误。
3.“Playbook也可以作为流程手册进行重复使用和继承”
→ 存在流程手册不保留的情况,以及需要修改才能重复使用的情况。
然而,对于剧本,您通常可以通过简单地更改目标来按原样使用它们,并且它们“很难消亡”。
问:如果我仍然想手动操作怎么办?
A.我在之前写的一篇文章中解释了手动过程。
请参考这里。
问:如果出现“(libselinux-python)未安装!”错误,手动执行此操作似乎更容易。
答:我认为当 SELinux 没有完全禁用并且“libselinux-python”包不可用时,就会出现此错误。
人们很容易本末倒置地想: “手动完成工作来纠正错误更容易。”因此,在上一篇文章中,我们介绍了一个可以组合使用的解决问题的playbook,所以请使用它。
执行环境
■ 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 环境
操作系统: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环境搭建步骤
由于CentOS 6环境基本使用旧版本的Python,因此Ansible使用相应的旧版本(2.12)。
在之前的文章中,我解释了如何构建 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\"')) } }" 注册: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') }}"默认('/etc/yum.repos.d/CentOS-Base.repo_' + Lookup('pipe', 'date +\"%Y%m%d\"')) }}" 模式:“0644”remote_src : yes when: not backup_base_repo_result.stat.exists # 如果releasever不存在,则使用当前版本号创建它 - name: Set releasever ansible.builtin.shell: cmd: echo "{{ ansible_distribution_version }}" > /etc/yum /vars/releasever args: create: /etc/yum/vars/releasever - ansible.builtin.debug: var: ansible_distribution_version # 通过注释掉存储库的镜像列表并将基本URL重写为可用存储库来启用 - name : 替换镜像列表 ansible.builtin .replace: 路径: "{{ repo_source | default('/etc/yum.repos.d/CentOS-Base.repo') }}" 正则表达式: "{{ item.regexp }}" 替换: "{{ item.替换}}”循环: - 正则表达式:'^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') } }" register: Replace_result # 更改存储库时删除 yum 缓存 - name: Clean yum 缓存 ansible.builtin.command: cmd: yum clean all when: Replace_result ischanged
## 变量默认值
变量的显式默认值。
它还被列为指南,以便当您想要相对于变量单独指定它时更容易理解。
# Base.repo 备份
使用 stat 模块检查其是否存在,并使用寄存器将其存储在变量中。
由何时决定,如果当天没有存储库的备份,则获取。
从现在开始,将路径目的地、存储库等放入变量中,并使用默认过滤器来指定变量的默认值。
此外,对于使用查找插件的备份,我们在文件名末尾添加了年、月、日,以便于识别。
# 如果releasever不存在,则使用当前版本号创建
使用 yum 时创建一个变量文件来修复版本。
ansible.builtin.shell模块用于进行判断和处理。
由于该模块使用操作系统端功能,因此不执行幂等性检查。
然而, args ->creates 参数允许你指定“如果指定的文件不存在则不执行”的条件,所以我使用它是因为我可以按照我的意图控制情况。
ansible_distribution_version
Ansible 端的 ,您可以获得执行环境的当前操作系统版本(本例中为 6.9)。
上面是通过echo命令创建文件的。
为了确定起见,请使用 ansible.builtin.debug 模块在控制台上显示变量的内容。
# 注释掉存储库中的镜像列表并将 baseurl 重写到可用存储库以启用它
在ansible.builtin.replace模块中,有两个地方被重写,如标题所示。
这对应于在手动过程中使用 sed 命令重写的部分
我使用循环来指定两个位置,但也可以使用 with_items 执行。
将执行结果用寄存器保存起来,供下一步处理时使用。
# 当存储库更改
时删除 yum 缓存:replace_result 更改
yum 模块没有相当于 yum clean all 的功能,该功能会删除 yum 缓存
因此,我们使用 ansible.builtin.command 模块,它执行像 shell 一样的操作系统命令。
使用replace模块重写repository的结果用register保存,只有在确认“changed”时才执行。
旁注:shell 模块和 Command 模块之间的区别
由于Shell模块因此可以使用操作系统中的环境变量和管道。
它很方便,因为它允许您执行通常在环境中使用的单行代码。
Command模块不经过shell,因此无法使用环境变量等。
这也是一个优点,因为它消除了由于环境特定变量而导致意外行为的可能性。
但是,由于这些使用目标操作系统的命令而不是 Ansible,因此无法确保幂等性。
如果模块无法处理,这只是
执行示例
验证环境清单文件
在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分成角色,以提高可重用性、可读性和可维护性)
对于变量,使用playbook中default中指定的值,因此即使不指定也可以执行。
然而,我们特意写下了可以使用变量更改的项目和内容,因为我们认为它们很容易直观地理解。
- 名称:main.yml 主机:targetnode 变为: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' jobs: #当 SELinux 未禁用且 libselinux-python 不存在时安装 - name: Include libeselinux-python(wget) ansible.builtin.import_tasks: libselinux-python_wget.yml # 更改Centos6 Base 的初始存储库 - 名称:包括 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 ERROR 6 - “无法解析主机 'mirrorlist.centos.org'” 错误:找不到存储库的有效基本 URL:base *发生错误,无法使用,因为存储库不再可用。
■Playbook 执行 [root@author 容器环境工作]# ansible-playbook -i Hosts main.yml ~省略~ PLAY RECAP ************************ ****** ********************************************** ****** ********************************************** ****** targetnode: ok=17changed=8unreachable=0failed=0skipped=0saved=0ignoreed=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 | 00 :00 更新 | 3.4 kB 00:00 更新/primary_db | 8.1 MB 00:00 可用软件包名称:php Arch:x86_64 版本:5.3.3 ~省略~
运行 playbook 后,存储库错误已解决并且元数据已检索。
之后,yum info php的结果就输出了,所以我可以确认我能够成功使用yum。
最后
我这次写的内容是基于我实际用 Ansible 做一些事情的经验。
当时的剧本是匆忙创建的,所以它比现在更粗糙,可重用性也较差,但我很高兴能够改进它并在这个博客中写下它。
如果需要做某事,你会急于准备,我认为你最终往往会得到只能当场使用的东西。
如果您有时间,准备一本包含通用内容的剧本可能是个好主意。
我希望阅读本文的人能够开始使用 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仓库地址
?