Edited at
AnsibleDay 18

Packer で ansible-local を使うときの始めの一歩

More than 3 years have passed since last update.

Packer は Vagrant の作者 Mitchell Hashimoto さん作成の様々な仮想マシン向けの pre-baked image (プロビジョニングが事前になされたイメージ) を簡単に作成するツールで、バージョン 0.3.10 から Provisioner として Ansible がサポートされました。

公式ドキュメントが こちら なのですが、ちょっとサラっとしすぎているので、始めの一歩的なものを記しておきます。

まず、この Provisioner は Ansible を通常のリモート実行ではなく、サーバ側に playbook を転送してローカルで実行する形式になっているので、事前に対象のサーバに Ansible がインストールされている必要があります。Vagrant にせよ Amazon AMI などにせよ、Ansible が既にインストールされているような環境はまだ稀かとおもいますので、まずは Ansible を先にインストールする必要があります。

その為に利用出来るのが Shell Provisioner です。以下のように対象のプラットフォームにあわせる形で Ansible をインストールします。(yum でのパッケージインストールは環境にあわせて適宜読み替えてください。以下は Amazon Linux での例です。)

        {

"type": "shell",
"inline": [
"sudo yum install gcc python-devel python-crypto python-pip -y",
"sudo pip install ansible"
]
}

次に Ansible の playbook の転送をしますが、推奨のディレクトリ構成を取っている場合、必要な role のディレクトリもあわせて転送する必要があり、こちらは Ansible の設定内の role_paths に指定できます。

ただ、その他に例えばプロジェクト独自のモジュールを作成していたり、group_vars や host_vars といったディレクトリにデフォルトの変数をまとめたりしている場合はこちらも転送する必要があり、その為に利用できるのが File Provisioner です。こちら、事前にアップロード先のディレクトリを作成する必要がありますので、流れとしては以下のようになります。


  • 先の Ansible インストール時に Ansible 用の実行ディレクトリ ( staging_directory ) を作成

  • File Provisioner で必要なモジュールなどを staging_directory にアップロード

  • Ansible Provisioner では staging_directory に最初に指定したディレクトリを指定

Provisioner の全体設定はこんな感じ。staging_directory は /tmp/ansible-local としています。File Provisioner の src の指定の仕方は rsync スタイルにのっとっているので、ディレクトリの場合に末尾にスラッシュをつけるか否かで挙動が変わる点に注意です。

    "provisioners": [

{
"type": "shell",
"inline": [
"sudo yum install gcc python-devel python-crypto python-pip -y",
"sudo pip install ansible",
"mkdir -p /tmp/ansible-local"
]
},
{
"type": "file",
"source": "ansible/library",
"destination": "/tmp/ansible-local"
},
{
"type": "ansible-local",
"playbook_file": "ansible/playbook.yml",
"role_paths": [
"ansible/roles/app"
],
"staging_directory": "/tmp/ansible-local"
}
]

まとめると、


  • Shell Provisioner で Ansible をインストール

  • File Provisioner で必要なファイルやディレクトリを転送

の組み合わせで使うのが Packer+Ansible 始めの一歩です。

ツールの基本設計による所もあると思いますが、素直に Ansible をリモート実行したい気もしますね。


Packer 0.8 以降の注意事項

0.8 では ssh 接続時にデフォルトでは PTY を利用しなくなりました(CHANGELOG)。そのため、shell provisioner での最初の ansible のインストールが


sudo: sorry, you must have a tty to run sudo


といったエラーで失敗するようになります。これを避けるためには builder 側の設定で以下のように ssh_pty を true に設定する必要があります。(ssh_pty の設定)

    "builders": [{

"type": "amazon-ebs",
"ssh_pty": true,
: