问题描述
在使用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
应该能够正常工作了。
参考链接
正文完