這篇拖了好久才寫 … 算是補上使用記錄
packer 是 HashiCorp 的產品,是一個專門拿來 build machine images 的工具,packer 支援許多目前主流的虛擬環境,如 AWS EC2、Azure、Docker、Openstack .. 等等,詳細可以看 Builders。
其實 packer 的運作原理是透過各種 virtual machine 的 API or CLI 來建立 machine images,用簡單的 json 設定把這些動作自動化。
packer 主要就是一個 json 檔案,這個 json 包括:
- Builders:打包的 images 類型,如 EC2、Azure .. etc
- Provisioners:images 裡要做的事情,像是建使用者,安裝 package、更新 .. etc
- Post-Processors:打包完 images 要特別做的事情,像是 Docker push、tag 之類的
柿子挑軟的吃,先用最簡單的 AWS EC2 來 build AMI,在開始 build 之前可以先看 shazi7804/packer-aws-ami 這邊的範本。
packer build AWS AMI
首先產生一個 packer_build.json:
{ "builders": [ { "type": "amazon-ebs", "access_key": "請用自己的key", "secret_key": "請用自己的key", "region": "us-west-2", "source_ami": "拿來做基底的AMI-ID", "instance_type": "t2.micro", "ssh_username": "ec2-user", "ami_name": "packer {{timestamp}}" } ], "provisioners": [ { "type": "shell", "script": "packer_ami.sh" } ] }
最基本的 json 會像這樣,然後填上建立的 IAM User access/secret key,還有你要拿來當底的 source ami id,例如 Amazon Linux。
然後我在 json 中使用的 provisioners 是 shell,所以會在產生一個 packer_ami.sh 的 script
#!/bin/bash sudo yum update sudo yum install httpd php sudo service httpd start sudo chkconfig httpd on
用來安裝 apache
第三個步驟就直接來用 packer build,先確認檔案在同一個目錄
$ find /packer_ami.sh /packer_build.json
開始 build
$ ./packer build packer_build.json
如果設定沒有錯誤的話,你就可以看到 packer 開始在 build,實際上他就是幫你
- launch instance
- assign security group / key pair
- execute packer_ami.sh
- instance stop
- create AMI images
- terminate instances
- delete security group / key pair
build 成功以後你會在 instances 那邊看到有 “Packer build” 標籤而且被 terminate 的 instances,所以 packer 其實並不是幫你直接建立 AMI,build 一次 packer 基本的收費就是 1 hour 的 ec2 費用加上 AMI 的保存費用。
除此之外 packer 還可以指定 vpc, subnet, security groups,如果都沒有設定,他會使用 default VPC (如果你不小心砍掉 VPC 就悲劇了,必須指定vpc, subnet, security groups)
HashiCorp 出了蠻多好用的工具,之後會陸陸續續在記錄 HashiCorp 的其他工具,有助於 DevOps 和自動化的推進。