我正在做一个项目,我们正在尝试将不可变的图像作为IaC烘焙到容器上。这些映像上可以包含J2EE,.NET或Python应用程序。所有操作系统补丁都应经常应用于此映像,并且应用程序更新也应针对可运行的映像进行更新。
话虽如此,我们讨论的选项包括用于配置的Terraform,用于构建映像的Packer。许多互联网资源在此组合中额外部署了Ansible,Chef或Puppet。我的问题是为什么Packer不足以覆盖烘焙图像,为什么我需要另外考虑Ansible / Chef / Puppet? Packer不能做什么,其他人可以满足这些要求?
感谢您的时间和帮助...

#1 楼

您的问题的一个想法关键是不可变的基础架构,即一个映像只能构建一次,可以部署多次,并且在运行时不会更改。如果图像的内容需要更改,则从头开始构建一个全新的图像,并用新实例替换运行旧图像的实例。通常是从通用OS映像引导计算机(或容器),然后由配置管理工具持续对其内容进行管理。在此模型中,实例的寿命通常更长,并且可以根据新要求进行就地更改。

打包程序旨在作为不可变基础结构的构建块。旨在协调立即启动到所需状态的自定义映像的创建。如果不可变的基础架构适合您的用例(不一定是这种情况!),则确实不需要诸如Ansible,Chef和Puppet之类的工具。

但是,在Packer的“一次性”模式(例如Chef Solo)通常对于非平凡的图像很有用:这些工具通常提供比Packer单独提供的功能更强大的抽象,从而使诸如配置init系统运行某些程序等操作变得更容易服务,或创建用户帐户。在这种情况下,配置管理工具将在Packer中作为配置程序运行,在映像中创建必要的配置,但不参与对从映像启动的实例进行的持续维护。

大多数实际的系统包括可变的和不可变的基础结构的混合,因为例如不变的基础架构不适用于有状态的集中式系统。在这种情况下,使用传统的配置管理系统可在不可变和可变系统之间建立通用的功能基础,以一次性方式将配置应用于不可变映像,并以持续,有状态的方式将其应用于长期运行,可变机器。

#2 楼

图像的生成和分发迅速上升到O(n ^ 2)或更高,并且由于terraform明确地专注于实例化,因此它依赖外部供应者提供内部状态。

它会以较小的规模工作,但是

还会使混合云模型变得非常复杂,并且如果系统的寿命很长,则会出现问题。

它还会在重构迭代过程中造成困难,但这取决于您的用例。 >
例如,假设您要部署新版本的python模块。如果您有轮子或Requirements.txt,则可以将其部署到操作系统版本c和d的云提供程序a,b,c。但是,对于完全烘焙的图像,您将不得不生成并测试图像a_c,b_c,c_c,a_d,b_d,c_d。如果必须在每次迭代中执行此操作,则开发人员生产力的成本将迅速增长。

请注意,您可能会假设图像将完全不可变,但是如果没有配置管理工具,您将无能为力。确保它们是正确的。

由于容器现在通常在受信任的模型下工作,因此对于有权在docker等框架下启动计算机的任何进程或个人进行任意更改,这都是微不足道的对于系统上的任何对象(每个API用户都是root用户,甚至在docker的主机上都是root用户),这都是您要考虑的偶然性。

如果保持云提供商,应用程序和基础之间的松散耦合操作系统随着时间的流逝要容易得多,而缓解供应商也要容易得多。

如果为GCE,AWS和Azure维护terraform配置,则按操作系统配置打包程序,然后单独使用应用程序部署方法增加了最初的复杂性,但是这些费用将很快摊销超出了项目的整个生命周期。

我个人发现像ansible这样的工具可以在没有集中式基础架构的情况下运行,并且可以根据状态进行有计划的更改,从而在纯部署模型中更加灵活,但是我始终不得不在某种程度上进行某种形式的配置管理改造。

这可能不会直接映射到您的特定用例,但这是很常见的惯例,这是一个很好的理由。

评论


谢谢您的回答。我明白你的意思,我认为值得考虑。我将尝试解决这个问题。因此,让我们通过缩小和覆盖部分问题来重新审视该问题。如果仅考虑操作系统及其补丁程序管理,而使应用程序和平台方面的问题排除在外,那么您是否还需要Packer以外的其他功能来进行操作系统映像及其补丁程序管理? Packer可以完成这些过程吗?我需要Ansible / Chef / Puppet吗?

– Aaron S.
17年5月25日在0:41

这取决于您的用例,但我会尝试使其尽可能简单并仅使用打包程序。但是,如果您开始编写复杂的Shell脚本来构建映像,则最好使用某种形式的配置管理。不过,这可能需要其他人的投入,而这主要是舆论领域。我非常喜欢打包程序的功能,但是我也发现直接编辑json的人容易出错。如果我在预配器中有一个以上的文件和一个非常简单的shell脚本,那么我将转到ansible。这将是非常用例特定的,以其为见

– gdahlm
17年5月25日在2:22

#3 楼

我看不到打包程序和ansible / chef / puppet之间的关系。 Packer可能会提供一种方法来声明您正在构建映像,但是如果您不打算使用ansible / chef / etc之类的内容来加载映像中所需的内容,那么您将如何建议将其放入其中图像吗?

通常,默认的答案是“好吧,我们将其编写脚本”,但是她将脚本仅仅是可以将任何东西粘在一起的粘合剂,它们并不是专门为处理基础结构而设计的和配置。

我已经在一个项目上工作了一段时间,在这个项目中,我们做出了明智的决定,尝试不编写任何shell脚本,即使编写起来不太方便。一切都以其他人为之保持标准的明确定义的语言(最好是声明性语言)进行(例如,我们不需要确保ansible可以完成我们需要做的事情,我们可以让开发人员来做,而不是为所有内容编写脚本,并且需要自行编写所有详细操作)。

将您的配置管理工具作为一种很好的方法来声明基本映像中的实际内容,然后,如果您希望开发人员信任其代码将在其上运行的映像,那么您将有一个很好的起点。