使用Ansible Playbooks生成容器图像的工具

ansible-bender的Python项目详细描述


Ansible折弯机

生成状态ansibe行动手册 并将它们转换为容器图像。它有一个可插入的构建器选择- 这取决于你选择的工具,将用于构建你的容器 图像。现在唯一受支持的生成器是 buildah更多信息 以后再来。 Ansible Bender(AB)依赖于Ansible连接 插件 执行生成。

tl;ansibe博士是前端,buildah是后端。

这一概念在以下博客文章中介绍:

你可能会问:为什么不 ansible容器?Ansible Bender是 实际上,Ansible容器给了我们很大的启发:主要的区别在于 ansible容器覆盖了容器化应用程序的整个生命周期。 而AB只负责图像生成。

状态:准备使用

Ansible Bender最近被转移到Ansible社区组织。O/

特点:

  • 您可以用buildah作为后端来构建容器映像。
  • Ansible Playbook是您的构建配方。
  • 您可以通过cli或特定ansible vars设置各种图像元数据:
    • 工作目录
    • 环境变量
    • 标签
    • 用户
    • 默认命令
    • 暴露端口
  • 您可以在构建期间进行卷装载。
  • 缓存机制:
    • 每个任务结果都缓存为一个容器图像层。
    • 您可以用--no cache
    • 通过向任务添加标记no cache可以从某一点禁用缓存。
  • 通过向任务添加tagstop layering可以停止创建新的图像层。
  • 如果映像生成失败,它将被提交并以后缀命名-failed(因此 您可以查看内部并解决问题。
  • 该工具试图在基本图像中找到python解释器。
  • 您可以将生成的图像推送到远程位置,例如:
    • 注册表、tarball、docker守护程序,…
    • podman push用于执行推送。

接口

Ansible Bender有以下命令:

<表><广告>命令 说明 < /广告><正文>构建使用选定的行动手册生成新的容器图像列表生成列出所有版本获取日志显示生成日志检查OD>< /TD>提供有关选定生成的详细元数据按下将您生成的图像推送到远程位置。

安装

$ pip3 install ansible-bender

如果您足够勇敢,请直接从git master安装bender:

$ pip3 install git+https://github.com/ansible-community/ansible-bender

如果您的系统上没有pip3命令,您可以这样运行pip:

$ python3 -m pip install ...

要求(主机)

pip负责python依赖项,但是ansible bender也需要一些 主机系统上的二进制文件:

最后两个要求可能相当困难:您可以在 特权容器。

设置Buildah和Podman

如果以根运行ansible bender,则不需要设置任何内容。只是 安装软件包,你就可以走了。这是最好的方法- 当使用内核内覆盖时,buildah和podman的效率要高得多。 文件系统,您将遇到比无根文件系统更少的问题 模式

另一方面,如果您想利用无根容器 模式 您需要设置uid映射。它记录在 podman的 文档。您只需要在/etc/subuid和 /etc/subgid:

$ sudo sh -c "printf \"\n$(whoami):100000:65536\n\" >>/etc/subuid"
$ sudo sh -c "printf \"\n$(whoami):100000:65536\n\" >>/etc/subgid"

您应该参考podman的故障排除 指南 您遇到了问题。

要求(底图)

  • python解释器-ansible bender将尝试找到它(或者 可以通过--python解释器指定它。
    • 在主机上可以是Python2或Python3,但是 在基础图像中,这并不重要-Ansible能够利用 即使在控制机器上用python 3调用python 2。

要求(ansible playbook)

无。

本德复制你提供的剧本,这样它就可以被处理了。主机 变量在副本中被重写并更改为 工作容器-生成发生的位置。所以不管是什么 hosts变量的内容。

配置

您可以配置ansible bender并在最终图像上设置元数据,顺序如下 为此,请查看docs/configuration.md

负责的角色

如果你在你的剧本中使用角色,而他们在一个非标准的地方, 您可以利用环境变量来告诉ansible 你的角色是活的。bender没有篡改环境变量,所有的都是 传递给ansible playbook。

调试折弯机

可能会发生这样的情况:您的设置有问题,或者工具折弯机 依赖不是最好的状态。找到根本原因的最好方法是 在调试模式下运行bender并尽可能详细地运行ansible:

$ ansible-bender --debug build --extra-ansible-args='-vvvvvv'

用法

键入ansible bender可能需要一些时间,请考虑在 shell rc文件:

alias ab="ansible-bender"

构建图像

此存储库的根目录中有一个简单的行动手册,用于展示功能:

$ ansible-bender build ./simple-playbook.yaml

PLAY [Demonstration of ansible-bender functionality] ****************************************

TASK [Gathering Facts] **********************************************************************
ok: [a-very-nice-image-20190302-153257279579-cont]

TASK [Run a sample command] *****************************************************************
changed: [a-very-nice-image-20190302-153257279579-cont]
caching the task result in an image 'a-very-nice-image-20193302-153306'

TASK [Stat a file] **************************************************************************
ok: [a-very-nice-image-20190302-153257279579-cont]
caching the task result in an image 'a-very-nice-image-20193302-153310'

PLAY RECAP **********************************************************************************
a-very-nice-image-20190302-153257279579-cont : ok=3changed=1unreachable=0failed=0

Getting image source signatures

Skipping blob 767f936afb51 (already present): 4.46 MiB / 4.46 MiB [=========] 0s

Skipping blob b211a7fc6e85 (already present): 819.00 KiB / 819.00 KiB [=====] 0s

Skipping blob 8d092d3e44bb (already present): 67.20 MiB / 67.20 MiB [=======] 0s

Skipping blob 767f936afb51 (already present): 4.46 MiB / 4.46 MiB [=========] 0s

Skipping blob b211a7fc6e85 (already present): 819.00 KiB / 819.00 KiB [=====] 0s

Skipping blob 8d092d3e44bb (already present): 67.20 MiB / 67.20 MiB [=======] 0s

Skipping blob 492c5c55da84 (already present): 4.50 KiB / 4.50 KiB [=========] 0s

Skipping blob 6f55b6e55d8a (already present): 6.15 MiB / 6.15 MiB [=========] 0s

Skipping blob 80ea48511c5d (already present): 1021.00 KiB / 1021.00 KiB [===] 0s

Copying config 6b6dc5878fb2: 0 B / 5.15 KiB [----------------------------------]
Copying config 6b6dc5878fb2: 5.15 KiB / 5.15 KiB [==========================] 0s
Writing manifest to image destination
Storing signatures
6b6dc5878fb2c2c10099adbb4458c2fc78cd894134df6e4dee0bf8656e93825a
Image 'a-very-nice-image' was built successfully \o/

剧本就是这样的:

αααα8

如您所见,处理的整个构建都由变量配置 ansible\u bender

如果我们再次运行构建,我们可以看到ab从缓存加载每个任务:

$ ansible-bender build ./simple-playbook.yaml

PLAY [Demonstration of ansible-bender functionality] ****************************************

TASK [Gathering Facts] **********************************************************************
ok: [a-very-nice-image-20190302-153526013757-cont]

TASK [Run a sample command] *****************************************************************
loaded from cache: '7c69668c42987446cc78adbf6620fc2faf90ad10c3497662fe38940dd6de998f'
skipping: [a-very-nice-image-20190302-153526013757-cont]

TASK [Stat a file] **************************************************************************
loaded from cache: '4a4f54285928c03eea65745ee9feead88026c780a40126d94e79d5842bcdbe62'
skipping: [a-very-nice-image-20190302-153526013757-cont]

PLAY RECAP **********************************************************************************
a-very-nice-image-20190302-153526013757-cont : ok=1changed=0unreachable=0failed=0

Getting image source signatures

Skipping blob 767f936afb51 (already present): 4.46 MiB / 4.46 MiB [=========] 0s

Skipping blob b211a7fc6e85 (already present): 819.00 KiB / 819.00 KiB [=====] 0s

Skipping blob 8d092d3e44bb (already present): 67.20 MiB / 67.20 MiB [=======] 0s

Skipping blob 492c5c55da84 (already present): 4.50 KiB / 4.50 KiB [=========] 0s
Skipping blob 767f936afb51 (already present): 4.46 MiB / 4.46 MiB [=========] 0s
Skipping blob 6f55b6e55d8a (already present): 6.15 MiB / 6.15 MiB [=========] 0s
Skipping blob b211a7fc6e85 (already present): 819.00 KiB / 819.00 KiB [=====] 0s
Skipping blob 80ea48511c5d (already present): 1021.00 KiB / 1021.00 KiB [===] 0s
Skipping blob 8d092d3e44bb (already present): 67.20 MiB / 67.20 MiB [=======] 0s
Skipping blob 5f70bf18a086 (already present): 1.00 KiB / 1.00 KiB [=========] 0s
Skipping blob 492c5c55da84 (already present): 4.50 KiB / 4.50 KiB [=========] 0s

Skipping blob 6f55b6e55d8a (already present): 6.15 MiB / 6.15 MiB [=========] 0s

Skipping blob 80ea48511c5d (already present): 1021.00 KiB / 1021.00 KiB [===] 0s

Skipping blob 5f70bf18a086 (already present): 1.00 KiB / 1.00 KiB [=========] 0s

Copying config 354752b97084: 0 B / 5.26 KiB [----------------------------------]
Copying config 354752b97084: 5.26 KiB / 5.26 KiB [==========================] 0s
Writing manifest to image destination
Storing signatures
354752b97084fcf349a28a2f66839d270e728559883dd1edb5ec22e8c9c6adb9
Image 'a-very-nice-image' was built successfully \o/

列出构建

我们可以列出已完成的生成:

$ pip3 install ansible-bender
0

获取生成日志

想稍后检查生成日志吗?没问题!

$ pip3 install ansible-bender
1

使用podman定位构建的图像

一旦它们建成,您可以立即将它们与podman一起使用:

$ pip3 install ansible-bender
2

Buildah配置

如果你熟悉波德曼和buildah,你知道你可以 配置 这些工具。Ansible Bender不会以任何方式更改此配置,因此 如何建立Buildah和Podman取决于你。同样适用于跑步 Ansible Bender是否为根:buildah允许您使用无根 容器。

我的建议是使用覆盖存储后端。VFS后端很慢 效率低下。

缓存机制

ansible bender有一个缓存机制。默认情况下启用。AB缓存 任务结果(=图像)。如果任务内容没有更改,并且基本图像是 同样,该层是从缓存加载的,而不是再次被处理。这个 无法正确处理进程文件:ab不处理文件的任务 然而,

您可以通过两种方式控制缓存:

  • 通过运行ab build--no cache来完全禁用它
  • 或者在您的任务中添加一个名为no cache-ab的标记 不会尝试从缓存加载

分层机制

在默认情况下构建图像时,每个任务(安装程序除外)都将 缓存为图像层。这可能会对存储和 安全:可能有些东西你不想缓存或存储 在一个层中(证书、包管理器元数据、构建工件)。

AB允许您轻松禁用分层机制。你要做的就是 向将禁用分层(和缓存)的任务添加标记stop layering。 对于该任务和以下所有任务。

OKD中的Ansible Bender

最近我开始尝试在openshift中运行ab 起源-想象一下 使用Ansible Playbooks作为定义,在群集中生成图像。

默认情况下,openshift在 限制性 环境。在概念证明中,我被迫在一个特权 豆荚.最后,整个测试套件都通过了这个特权pod。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java我的应用程序崩溃,试图添加菜单   java如何创建TBase类实例   如何在java小程序中使用JMF功能?   数据结构Java中是否有用于双循环链表的内置接口?   java在使用JAXB读取XML文件时如何使用继承   在Java中获取和存储子进程的输出   从Java执行Windows命令   HQL中带日期的java限制   安卓如何使用GSON将单个JSON字段映射到多个JAVA字段?   std:random shuffle()和Collections之间的java差异。洗牌   Java正则表达式更高效的动态正则表达式   来自JSON的java POJO表示   active directory无法在Java中更改AD服务器中的密码   DataOutputStream出现java错误   scala如何指定JVM最大堆大小“Xmx”,以便在SBT中运行具有“run”操作的应用程序?   添加了`<f:actionListener>`之后,java`ViewScoped` bean会被重新创建吗?   python找不到满足java要求的版本(来自版本:),找不到与java匹配的发行版   java为什么刷新jdbc swing表中的按钮后数据会多次出现?   java在编程语言(尤其是dart)中,死代码是什么意思?   java为什么我必须在JDBC中使用回滚?