[大阪/横滨/德岛] 寻找基础设施/服务器端工程师!

[大阪/横滨/德岛] 寻找基础设施/服务器端工程师!

【超过500家企业部署】AWS搭建、运维、监控服务

【超过500家企业部署】AWS搭建、运维、监控服务

【CentOS的后继者】AlmaLinux OS服务器搭建/迁移服务

【CentOS的后继者】AlmaLinux OS服务器搭建/迁移服务

[仅适用于 WordPress] 云服务器“Web Speed”

[仅适用于 WordPress] 云服务器“Web Speed”

[便宜]网站安全自动诊断“快速扫描仪”

[便宜]网站安全自动诊断“快速扫描仪”

[预约系统开发] EDISONE定制开发服务

[预约系统开发] EDISONE定制开发服务

[注册100个URL 0日元] 网站监控服务“Appmill”

[注册100个URL 0日元] 网站监控服务“Appmill”

【兼容200多个国家】全球eSIM“超越SIM”

【兼容200多个国家】全球eSIM“超越SIM”

[如果您在中国旅行、出差或驻扎]中国SIM服务“Choco SIM”

[如果您在中国旅行、出差或驻扎]中国SIM服务“Choco SIM”

【全球专属服务】Beyond北美及中国MSP

【全球专属服务】Beyond北美及中国MSP

[YouTube]超越官方频道“美由丸频道”

[YouTube]超越官方频道“美由丸频道”

[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.我在之前写的一篇文章中解释了手动过程。

请参考这里。

启用 yum 以在 EOL CentOS 6 上使用 [存储库更改]

问:如果出现“(libselinux-python)未安装!”错误,手动执行此操作似乎更容易。

答:我认为当 SELinux 没有完全禁用并且“libselinux-python”包不可用时,就会出现此错误。


人们很容易本末倒置地想: “手动完成工作来纠正错误更容易。”

因此,在上一篇文章中,我们介绍了一个可以组合使用的解决问题的playbook,所以请使用它。

[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 环境
操作系统: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,所以请参考这里。

【Ansible 2.12】在WSL2中使用Docker构建CentOS 6的Ansible执行环境

剧本

手动执行
: - “备份存储库”
- “指定版本”
- “重写基本存储库”
- “删除 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仓库地址

如果您觉得这篇文章有帮助,请点赞!
3
加载中...
3 票,平均:1.00 / 13
244
X Facebook 哈特纳书签 口袋
[2025.6.30 Amazon Linux 2 支持结束] Amazon Linux 服务器迁移解决方案

[2025.6.30 Amazon Linux 2 支持结束] Amazon Linux 服务器迁移解决方案

写这篇文章的人

关于作者

里面

2022 年加入 Beyond 职业生涯 属于
系统解决方案部门
LPIC-3 我有 304 和 AWS SAA 我的
常规饮料只有三种选择:牛奶、可乐和红茶。