Packer + Jenkins(on EC2)で自動AMI作成
Packerを使用してAMIの作成を自動化が出来たのでJenkinsでCIしてみようと思います。
Packerの使い方やJenkinsの使い方は割愛して簡単にポイントのみまとめます。
Jenkinsの設定
Gitリポジトリを指定
こちらのようなリポジトリを作成します。
template.json
がPackerのテンプレートファイルです。
ジョブの設定
シェルの実行
で以下のようにシェルを設定します。
packerをインストールしてしまえば毎回ダウンロードする必要はありません。
mkdir packer cd packer wget -o - https://dl.bintray.com/mitchellh/packer/packer_0.8.0_linux_amd64.zip unzip packer_0.8.0_linux_amd64.zip cd ../ ./packer/packer build template.json rm -rf ./packer exit 0;
設定は以上です。あとは好きなタイミングでジョブが動くように設定します。
注意する点
Jenkinsからpackerを使用してsshするとsudoが使用できない
packerを使用するとEC2にsshで接続してコマンドを実行しようとしますが、
スクリプト内でsudoを使用するとエラーが出て失敗してしまいます。
sudo: sorry, you must have a tty to run sudo
解決法
そのため、ここではEC2のUserDataにて/etc/sudoers
を編集するようにしました。
packerではAMI作成用のEC2にUserDataを指定できるため、そこでsudoの設定を変更します。
#!/bin/bash -ex sed -i 's/Defaults requiretty/Defaults !requiretty/g' /etc/sudoers
その他、sudoで実行したいコマンドがあればここで実行しておくと良いです。
ビルダーのuser_data_file
にファイル名を指定すると起動時にUserDataへ設定されます。
{ "builders": [{ "type": "amazon-ebs", "region": "ap-northeast-1", "source_ami": "ami-cbf90ecb", "instance_type": "t2.micro", "ssh_username": "ec2-user", "ami_name": "packer-ami-{{timestamp}}", "user_data_file": "files/user-data.txt" }], "provisioners": [{ "type": "shell", "scripts": [ "scripts/create-user-dirs.sh", "scripts/install-packages.sh" ] }] }