[Ansible 2.12] 在 WSL2 中使用 Docker 为 CentOS 6 构建 Ansible 执行环境

目录
大家好,
我是系统解决方案部门的Naka。最近我一直胃痛难忍,还总是发冷,导致我无法入睡,而且浑身乏力。
本文解释了如何“在 WSL2 中使用 Docker 构建用于运行 CentOS 6 环境的 Ansible 执行环境”。
虽然强烈建议迁移 CentOS 6 等较旧的环境,但由于各种原因,这些环境可能会继续保留。
在这些环境下,当前版本的 Ansible 基本上不兼容。
因此,我们准备了一个使用 Docker 设置旧版本环境的简便方法。
我将先解释前提条件,然后再一步一步地解释步骤。
介绍
- 我们不建议使用 CentOS 6。这只是
在您被迫使用 CentOS 6 的情况下的临时解决方案。 - 是一个不受支持的版本。
它仅作为临时解决方案,不建议使用。
执行环境
■ Linux 环境
操作系统:AlmaLinux 8.5 版(WSL2 环境)
Shell:Bash
Docker:26.1.0,版本 9714adc■ 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
先决条件
问:为什么CentOS 6环境需要单独的Ansible环境?
A. 新版本的 Ansible(2.13 及更高版本)不再支持 Python 2.6,而 Python 2.6 是 CentOS 6 的标准,因此您将无法再运行 playbook。
问:为什么在 WSL2 中使用 Docker?
A. 我主要使用的 Ansible 环境是 AlmaLinux 8 (WSL2),在该环境中运行 Ansible 更方便,包括管理 playbook。
问:用 Docker 代替 pyenv 吗?
A. 总结:从作者的角度来看,Docker 更方便、更容易使用。
- (因为使用频率不高)如果使用 Python 版本控制,迁移到另一台电脑时重新构建会很麻烦。
- Dockerfile 更易于重用,其他人可以使用它来创建相同的环境。
- 使用 Docker 更像是基础设施工程师的工作,而不是使用 Python 版本控制系统的工作。
乐趣变得有知识- (从我的角度来看)即使我忘记了我输入了什么,也很容易查看 Dockerfile 并弄清楚。
问:为什么选择 Ansible-core 2.12?
A. 2.12 是托管节点上与 2.6 兼容的最新 Python 小版本。
* 如果绝对需要在控制节点上运行 Python 2.7 或 3.7,请使用 2.11。
施工程序
1. WSL2 准备
这并非本文的主要内容,所以我将简要解释一下。


