如何使用Packer创建EC2虚拟机?

3
在AWS中创建新的AMI时,我通常手动运行命令来验证其是否有效,然后将该盒映像化以创建AMI。但是也有一些替代方案,比如packer.io,使用此服务创建简单的自定义AMI的最小工作示例是什么?

1
Packer文档中包含一个示例(在页面的3/4处);这个能帮上忙吗,还是你遇到了其他问题? - Castaglia
他们实际上没有教程,我发现那个例子非常难懂... - M.R.
这只是一些幻灯片,但去年 OSUOSL 的 Lance Albertson 在 LinuxCon Seattle 上做了一个关于 Packer 的精彩演讲,你可能会发现这些幻灯片很有用。它是一个不错的概述。http://schd.ws/hosted_files/lccocc2015/89/packer.pdf - Ele Munjeli
1个回答

3

https://github.com/devopracy/devopracy-base/blob/master/packer/base.json有一个packer文件,它与我在工作中使用的基本镜像非常相似。虽然未经测试,但我们可以稍微研究一下。该基本镜像是我的专有基础 - 所有服务都是以此为源ami构建的。这样我就控制了我的依赖关系,并确保在我的服务下有一个一致的操作系统。您可以简单地从chef超市添加cookbook来查看如何使用此文件进行服务提供,或者将其用作基础。作为基础,您可以创建一个类似但不那么详细的构建服务,并将其作为源ami调用。

此第一部分声明了我用于打包的变量。变量在构建前从bash文件中注入,而我不会将bash脚本检入源代码控制。我将bash脚本保存在我的主目录中,并在调用packer build之前对其进行源处理。请注意,此处有用于chef provisioner的cookbook路径。我使用base_dir作为我的开发框或构建服务器上的位置。我使用引导密钥进行构建;如果您没有指定,则packer将生成自己的ssh密钥,但最好在AWS上生成密钥,然后使用该密钥启动构建。这使得在飞行中调试packer更加容易。

"variables": {
"aws_access_key_id": "{{env `AWS_ACCESS_KEY`}}",
"aws_secret_key": "{{env `AWS_SECRET_ACCESS_KEY`}}",
"ssh_private_key_file": "{{env `SSH_PRIVATE_KEY_FILE`}}",
"cookbook_path": "{{env `CLOUD_DIR`}}/ops/devopracy-base/cookbooks",
"base_dir": "{{env `CLOUD_DIR`}}"
},

文件的下一部分是构建器。我在工作和非工作之余都使用amazon-ebs,创建一个文件更加简单,并且通常较大的实例类型仅以ebs形式提供。在这个文件中,我调整卷大小,以便我们有更多的空间安装东西。请注意,此处未指定源ami,我在这里或那里查找最新版本。如果您正在使用Ubuntu,它有一个方便的网站,只需搜索ec2 ubuntu定位器即可。您需要放入一个源映像来构建。

"builders": [{
"type": "amazon-ebs",
"access_key": "{{user `aws_access_key_id`}}",
"secret_key": "{{user `aws_secret_key`}}",
"region": "us-west-2",
"source_ami": "",
"instance_type": "t2.small",
"ssh_username": "fedora",
"ami_name": "fedora-base-{{isotime \"2006-01-02\"}}",
"ami_description": "fedora 21 devopracy base",
"security_group_ids": [ "" ],
"force_deregister": "true",
"ssh_keypair_name": "bootstrap",
"ssh_private_key_file": "{{user `ssh_private_key_file`}}",
"subnet_id": "",
"ami_users": [""],
"ami_block_device_mappings": [{
  "delete_on_termination": "true",
  "device_name": "/dev/sda1",
  "volume_size": 30
}],
"launch_block_device_mappings": [{
  "delete_on_termination": "true",
  "device_name": "/dev/sda1",
  "volume_size": 30
}], 
"tags": {
  "stage": "dev",
  "os": "fedora 21",
  "release": "latest",
  "role": "base",
  "version": "0.0.1",
  "lock": "none"
}
}],

当你开始在云上进行自动化操作时,标记图像非常有用。这些标记是处理部署等内容的方式。fedora是默认用户,适用于Fedora,ubuntu适用于Ubuntu,ec2-user适用于Amazon Linux等等。您可以在发行版文档中查找这些信息。
同样地,您需要在此文件中添加安全组和启动子网。如果您没有指定它们,Packer将使用AWS中的默认设置,但如果您正在构建构建服务器或非默认VPC,则必须指定。Force deregister会在成功创建之后删除具有相同名称的AMI - 我按日期命名,因此我每天可以迭代构建而不会堆积大量图像。
最后,我使用chef provisioner。我在另一个repo中有cookbook,并且在构建服务器上的路径位于顶部的变量中。在这里,我们正在查看用于配置的chef-zero,它在技术上不受支持,但与Chef客户端provisioner和自定义命令一起工作得很好。除了运行chef之外,我还使用自己的一些脚本,并接着运行serverspec测试以确保一切正常。
  "provisioners": [


{
    "type": "shell",
    "inline": [

    ]
   },
   {
    "type": "shell",
    "script": "{{user `base_dir`}}/ops/devopracy-base/files/ext_disk.sh"
   },
   {
    "type": "shell",
    "inline": [
      "sudo reboot",
      "sleep 30",
      "sudo resize2fs /dev/xvda1"
   ]
   },
   {
    "type": "shell",
    "inline": [
      "sudo mkdir -p /etc/chef && sudo chmod 777 /etc/chef",
      "sudo mkdir -p /tmp/packer-chef-client && sudo chmod 777 /tmp/packer-chef-client"
    ]
   },
   {
    "type": "file",
    "source": "{{user `cookbook_path`}}",
    "destination": "/etc/chef/cookbooks"
   },
   {
    "type": "chef-client",
    "execute_command": "cd /etc/chef && sudo chef-client --local-mode -c /tmp/packer-chef-client/client.rb -j /tmp/packer-chef-client/first-boot.json",
    "server_url": "http://localhost:8889",
    "skip_clean_node": "true",
    "skip_clean_client": "true",
    "run_list": ["recipe[devopracy-base::default]"]
   },
   {
    "type": "file",
    "source": "{{user `base_dir`}}/ops/devopracy-base/test/spec",
    "destination": "/home/fedora/spec/"
   },
   {
    "type": "file",
    "source": "{{user `base_dir`}}/ops/devopracy-base/test/Rakefile",
    "destination": "/home/fedora/Rakefile"
   },
   {
    "type": "shell",
    "inline": ["/opt/chef/embedded/bin/rake spec"]
   },
   {
    "type": "shell",
    "inline": ["sudo chmod 600 /etc/chef"]
   }
  ]
}

自然,在这里有一些关于更改chef目录的愚蠢操作,它并不显然安全——我在一个私有子网中运行我的构建。希望这可以帮助您开始使用packer,它实际上是一款令人惊叹的软件,也很有趣!如果有任何问题,请在评论中与我联系或在github上联系我。所有关于devopracy的东西都还在进行中,但当我有更多时间来开发时,这些文件可能会成熟:P

祝好运!


注意:Packer现在在文档中有一个关于如何使用chef-zero provisioner的部分,因此不再需要这个hack。只需查看文档即可 :) - Ele Munjeli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接