Amazon web services 带封隔器的AWS用户_数据

Amazon web services 带封隔器的AWS用户_数据,amazon-web-services,amazon-ec2,packer,user-data,Amazon Web Services,Amazon Ec2,Packer,User Data,所以我尝试使用Packer创建一个AWS映像,并通过user_data_文件指定一些用户数据。实例启动时需要运行此文件的内容,因为它每次都是唯一的。我不能把这个烤到AMI里 使用packer,我有以下几点: { "variables": { "ami_name": "" }, "builders": [ { "type": "amazon-ebs", "region": "us-east-1", "source_ami": "ami-c8580bdf"

所以我尝试使用Packer创建一个AWS映像,并通过user_data_文件指定一些用户数据。实例启动时需要运行此文件的内容,因为它每次都是唯一的。我不能把这个烤到AMI里

使用packer,我有以下几点:

{
  "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脚本的内容只是通过provisioners步骤中运行的ansible脚本安装的包的几个基本配置行。通过观察Packer的输出,我可以确认ansible脚本都在运行


Packer完成并创建AMI,但用户数据块从未执行。生成的图像中不存在它的记录。没有/userdata.log文件,
/var/lib/cloud/instance/user data.txt
是空的,我觉得我缺少了一些基本的东西,因为这应该是使用Packer的一件非常简单的事情

重读这篇文章,我想你可能误解了用户数据脚本是如何与Packer一起工作的

当Packer启动EC2实例时,将提供用户数据。最后,在设置快照并保存为AMI之后,该实例将被保存

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


初始(在模板中定义)用户数据的效果可能在新实例中存在,也可能不存在,这取决于更改是否在AMI中持久化

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

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


在我的例子中,因为我想向第三方服务注册实例,所以每次创建实例时,我只让它执行一次

上传到
/var/lib/cloud/scripts/*
会起作用,但这取决于您希望如何构建图像。您是否需要能够快速启动实例

最好的解决办法是我们。Provisioniers用于在引导后使用ansible/salt/puppet/cheff/shell脚本等安装和配置机器映像,您可以根据需要为映像提供任何内容。这样,您就不必在每次实例启动时都设置DEP,这可能会导致一些问题(想想间歇性的网络问题/故障,这可能会导致一些DEP未安装)


packer的供应器是第三方u

你能添加
用户u data.sh
文件吗?日志进入
/var/log/cloud init output.log
/var/log/cloud init.log
。理查德·冯·埃森在下面的回答中直截了当地回答了我。它仅在启动基于打包器的初始实例时执行。当我尝试从这个AMI启动一个实例时,它将不存在。我如何从使用packer构建的AMI启动一个实例,每次运行用户数据,以便每个实例都是唯一的?将脚本放入路径不起作用,只对打包器实例起作用@DavidFicocielloso您是说您在这个路径中放置了一个非常简单的脚本:
/var/lib/cloud/scripts/per instance
,但它没有运行?对于一个测试,你应该在里面放一些非常基本的东西,并证明它是有效的。按照我在这个问题上得到的指导,我能够让我的实例启动并在该目录中执行脚本。好吧,所以看起来我完全没有抓住Packer的user_数据部分的要点。我假设它会将用户_数据烘焙到图像中,以便在每次启动时执行它。我得想出一个不同的解决办法。谢谢。只需将脚本(在Packer中设置时)上载到
/var/lib/cloud/scripts/per boot/
per instance
并使其可执行即可。它将在每次启动时由cloud init执行,或在每个实例上执行一次。查看云初始化文档了解更多信息。Rickard von Essen就是他做的!非常感谢。我不知道那些脚本目录。它对我不起作用。还有其他方法可以尝试吗?看起来路径还是一样的。将userdata sh脚本放入该目录后,cloudinit会自动运行该脚本吗?或者我应该在打包机配置期间运行它?