带有Packer的AWS user_data

时间:2017-07-14 20:03:50

标签: amazon-web-services amazon-ec2 packer user-data

所以我尝试使用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。

3 个答案:

答案 0 :(得分:8)

重读这个我想也许你误解了用户数据脚本如何与Packer一起工作。

Packer启动EC2实例时提供

user_data。在配置快照并保存为AMI之后,此实例最终完成。

当您从创建的AMI启动新实例时,它没有具有相同的用户数据,它会获取您在启动此新实例时指定的用户数据。

初始(在模板中定义)用户数据的效果可能会也可能不会出现在新实例中,具体取决于更改是否在AMI中保留。

答案 1 :(得分:3)

正如Rickard von Essen所指出的,答案是将我的脚本复制到/var/lib/cloud/scripts/per-instance,这将在从此AMI启动的每个实例上执行我的脚本。

或者,如果每次实例启动时都需要执行此操作,则可以将脚本放在/var/lib/cloud/scripts/per-boot中。

在我的情况下,因为我想用第三方服务注册实例,所以每次创建实例时只执行一次。

答案 2 :(得分:0)

可以上载到/var/lib/cloud/scripts/*,但这取决于您要如何构建图像。您是否需要能够快速启动实例?

最好的解决方案是给我们Packer provisioners。预配置程序用于在引导后通过使用ansible / salt / puppet / cheff / shell脚本等安装和配置计算机映像,您可以根据需要配置映像。这样,您就不必在每次实例启动时都必须设置dep了,这可能会引起一些问题(请考虑间歇性网络问题/故障,这可能会导致某些dep无法安装)

包装商的供应商是第三方u