带 Packer 的 AWS user_data
AWS user_data with Packer
所以我尝试使用 Packer 创建 AWS 映像并通过 user_data_file 指定一些用户数据。该文件的内容在实例启动时需要为 运行,因为它每次都是唯一的。我无法将其烘焙到 AMI 中。
使用打包器我有以下内容:
{
"variables": {
"ami_name": ""
},
"builders": [
{
"type": "amazon-ebs",
"region": "us-east-1",
"source_ami": "ami-c8580bdf",
"instance_type": "t2.micro",
"ssh_username": "ubuntu",
"ami_name": "{{ user `ami_name` }}-{{ isotime | clean_ami_name }}",
"user_data_file": "user_data.sh",
"tags": {
"os_version": "ubuntu",
"built_by": "packer",
"build_on": "{{ isotime | clean_ami_name }}",
"Name": "{{ user `ami_name` }}"
}
}],
"provisioners": [
{
"type": "ansible",
"playbook_file": "playbook.yml",
"user": "ubuntu"
}]
}
我的 user_data shell 脚本的内容只是一个包的一些基本配置行,该包是通过配置程序步骤中的 运行 ansible 脚本安装的。观察 Packer 的输出,我可以确认 ansible 脚本全部 运行。
Packer 完成并创建了 AMI,但从未执行用户数据片段。结果图像中不存在它的记录。没有 /userdata.log 文件并且 /var/lib/cloud/instance/user-data.txt
是空的我觉得我缺少一些基本的东西,因为这对于 Packer 来说应该是一件非常简单的事情。
重读这篇文章,我认为您可能误解了用户数据脚本如何与 Packer 一起工作。
user_data
是在 Packer 启动 EC2 实例时提供的。这个实例在最后,在配置快照并保存为 AMI 之后。
当您从创建的 AMI 启动新实例时,它没有相同的用户数据,它会获取您在启动此新实例时指定的用户数据。
初始(在您的模板中定义)用户数据的影响可能会或可能不会出现在新实例中,具体取决于更改是否保留在 AMI 中。
正如 Rickard von Essen 所指出的那样,答案是将我的脚本复制到 /var/lib/cloud/scripts/per-instance
,这将在从此 AMI 启动的每个实例上执行我的脚本。
或者,如果您需要在每次实例启动时执行此操作,您可以将脚本放入 /var/lib/cloud/scripts/per-boot
。
在我的例子中,因为我想用第 3 方服务注册实例,所以我只让它在每次创建实例时执行一次。
上传到 /var/lib/cloud/scripts/*
可以,但这取决于您希望如何构建图像。您是否需要能够快速启动实例?
最好的解决方案是我们Packer provisioners。 Provisioner 用于在启动后使用 ansible/salt/puppet/cheff/shell 脚本等安装和配置机器映像,您可以根据需要提供您的映像。这样,您就不必在每次启动实例时都必须提供 dep,这可能会导致一些问题(想想间歇性网络 issues/failures,这可能会导致某些 dep 无法安装)
packer 的供应商是第三方 u
所以我尝试使用 Packer 创建 AWS 映像并通过 user_data_file 指定一些用户数据。该文件的内容在实例启动时需要为 运行,因为它每次都是唯一的。我无法将其烘焙到 AMI 中。
使用打包器我有以下内容:
{
"variables": {
"ami_name": ""
},
"builders": [
{
"type": "amazon-ebs",
"region": "us-east-1",
"source_ami": "ami-c8580bdf",
"instance_type": "t2.micro",
"ssh_username": "ubuntu",
"ami_name": "{{ user `ami_name` }}-{{ isotime | clean_ami_name }}",
"user_data_file": "user_data.sh",
"tags": {
"os_version": "ubuntu",
"built_by": "packer",
"build_on": "{{ isotime | clean_ami_name }}",
"Name": "{{ user `ami_name` }}"
}
}],
"provisioners": [
{
"type": "ansible",
"playbook_file": "playbook.yml",
"user": "ubuntu"
}]
}
我的 user_data shell 脚本的内容只是一个包的一些基本配置行,该包是通过配置程序步骤中的 运行 ansible 脚本安装的。观察 Packer 的输出,我可以确认 ansible 脚本全部 运行。
Packer 完成并创建了 AMI,但从未执行用户数据片段。结果图像中不存在它的记录。没有 /userdata.log 文件并且 /var/lib/cloud/instance/user-data.txt
是空的我觉得我缺少一些基本的东西,因为这对于 Packer 来说应该是一件非常简单的事情。
重读这篇文章,我认为您可能误解了用户数据脚本如何与 Packer 一起工作。
user_data
是在 Packer 启动 EC2 实例时提供的。这个实例在最后,在配置快照并保存为 AMI 之后。
当您从创建的 AMI 启动新实例时,它没有相同的用户数据,它会获取您在启动此新实例时指定的用户数据。
初始(在您的模板中定义)用户数据的影响可能会或可能不会出现在新实例中,具体取决于更改是否保留在 AMI 中。
正如 Rickard von Essen 所指出的那样,答案是将我的脚本复制到 /var/lib/cloud/scripts/per-instance
,这将在从此 AMI 启动的每个实例上执行我的脚本。
或者,如果您需要在每次实例启动时执行此操作,您可以将脚本放入 /var/lib/cloud/scripts/per-boot
。
在我的例子中,因为我想用第 3 方服务注册实例,所以我只让它在每次创建实例时执行一次。
上传到 /var/lib/cloud/scripts/*
可以,但这取决于您希望如何构建图像。您是否需要能够快速启动实例?
最好的解决方案是我们Packer provisioners。 Provisioner 用于在启动后使用 ansible/salt/puppet/cheff/shell 脚本等安装和配置机器映像,您可以根据需要提供您的映像。这样,您就不必在每次启动实例时都必须提供 dep,这可能会导致一些问题(想想间歇性网络 issues/failures,这可能会导致某些 dep 无法安装)
packer 的供应商是第三方 u