在AWS中创建新的AMI时,我通常手动运行命令来验证其是否有效,然后将该盒映像化以创建AMI。但是也有一些替代方案,比如packer.io,使用此服务创建简单的自定义AMI的最小工作示例是什么?
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等等。您可以在发行版文档中查找这些信息。 "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"]
}
]
}
祝好运!