如何使用Ansible管理Linux容器


【编者的话】在容器技术流行的背景下,我们通常使用Dockfiles去构建容器镜像。但是在使用时Dockfiles并不那么友好,“不够爽”。本文介绍了另一种构建镜像的方案,Ansible。让我们来进一步了解Ansible吧。

Ansible容器改进Dockerfile的缺陷,提供容器项目的完全管理

我喜爱容器,每天都使用它。即便如此,容器不是完美的。在过去的几个月里,不管怎样,出现的一些项目解决了我所经历的一些问题。我开始使用Docker。因为这个项目使得容器技术如此流行。除了使用容器引擎之外,我学习了怎么使用Docker-compose并用它管理我的项目。我的生产率暴涨!一键运行我的项目,不管它多么的复杂。我很高兴。

一段时间后,我开始注意一些问题。最明显的是创建容器镜像的过程。Docker工具使用自定义文件格式(Dockerfile)作为生产容器镜像的方法。这个格式非常容易学习,过一会儿你就可以自己制作容器镜像了。一旦你想掌握最佳实践或有复杂场景,问题就出现了。

让我们休息一下,到另外的地方去探索:Ansible的世界。你知道它吗?太棒了,对吧?你不知道?好,该是学点新东西的时候了。Ansible是可以让你在写任务和执行它们在你选择的环境中管理你的基础设施的一个项目。不需要安装和配置任何服务;一切都可以很容易地从你的笔记本电脑上运行。很多人已经拥抱Ansible。

想象下这个场景:你选用了Ansible,你写了很多Ansible的角色和脚本用来管理你的基础设施,你考虑选用容器,你该怎么办?通过Shell脚本和Dockerfiles开始写容器镜像定义?听起来不太对。

Ansible研发团队里的有些人问这个问题,意识到那些每天写和使用的相同的Ansible角色和脚本,也可用于制作容器镜像。但不只是他们能用来管理容器项目的全生命周期。从这些点子中诞生了Ansible容器项目。它利用现有的Ansible角色可以转化为容器镜像,甚至可以用于整个应用程序生命周期,从构建到部署在生产中。

让我们对我提到的关于Dockerfiles上下文的最佳实践的话题。提醒一句:这将是非常具体和技术性的。下面是我的三个问题:

1. 嵌入在Dockfiles的Shell脚本

在Dockerfiles时,你可以指定一个脚本,将被解析通过bin/sh -c,可以像这样:
RUN dnf install -y nginx

其中RUN是一个Dockerfile指令,其余的是它的参数(传递给shell)。 但编造一个更复杂的场景:
RUN set -eux; \
\

this "case" statement is generated via "update.sh"

    %%ARCH-CASE%%; \
\
url="https://golang.org/dl/go${GOLANG_VERSION}.${goRelArch}.tar.gz"; \
wget -O go.tgz "$url"; \
echo "${goRelSha256} *go.tgz" | sha256sum -c -; \ 


这是一个Golong的官方镜像。它看上去不完美,对吗?

2. 你不能简单的解析Dockerfiles

Dockerfiles是一个全新的文件格式而没有一个正式的规范。如果你需要运行Dockerfiles在你的基础设施中这是非常棘手的(例如:自动构建中的一点)。只有代码规范是容器化的一部分。问题是你不能作为一个库使用它。最简单的办法是写一个解析器,并希望得到最好的结果。难道就不能更好的利用一些流行的标记语言,如YAML或JSON?

3. 它很难控制

如果你熟悉容器镜像的内部结构 ,您可能知道每个镜像都是由层组成的。一旦容器被创建,这些层就会使用联合文件系统相互堆叠。(像煎饼)问题是,你无法明确地控制这种分层,你不能说,“这里开始一个新层”, 您被迫以可能会以影响可读性的方式更改Dockerfile。更大的问题是,必须遵循一套最佳实践来达到最佳效果。

比较Ansible语言和Dockerfiles

在Dockerfiles对比Ansible最大的区别是,Ansible,作为一种语言,是更强大的。例如,Dockerfiles没有直接的变量概念,而Ansible拥有完整的模板系统(变量是其功能之一)。Ansible包含大量的模块能简单的使用。如wait_for,可用于服务读取检查。例如,等待直到一个服务准备之前的过程。使用Dockerfiles,一切都是一个shell脚本。因此,如果您需要确定服务准备情况,则必须使用shell(或单独安装)来完成服务准备工作。shell脚本的另一个问题是,随着复杂性的增加,维护成为一种负担。很多人已经明白并把这些脚本移至Ansible。

如果你对这个话题感兴趣,想了解更多,请到布拉格开源峰会观看我的主题演讲,10月23日,周一,下午4:20 在Plamovka的房间。

作者:托马斯.托梅切克,工程师,骇客,布道师,思想家,专注容器、Linux、开源软件、python 3、rust,、zsh、 tmux.。

原文链接:How to manage Linux containers with Ansible Container(翻译:吴锦晟)

0 个评论

要回复文章请先登录注册