在“Windows 功能”中启用“虚拟机平台”。
然后,从 Microsoft Store 下载“Windows Subsystem for Linux”和“AlmaLinux 8 WSL”。
您可以通过启动“AlmaLinux 8 WSL”并首次设置用户名和密码来使用它。
2. Docker 准备
首先,安装 Docker。
#dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo #dnf install docker-ce #systemctl start docker #systemctl enabled docker #docker --version Docker 版本 26.1.0,构建版本 9714adc *在作者的环境中
3. 创建 Dockfile 文件
选择一个工作目录,并在该目录中创建 Dockerfile。
我目前在 /home/AlmaLinux/docker-study/ 目录下工作,但您可以根据自己的需要进行配置。
# 指定镜像 FROM almalinux:8.9 # 将时间刻度更改为日本时间 RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime # 安装所需软件包 RUN dnf -y install \ python38 \ python38-devel \ sshpass \ openssh-clients \ && rm -rf /var/cache/dnf/* \ && dnf clean all # 安装 Ansible 2.12 RUN pip3 --no-cache-dir install ansible-core==2.12.10 # 指定绑定挂载目标并自动创建 # 访问容器时的默认目标 WORKDIR /work
来自 almalinux:8.9
它与 WSL2 中使用的发行版主版本号相匹配。
运行 ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
已设置为日本时间。
如果我把它保留为 UTC 时间,就会不同步,当我想要保留日志时会很麻烦,所以我现在想把时间调整一下。
运行 dnf -y install \
AlmaLinux 8 Appstream 软件仓库,python3.8(3.9 也可以)
另外,由于与 ssh 相关的 sshpass 和 openssh-client 有时未包含在镜像中,因此需要安装它们。
&& rm -rf /var/cache/dnf/* \
删除 dnf(≒yum)缓存以减小 Docker 镜像的大小。
下面描述的 dnf clean all 命令似乎无法删除这些文件,所以请先尝试手动删除它们。
&& dnf clean all
删除 dnf(≒yum)缓存以减小 Docker 镜像的大小。
为什么是“&&”而不是“RUN”?
为了减小 Docker 镜像的大小。
每次 RUN 操作都会在 Docker 镜像中添加一个新的层,从而增加其大小。
因此,我们将可以在单次 RUN 操作中处理的部分合并起来,以减小镜像大小。
运行 pip3 --no-cache-dir install ansible-core==2.12.10
由于 Ansible 2.10 及更高版本与 2.9 及更早版本格式不同,我们指定了轻量级核心“ansible-core”。
其中,我们指定了 2.12.10,即 2.12 的最新版本。
如果您想重用长期使用的 Playbook,出于兼容性考虑,最好指定“ansible==2.9.27(或您之前使用的版本)”。
*如果版本过旧,则可能需要 Python 2 或 3.8 或更早版本,因此需要进行一些调整。
补充资料:关于收藏
由于“ansible-core”是最低配置,因此只能使用基本集合(ansible.builtin)。
如果您想在使用多个模块的同时使用“ansible-core 2.12.10”,建议指定“ansible==5.10.0”,这是一个包含“ansible-core 2.12.10”及相关模块的社区软件包。
但是,这样做会增加镜像文件的大小。
另外,如果你的 Playbook 编写得当,能够安装必要的集合,那么只使用“ansible-core”应该就可以了。
由于集合关系和版本兼容性比较复杂,本文仅使用基本的“ansible-core”。
工作目录 /work
这指定了 Dockerfile 中的工作目录。
在本例中,它指定了执行绑定挂载时对象将被放置的目录。
使用 WORKDIR 指定目录可以省去使用 mkdir(Linux 命令)的步骤,因为它会自动创建目录,从而减少需要编写的代码量。
此外,即使进入容器,这些设置也会保留,允许您直接从绑定挂载点开始工作。
4. Docker 构建
根据 Dockerfile 创建镜像。
#docker build -t ansible2.12:v1 -f Dockerfile . #docker images REPOSITORY TAG IMAGE ID CREATED SIZE ansible2.12 v1 58f4663b655b 14 seconds ago 286MB
我成功创建了一个镜像,其仓库名称为“ansible2.12”,标签名称为“v1”。
5. docker run(绑定挂载)
我结合使用 WSL2 和 VScode 来编写 playbook 和其他东西。
因此,我们将创建一个名为 work 的目录,用于处理 Ansible 2.12,并将其绑定挂载为共享目录。
#cd /home/username/docker-study *验证目录,作者的工作文件所在位置 #docker run -it --name Ansible2.12 --mount type=bind,src=./work,dst=/work ansible2.12:v1
为了方便发布到博客,我使用了相对路径 `src=./work` 编写代码,所以请在包含“work”目录的位置运行上述命令。
使用绝对路径也可以,这取决于您的个人喜好。
6. 启动执行环境
现在我们来运行它。
#docker run -it --name Ansible2.12 --mount type=bind,src=./work,dst=/work ansible2.12:v1 [root@cf3c2fa0c4d8 work]#
容器已通过“-it”选项与执行同时连接。WORKDIR
也正常工作,看来我们已经迁移到“/work”目录。
7. Ping 测试
为了快速测试您的 Ansible 是否正常,请尝试使用 ansible-core (ansible.builtin) 标准集合中的 ping 模块。
[root@cf3c2fa0c4d8 work]# ansible -m ping -i hosts targetnode [弃用警告]: ansible-core 2.13 需要目标系统上安装 Python 2.7 或更高版本。当前版本:2.6.6 (r266:84292, 2016 年 8 月 18 日 15:13:37) [GCC 4.4.7 20120313 (Red Hat 4.4.7-17)]。此功能将在 2.13 版本中移除。可以通过在 ansible.cfg 中设置 deprecation_warnings=False 来禁用弃用警告。 targetnode | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" }
虽然有警告,但由于目标(受管节点)是 CentOS 6(Python 2.6),它
只是通知您“ansible-core 2.13 及更高版本只能使用 Python 2.7 或更高版本(警告)”,因此您可以忽略它。
在用于验证的 CentOS 6 环境中,成功接收到 ping 请求。
完全的
至此,流程完成。
剩下的就是放置好战术手册和物品清单,就可以出发了。
我的下一篇文章将介绍适用于 CentOS 6 的 Ansible。
最后
我尝试在 CentOS 6 环境下使用 Ansible 快速完成这项工作,但它与当前版本不兼容。
撰写本文的目的是为了避免手动搭建专用环境并进行必要的验证所带来的麻烦。我事先做好了准备,以避免这种情况的发生。
我选择 Docker 是因为它看起来是最快捷的解决方案,而且确实简单方便。(暂且忽略运维方面的问题。)
我认为未来在我的基础设施工程工作中,我会更多地用到它。
我希望这篇文章能为读者提供一些有用的知识和信息。
感谢您读到这里。
参考资料
发布和维护 | Ansible 官方文档
:https://docs.ansible.com/ansible/latest/reference_appendices/release_and_maintenance.html
Dockerfile 参考 — Docker-docs-ja 24.0
https://docs.docker.jp/engine/reference/builder.html文档
使用绑定挂载 | Docker 文档
https://docs.docker.jp/storage/bind-mounts.html
层 — Docker-docs-ja 24.0 文档 | Docker 文档
https://docs.docker.jp/build/guide/layers.html
3
