[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
ja 24.0 文档https://docs.docker.jp/engine/reference/builder.htm
使用绑定挂载 | Docker 文档
https://docs.docker.jp/storage/bind-mounts.html
层 — Docker-docs-ja 24.0 文档 | Docker 文档
https://docs.docker.jp/build/guide/layers.html
3