Packer 0.9の新機能 リモートからのAnsible Provisionerが追加されました
はじめに
藤本です。
昨日、Packerのバージョン0.9がリリースされました。Chef ProvisionerのWindows対応や、OVA形式でのAWSへのインポートなどいくつかの機能が追加されました。今回はその中でもAnsible Provisionerについてご紹介します。
リリースノートはこちら
概要
Packerには今までAnsibleのProvisionerとして、Ansible Local Provisionerがありました。Ansible Local ProvisionerはPlaybookをビルドOSに送信して、ローカルでAnsibleコマンドを実行するというものでした。事前にAnsibleをインストールしていなくてはならないことでAWSなどで標準OS AMIを利用する場合、Shell ProvisionerでゴニョゴニョとAnsible外で設定を入れえなくてはいけなかったり、RoleやVarsのパスを全て指定しなくてはいけなかったり、インストールされるAnsibleのバージョンを意識しなくてはいけなかったり、というちょっといただけない仕様でした。
Ansible Local Provisionerは弊社ブログでもPacker+AnsibleによるAMIの作成で紹介しています。
それが遂にPacker実行環境となるリモートからAnsibleによる設定が可能なProvisionerが追加されました。
それでは早速試してみましょう。
環境
- Packer実行環境
- OSX
- Packer : 0.9.0
- Packerによるイメージ作成環境
- 環境:AWS
- AMI:Amazon Linux
インストール
インストールはOSXの場合、公式サイトからバイナリをダウンロードするか、Homebrewによりインストールできます。今回はHomebrewによりインストールしました。
# brew install packer
既にインストール済みの場合、update & upgradeによりパッケージをアップデートできます。
# brew update && brew upgrade
インストールを確認します。
# brew list packer /usr/local/Cellar/packer/0.9.0/bin/packer # packer version Packer v0.9.0
バージョン0.9.0のPackerがインストールされました。
Packer+AnsibleでカスタムAMIを作ってみる
Ansible Playbook作成
今回は単純にhttpdをインストールだけのPlaybookを作成します。
# cat packer.yml - hosts: all sudo: yes tasks: - yum: name=httpd state=installed
Packer Template作成
BuilderをAWS環境に、ProvisionerをAnsibleに指定し、Packerのテンプレートファイルを作成します。
# cat ansible-remote.template { "builders" : [{ "type" : "amazon-ebs", "region" : "ap-northeast-1", "instance_type" : "t2.nano", "source_ami" : "ami-59bdb937", "ssh_username" : "ec2-user", "ami_name" : "packer-ansible-remote" }], "provisioners" : [{ "type" : "ansible", "playbook_file" : "packer.yml" }] }
Packer実行
作成したテンプレートファイルを指定し、packer buildコマンドを実行します。
# packer build ansible-remote.template amazon-ebs output will be in this color. ==> amazon-ebs: Prevalidating AMI Name... ==> amazon-ebs: Inspecting the source AMI... ==> amazon-ebs: Creating temporary keypair: packer 56cc4dd5-729a-26b1-047f-8b1ba51868ff ==> amazon-ebs: Creating temporary security group for this instance... ==> amazon-ebs: Authorizing access to port 22 the temporary security group... ==> amazon-ebs: Launching a source AWS instance... amazon-ebs: Instance ID: i-07272ea2 ==> amazon-ebs: Waiting for instance (i-07272ea2) to become ready... ==> amazon-ebs: Waiting for SSH to become available... ==> amazon-ebs: Connected to SSH! ==> amazon-ebs: Provisioning with Ansible... ==> amazon-ebs: SSH proxy: serving on 127.0.0.1:60999 ==> amazon-ebs: Executing Ansible: ansible-playbook /Users/fujimoto.shinji/Techs/packer/ansible-remote/packer.yml -i /var/folders/vp/2b51_dy91r3b5bbjsv1lbj4c0000gq/T/packer-provisioner-ansible587654638 --private-key /var/folders/vp/2b51_dy91r3b5bbjsv1lbj4c0000gq/T/ansible-key955181579 amazon-ebs: SSH proxy: accepted connection ==> amazon-ebs: authentication attempt from 127.0.0.1:61000 to 127.0.0.1:60999 as packer-ansible using none ==> amazon-ebs: authentication attempt from 127.0.0.1:61000 to 127.0.0.1:60999 as packer-ansible using publickey amazon-ebs: SSH proxy: accepted connection ==> amazon-ebs: authentication attempt from 127.0.0.1:61001 to 127.0.0.1:60999 as packer-ansible using none ==> amazon-ebs: authentication attempt from 127.0.0.1:61001 to 127.0.0.1:60999 as packer-ansible using publickey amazon-ebs: SSH proxy: accepted connection ==> amazon-ebs: authentication attempt from 127.0.0.1:61002 to 127.0.0.1:60999 as packer-ansible using none ==> amazon-ebs: authentication attempt from 127.0.0.1:61002 to 127.0.0.1:60999 as packer-ansible using publickey amazon-ebs: SSH proxy: accepted connection ==> amazon-ebs: authentication attempt from 127.0.0.1:61003 to 127.0.0.1:60999 as packer-ansible using none ==> amazon-ebs: authentication attempt from 127.0.0.1:61003 to 127.0.0.1:60999 as packer-ansible using publickey amazon-ebs: SSH proxy: accepted connection ==> amazon-ebs: authentication attempt from 127.0.0.1:61004 to 127.0.0.1:60999 as packer-ansible using none ==> amazon-ebs: authentication attempt from 127.0.0.1:61004 to 127.0.0.1:60999 as packer-ansible using publickey amazon-ebs: SSH proxy: accepted connection ==> amazon-ebs: authentication attempt from 127.0.0.1:61005 to 127.0.0.1:60999 as packer-ansible using none ==> amazon-ebs: authentication attempt from 127.0.0.1:61005 to 127.0.0.1:60999 as packer-ansible using publickey amazon-ebs: amazon-ebs: PLAY [all] ******************************************************************** amazon-ebs: amazon-ebs: GATHERING FACTS *************************************************************** amazon-ebs: ok: [default] amazon-ebs: amazon-ebs: TASK: [yum name=httpd state=installed] **************************************** amazon-ebs: changed: [default] amazon-ebs: amazon-ebs: PLAY RECAP ******************************************************************** amazon-ebs: default : ok=2 changed=1 unreachable=0 failed=0 amazon-ebs: ==> amazon-ebs: shutting down the SSH proxy ==> amazon-ebs: Stopping the source instance... ==> amazon-ebs: Waiting for the instance to stop... ==> amazon-ebs: Creating the AMI: packer-ansible-remote amazon-ebs: AMI: ami-4d5e5d23 ==> amazon-ebs: Waiting for AMI to become ready... ==> amazon-ebs: Terminating the source AWS instance... ==> amazon-ebs: Cleaning up any extra volumes... ==> amazon-ebs: Deleting temporary security group... ==> amazon-ebs: Deleting temporary keypair... Build 'amazon-ebs' finished. ==> Builds finished. The artifacts of successful builds are: --> amazon-ebs: AMIs were created: ap-northeast-1: ami-4d5e5d23
Ansibleコマンドの実行結果が表示されているので、ansibleの実行結果も分かりやすくてよいですね。ちなみにAnsibleが失敗した場合、Packerコマンドも中断してくれます。
IDがami-4d5e5d23のAMIが作成されたようです。
動作確認
AMI作成状況
AMIを確認してみます。
IDがami-4d5e5d23のAMIが作成されています。
インスタンスの設定確認
作成されたAMIからEC2インスタンスを作成しましょう。AMIを選択し、「作成」を押下します。
ポチポチとウィザードを進めて、作成を開始します。
AMI作成元として作成されたインスタンスがterminated状態となっていますね。
作成されたEC2インスタンスにSSHログインし、httpdのインストール状況を確認します。
# ssh 52.xxx.xxx.xxx The authenticity of host '52.xxx.xxx.xxx (52.xxx.xxx.xxx)' can't be established. RSA key fingerprint is 00:b2:5d:97:33:7e:72:a2:3a:65:f7:cc:bf:56:6f:d5. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '52.xxx.xxx.xxx' (RSA) to the list of known hosts. __| __|_ ) _| ( / Amazon Linux AMI ___|\___|___| https://aws.amazon.com/amazon-linux-ami/2015.09-release-notes/ [ec2-user@ip-172-31-25-157 ~]$ rpm -q httpd httpd-2.2.31-1.6.amzn1.x86_64
はい、インストールされていますね。
まとめ
いかがでしたでしょうか。
Hashicorp製品は様々な環境、様々な製品と連携してくれるのが嬉しいところです。