Packer 中如何将每个构建器的输出写入单独的日志文件

56次阅读
没有评论

问题描述

在使用 Packer 时,遇到一个需求:他的 Packer 模板中包含多个构建器,每个模板最多有5个构建器。这在流水线中很容易实现所需的所有资源配置,但默认情况下,Packer 将所有输出写入单个流。尽管 Packer 根据构建器使用不同的颜色来区分,但仍然很难找到特定构建失败的位置。用户想知道如何有效地将 Packer 的每个构建器输出分割成单独的文件。

用户需要注意的是:
1. 不希望失去并行性。
2. 理解一些日志后处理是必要的。

解决方案

请注意以下操作可能涉及版本差异及修改前请做好备份。

使用 -machine-readable 标志

Packer 提供了 -machine-readable 标志,可以将一些信息以机器可读的形式输出。这可以作为一种方式来达到将构建器输出分隔的目的,虽然需要一些后处理步骤。
以下是一个示例 Packer 命令,使用了 -machine-readable 标志:

packer build -machine-readable your_template.json | tee output.log

上述命令会将 Packer 构建的输出同时打印到终端和写入一个名为 output.log 的文件。这个文件中包含了类似以下格式的信息,其中可以包含有关构建器的信息:

1564995900,,ui,message,    admin-ami: Instance ID: i-04ef2474a070403ad
1564995900,,ui,say,==> admin-ami: Waiting for instance (i-04ef2474a070403ad) to become ready...

后处理日志文件

用户可以通过解析上述生成的 output.log 文件,将其中与各个构建器相关的信息提取出来并写入单独的日志文件。这样可以根据构建器来轻松定位问题,而且不会失去并行性。

示例脚本

以下是一个简单的示例脚本,用于将 output.log 文件按照构建器名称分割成多个单独的日志文件。这个脚本使用了 Linux 命令 grepawksed 来实现:

#!/bin/bash
# 定义构建器名称列表
builders=("builder1" "builder2" "builder3" "builder4" "builder5")

# 遍历构建器名称列表
for builder in "${builders[@]}"; do
  # 使用 grep 搜索特定构建器相关的行,并使用 awk 提取时间戳
  grep "$builder" output.log | awk -F, '{print $1}' > "$builder.log"
  # 从原始 output.log 文件中移除已处理的行
  grep -v "$builder" output.log > output_temp.log
  mv output_temp.log output.log
done

请注意,上述脚本中的构建器名称列表需要根据用户实际的 Packer 模板配置进行修改。

通过上述的方法,用户可以将每个构建器的输出写入单独的日志文件,以便更轻松地定位和分析构建问题。

正文完