Terraform中的Cloud-config无法正常工作,没有任何反应并且静默失败

56次阅读
没有评论

问题描述

在使用Terraform时,使用Cloud Config在user_data(也尝试过user_data_base64)中进行机器配置。当在Terraform中运行命令时,如下所示:

resource "aws_instance" "web" {
  user_data_base64 = filebase64("${path.module}/scripts/web-init-script.yml")
}

然而,什么都没有发生,它静默失败了。问题出在哪里?web-init-script.yml的内容如下:

#cloud-config
package_update: true
package_upgrade: true
fqdn: db.acme.com
prefer_fqdn_over_hostname: true
hostname: db
packages:
  - podman

解决方案

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

问题原因

这个问题的原因是由于空格导致的。你可以通过ssh到机器上运行以下命令来确认:

sudo grep WARNING /var/log/cloud-init.log

这个命令应该返回以下内容:

util.py[WARNING]: Failed loading yaml blob. Invalid format at line 11 column 1: "while scanning for the next tokenutil.py[WARNING]: Failed at merging in cloud config part from part-001

基本上发生了以下情况:
1. 你将user_data上传到提供者实例的元数据中。
2. 你正在启动的客户端启动了cloud-init
3. cloud-init从实例的元数据http://169.254.169.254/下载user_data
4. 它在你的user_data的第一行看到了#cloud-config
5. 你将自己的cloud_config与下载的user_data合并。
6. 合并算法没有对空格进行规范化,所以yaml是无效的。
7. 合并算法返回了一个空的cloud-config。

你可以尝试重新运行cloud-init init来验证这一点,它会产生类似以下的输出:

2022-05-16 04:50:04,351 - util.py[WARNING]: Failed loading yaml blob. Invalid format at line 11 column 1: "while scanning for the next tokenfound character '\t' that cannot start any token  in "<unicode string>", line 11, column 1:        - podman    ^"2022-05-16 04:50:04,351 - util.py[WARNING]: Failed at merging in cloud config part from part-001

解决方案

为了解决这个问题,你需要修复web-init-script.yml中的空格问题。确保在每个键和值之间都有正确的缩进,并且没有额外的空格或制表符。以下是修复后的示例:

#cloud-config
package_update: true
package_upgrade: true
fqdn: db.acme.com
prefer_fqdn_over_hostname: true
hostname: db
packages:
  - podman

修复后的web-init-script.yml应该能够正常工作了。

参考链接

正文完