https://github.com/devopracy/devopracy-base/blob/master/packer/base.json 有一个打包程序文件,看起来与我在工作中用于基本映像的文件非常相似。它没有经过测试,但我们可以深入研究一下。基础镜像是我自己的基础——所有服务都是使用它作为源 ami 构建的。这样我可以控制我的依赖关系并确保我的服务下有一个一致的操作系统。您可以简单地从厨师超市添加食谱,以了解如何使用此文件配置服务,或者将其用作基础。作为基础,您将为服务创建一个类似的、不太详细的构建,并将其称为源 ami。
第一部分声明了我用来打包的变量。这些变量是在构建之前从我不检查到源控制的 bash 文件中注入的。我将 bash 脚本保存在我的主目录中,并在调用 packer build 之前获取它。请注意,厨师供应商有一个食谱路径。我使用base_dir 作为我的开发盒或构建服务器上的位置。我使用引导密钥来构建;如果您不指定一个,packer 将使其成为 ssh 自己的密钥,但最好在 aws 上创建一个密钥,然后使用它启动您的构建。这使得调试打包程序更容易。
"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,它有一个方便的站点,只需 google 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,您必须指定。强制注销将在成功构建时摆脱具有相同名称的 ami - 我按日期命名,因此我可以每天迭代构建而不是堆积一堆图像。
最后,我使用了主厨供应商。我在另一个仓库中有这本食谱,构建服务器上它的路径是顶部的一个变量。在这里,我们正在查看用于配置的 chef-zero,它在技术上不受支持,但可以与 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"]
}
]
}
当然,这里围绕厨师目录的 chmoding 有一些愚蠢的事情,而且这显然不安全 - 我在私有子网中运行我的构建。我希望这可以帮助您开始使用 packer,这实际上是一个了不起的软件,而且很有趣!如有任何问题,请在 cmets 中联系我,或在 github 上联系我。所有 devopracy 的东西都是 WIP,但是当我有更多时间处理它时,这些文件可能会成熟:P
祝你好运!