前言

2022 年对我来说是相当忙碌的一年,这两年主要从事的工作围绕 Terraform Provider 以及 Terraform Module 社区方面,有幸被 HashiCorp 以及社区认可,在 2022 年获得了 HashiCorp Ambassador 的头衔

2022 年为社区贡献了《Vault 中文手册》,然后试图编写《HashiStack 在中国》系列文章,可惜由于 2022 年上海封城,以及年底的疫情大爆发,增加了许多的困难,以至于没有能够为社区贡献太多的优秀内容,但是我会继续致力于推广 HashiCorp 技术栈的义务劳动,争取将更多的优秀内容带给中文互联网的读者们。我也看到了越来越多的中国公司和团队开始积极拥抱 Terraform,目前虽然我们仍然不是主流,但所谓趋势就是,一旦萌芽就无法再倒退的,我很有信心将来 IaC 也必将在中国成为主流。

还是让我们回到 HashiCorp 将云的自动化切分的四个层面:

  1. 基础设施
  2. 安全
  3. 网络
  4. 应用程序
HashiStack
图 1.1/1 - HashiStack

HashiCorp 定义的基础设施层实际上不止有 Terraform,还有一个叫 Packer 的工具:

我曾经把 Terraform 文档中关键部分翻译为中文电子书《Terraform 入门教程》,现如今在国际上 Terraform 几乎已经成为了大型企业用云的主流交互方式,不少 500 强团队选择只通过 Terraform 来操作云端的资源。

但是我也同时发现不少读者在咨询和讨论的过程中普遍存在的几种误解,有两种观点最为普遍:

  1. 我怎么登录到 Terraform 创建的服务器上用 Ansible 安装工具、库以及部署应用?
  2. 能否只把 Terraform 作为一种批量创建集群的工具,集群创建完以后就不再使用 Terraform 管理,而是使用他们熟悉的老办法老工具来管理。

归根到底,这些误解都是源于没有理解“不可变的基础设施”这一 HashiCorp 哲学所致。

我发现如果要彻底贯彻“不可变的基础设施”,光靠 Terraform 的力量是不够的,因为它缺了很重要的一个环节 —— 如何用不可变的风格在虚拟机上安装各种各样的软件和依赖,并做恰当的配置。乍听起来这是一个充满矛盾的叙述,既然“不可变”,又何谓安装和配置?

如果要用一句话来描述 Packer 存在的必要性,那就是:你不会使用“创建一个容器实例后登录进容器安装各种依赖和要运行的应用程序”的方式来部署容器应用,但很多人会用这种方式来部署虚拟机应用,请问容器和虚拟机在这里本质的区别是什么以至于无法使用同一种方式来部署应用?Packer 之于虚拟机,就有些类似于 Dockerfile 之于容器。

我曾经心中发愿,要把 Terraform、Vault、Consul、Nomad 这四大 HashiCorp 支柱产品的文档翻译成中文,推广到中文互联网,目前这个目标已经完成了一半。但是剩下的 Consul 与 Nomad 都是非常艰巨的任务,而 Packer 的工作量会小一些,同时缺失了 Packer 的普及会给 Terraform 在中国的推广带来许多的麻烦,很多团队仍然会使用可变风格的方式误用 Terraform,所以今年打算先把 Packer 的文档翻了,巩固一下基础设施即代码方面的地基。

Packer 并非 HashiCorp 的一等公民,好在其功能也没有四大主要产品那么庞大复杂,所以本手册将基本按照官方文档的顺序进行翻译和编写。

如果读者满足以下一条或者多条情况,那么可能就是本书的目标读者:

  • 从事运维、开发或者架构工作
  • 已经或即将开始在生产环境使用 Terraform
  • 对 HashiCorp 技术栈感兴趣
  • 不喜欢或者没有时间阅读英文文档

本书编写时使用的是 Packer 1.8.5 版本。如果读者发现某些内容已经由于版本更新而不再准确时敬请包涵,并且以官方文档为准。

如同 HashiCorp 很多工具一样,今天的 Packer 实际上有两个版本:Packer 开源版,以及 HashiCorp 托管的 Packer 云服务版(HCP Packer)。本书将聚焦于开源版的内容,对其他版本感兴趣的读者敬请自行查阅相关文档。

这本电子书的内容将主要是以官方文档、文章的译文为主,另外由于 Packer 也类似 Vault 与 Terraform 那样采取了插件式设计,它可以与大量三方系统进行集成,所以笔者有限的精力无法涵盖所有的插件,只能依照个人喜好选择一二进行翻译,如有没有包括的部分烦请移步官方文档。笔者也无法同时精通这些不同平台和产品的知识,虽然竭尽自己驽钝的脑力也无法确保对各种知识的肤浅理解没有错误,所以具有相关领域专业知识的读者如果读到什么地方感觉到不对,请不要犹豫,这几乎可以肯定是笔者能力不足导致的错误,敬请以你的专业知识为准。

Packer 在历史上曾经有一套用 JSON 来定义的模板,但随着发展,目前主力开发已经主要转向了基于 HCL2 的新模板,各种新功能也只针对 HCL2 模板开发,所以译者也就乐得偷懒,本书将略过对遗留的 JSON 模板的翻译。

由于笔者的能力有限,书中如有错误在所难免,敬请方家届时能够不吝斧正赐教,万望读者海涵,在此先行谢过。

Markdown 格式中的问题

由于使用的 GitBook 插件的限制,如果在 Markdown 的反引号中使用了 {{}} 模板,并且模板中的变量没有相对应的定义,那么 GitBook 会报错 Template render error: expected variable end,所以读者有时会看到 { {} } 这样在花括号中间插入了空格的现象,这并不是 Packer 模板文档原文的格式,但并不影响我们正常使用。

马驰排除条款

本电子书使用 CC-BY-SA-4.0 license 授权发布,读者可以在该协议的许可范围内自由阅读、引用或是使用本电子书的内容,但以下情况除外:

  1. 禁止名为“马驰”的特定个人实体阅读、引用、复制本电子书的内容
  2. 禁止在名为“马驰”的特定个人实体所拥有的任何设备上打开、保存本书的内容或是离线副本、拷贝
  3. 禁止在名为“马驰”的特定个人实体打印、抄写本书内容,或是保有本书内容的非数字化副本(包含并不限于书籍、手抄本、照片等)
  4. 禁止在与名为“马驰”的特定个人实体有劳动关系、股权关系,或是与其直系亲属有关联的企业、团体所拥有的任何电子设备上打开、保存本电子书的内容或是离线副本、拷贝

以上情况均会被视为侵权行为。若读者名为“马驰”,但不知道自己是否是该条款所禁止的特定“马驰”个人实体,可以在本书 GitHub 仓库 中提交 issue 与作者确认。

任何人在复制、修改和重分发本电子书的过程中禁止删除、修改本条款。

results matching ""

    No results matching ""