/usr/local/ 为 Azure 规模集上的自定义 centos7 图像重置

/usr/local/ reset for custom centos7 image on azure scale set

我们正在使用 Packer 为 Azure 规模集构建自定义 centos7 映像。其中一部分包括我们创建的自定义 rpm,它从源代码构建 git(不能使用社区存储库,所以我们自己制作)并将其安装到 /usr/local/bin 目录。在正常情况下,这个包工作得很好。一切都正确安装到正确的位置,我们可以使用我们的新版本 git.

当我们通过 Packer 运行 东西时,我们通过 ansible 安装它,然后最后 Packer 执行取消配置步骤,捕获图像并将其放入 azure 共享图像库中,然后我们将其提取在我们的天蓝色比例集中使用。

比例集使用图像制作了几个实例,我们已经 运行ning 了。问题是,突然间,/usr/local/ 目录似乎已被重置为默认值。 /usr/local/bin 中不再有任何内容,此外,我们作为依赖项安装的一些(不是全部)软件包来构建 git(例如 gcc)也消失了。我们的 git rpm 仍列为已安装,但 gcc 未安装。

/usr/bin/ 看起来不错(除了缺少的 gcc,虽然我们现在不需要它,但它似乎仍然令人担忧),所以我们可能可以在那里安装它,但我我仍然想知道是否发生了一些疯狂的事情,我是否应该在未来注意它,因为 /usr/local/ 似乎是安装它的合理地点。

TL;DR:

  1. packer 获取基本的 centos7 镜像
  2. 添加我们的自定义 git 包
  3. git 安装到 /usr/local/bin(有效!git 可用)
  4. 取消配置 waagent 和通用化
  5. packer 捕获镜像并上传
  6. azure 规模集使用图像创建新实例
  7. /usr/local/ 恢复原状了吗? (因此缺少 git?)
  8. ???

packer azure arm docs

waagent deprovisioning tool docs

想通了。

事实证明(至少对于版本 1.7.2)Packer 不一定使用与共享图像库版本相关的 azure arm 进行幂等操作,即使使用 --force 标志也是如此。

我们在 git 包完全运行并正确安装之前创建了 SIG 映像版本,因此它是在没有 /usr/local/bin/ 修改的基础映像上创建的。

当我们 运行 使用强制标志构建 Packer 时,它会删除并重新创建基础映像,但它会使用 SIG 映像版本的配置信息运行 PUT 调用,也就是说它将“创建或更新”,如果它遵循约定(你看不到这个,除非你设置一些加壳日志变量并将详细日志输出到文件或其他东西)。

因此,虽然基础映像已更新为 git 正确设置的映像,但 SIG 版本 认为 它使用的是与以前相同的基础映像(名称相同,没有唯一标识符),因此就配置而言,配置没有改变,不需要发生任何事情。在我们删除旧版本或制作新版本后,它根据我们制作的基础映像正确启动了一个 VM,一切都在它应该在的地方。


我绝对认为 --force 应该 从头到尾都是幂等操作,我不确定这是否会在未来的版本中修复(在写这篇文章的时候他们是 1.7.6) 但也许我会在我检查过后更新。