Packer 命令行 (CLI)

原文


我们通过命令行界面操作 Packer,所有与 Packer 的交互都是通过 packer 工具完成的。与许多其他命令行工具一样,packer 工具需要一个子命令,并且该子命令也可能有其他选项。子命令使用 packer SUBCOMMAND 执行,其中 SUBCOMMAND 是您希望执行的实际命令。

如果单独运行 packer,将显示所有可用的子命令和它们所做的简要概要的帮助信息。除此之外,您还可以运行带有 -h 标志的任意 packer 命令来为特定子命令输出更详细的帮助。

本书将包含有关每个子命令的信息。

机器可读的输出

默认情况下,Packer 的输出非常易于人类阅读。它使用漂亮的格式、间距和颜色,以使 Packer 易于使用。但是,Packer 也考虑到了自动化场景。为此,Packer 也支持机器可读的输出设置,允许您在自动化环境中使用 Packer。

因为机器可读的输出格式是面向 Unix 工具设计的,所以它是易于被 awk/sed/grep 以及其他工具处理的,并提供了熟悉的接口,无需您学习新格式。

启用机器可读输出

可以通过对任意 Packer 命令添加 -machine-readable 标志位来启用机器可读的输出格式。这立即使所有输出在标准输出流上的信息变为机器可读的。日志信息(如果启用)会继续出现在标准错误流上。输出示例如下所示:

$ packer -machine-readable version
1498365963,,version,1.0.2
1498365963,,version-prelease,
1498365963,,version-commit,3ead2750b+CHANGES
1498365963,,ui,say,Packer v1.0.2

我们将在后面的章节种将更详细地介绍该格式。但正如您所见,输出立即变得对机器友好。尝试其他的一些带有 -machine-readable 标志的命令看看!

备注:-machine-readable 标志是为自动化环境设计的,并且与 -debug 标志是互斥的,后者是为交互式环境设计的。

机器可读的格式

机器可读格式是面向行的、以逗号分隔的文本格式。这使得使用标准 Unix 工具(例如 awkgrep)以及通用编程语言(例如 Ruby 或 Python)更加方便地进行解析。

格式为:

timestamp,target,type,data...

每个组件解释如下:

  • timestamp - 是消息打印时的 UTC Unix 时间戳。
  • target - 当调用 packer build 时,target 可以为空,也可以指定构建的名称,例如:amazon-ebs。当构建正在进行时它通常是空的,当引用特定构建的制品时它是构建名称。
  • type - 是正在输出的机器可读消息的类型。最常见的两种类型是 uiartifact
  • data - 是零个或多个与先前 type 关联的用逗号分隔的值。该数据的数量和含义取决于 type,因此我们必须阅读与类型相关的文档才能完全理解。

在格式化的过程中,如果数据包含逗号,它将替换为 %!(PACKER_COMMA)。这比用诸如 \' 之类的转义字符要更好,因为它对 awk 之类的工具更友好。

格式化中遇到的换行符被替换为各自的标准转义序列。换行符在输出中变为 \n。回车变为 \r

机器可读消息的类型

以下是一份我们可能会在机器可读输出中看到的类型的不完整列表,当你运行 packer build 时,你会看到这些数据类型:

  • ui: 这表示所提供的信息是一个人类可读的字符串,即使我们设置成机器可读模式,它也会被发送到 stdout。与此类型相关联的有三种“数据”子类型:
    • say: 在非机器可读的格式中,该类型表示加粗。通常它用于关于在构建过程中开始新步骤的公告
    • message: 最常用的消息类型,用于构建过程中的基本更新信息
    • error: 错误信息
  • artifact-count: 该类型数据告诉我们一个特定的构建产生了多少制品
  • artifact: 该数据类型告诉我们 Packer 在构建期间创建什么。输出的格式模式为: timestamp, buildname, artifact, artifact_number, key, value,其中 keyvalue 包含有关制品的信息。 一个例子:
    1539967803,,ui,say,\n==> Builds finished. The artifacts of successful builds are:
    1539967803,amazon-ebs,artifact-count,2
    1539967803,amazon-ebs,artifact,0,builder-id,mitchellh.amazonebs
    1539967803,amazon-ebs,artifact,0,id,eu-west-1:ami-04d23aca8bdd36e30
    1539967803,amazon-ebs,artifact,0,string,AMIs were created:\neu-west-1: ami-04d23aca8bdd36e30\n
    1539967803,amazon-ebs,artifact,0,files-count,0
    1539967803,amazon-ebs,artifact,0,end
    1539967803,,ui,say,--> amazon-ebs: AMIs were created:\neu-west-1: ami-04d23aca8bdd36e30\n
    1539967803,amazon-ebs,artifact,1,builder-id,
    1539967803,amazon-ebs,artifact,1,id,
    1539967803,amazon-ebs,artifact,1,string,
    1539967803,amazon-ebs,artifact,1,files-count,0
    2018/10/19 09:50:03 waiting for all plugin processes to complete...
    1539967803,amazon-ebs,artifact,1,end
    

运行 packer version 时,会看到这些数据类型:

  • version: 正在运行的 Packer 的版本
  • version-prerelease: 如果当前版本是预发布版该值为 dev,否则为空字符串
  • version-commit: 当前使用的 Packer 所属分支的 git hash;一般用于 Packer 开发人员

自动补全

packer 命令具有可选的子命令启用自动补全功能,可以运行 packer -autocomplete-install 为您使用的 shell 启用该功能。这样做之后,您可以打开一个新的 shell 并使用该功能。

例如,假如我们在每个提示行的末尾输入一个 tab

$ packer p
plugin  build
$ packer build -
-color             -debug             -except            -force

results matching ""

    No results matching ""