PackerのAnsible Local provisionerの仕様とAnsibleのBest Practiceの設計の競合を回避する方法

Ansible公式Docでは、ディレクトリーレイアウトのBest practiceは以下のように定義されている。

Best Practices — Ansible Documentation

また、公式Docには明確な記述がないが、以下の記事ではAnsibleの開発者が、
ansible-playbookコマンドの-iオプションでディレクトリーを指定できることを認めている。

Alternative Directory Structure requires complete file path with -i · Issue #18686 · ansible/ansible · GitHub

ところが、Packer(確認バージョン: 0.12.2)のAnsible Local provisionerでは
コンフィギュレーションの”inventory_file”でディレクトリーを指定するとエラーとなる。

{
"type": "ansible-local",
"playbook_file": "playbook.yml",
"inventory_file": "inventories/test"
}
1 error(s) occurred:

* inventory_file: inventories/test must point to a file

また、”inventory_file”の指定をやめ、
“extra_arguments”で-iオプションでディレクトリーを指定しても、
Packerが自動的にinventoryファイルを生成して-iオプションを重複指定してしまい、
inventoryディレクトリー内のhost_vars, group_varsなどが正しく読み込まれない。

{
"type": "ansible-local",
"playbook_file": "playbook_dummy.yml",
"extra_arguments": [
"-i",
"inventories/test"
]
}
cd /tmp/packer-provisioner-ansible-local && ANSIBLE_FORCE_COLOR=1 PYTHONUNBUFFERED=1 ansible-playbook /tmp/packer-provisioner-ansible-local/playbook.yml -i inventories/test -c local -i /tmp/packer-provisioner-ansible-local/packer-provisioner-ansible-local138537763

ここでAnsible Local provisionerのコンフィギュレーションで”host_vars”や”group_vars”を指定すると、
Packerは指定されたhost_varsやgroup_varsのディレクトリーを
/tmp/packer-provisioner-ansible-local直下に複製する動きになるようだ。

しかし、先ほどのAnsible公式Docの
ディレクトリーレイアウトのBest practiceを見れば分かるように、
Ansibleのプロジェクトディレクトリー直下には
playbookの”host_vars”や”group_vars”が既に存在しており、
開発者の意図と異なる動作となる。

ansible-local provisioner with aws: vars_files are not found when provisioning AMI · Issue #3316 · mitchellh/packer · GitHub

Ansibleの公式Docでは変数の読み込み優先度が明確に示されており、
Ansibleプロジェクトのディレクトリー構成は開発者が意図をもって設計しているものだ。

Variables — Ansible Documentation

しかし、なぜかPackerのAnsible Local provisionerは
Ansibleプロジェクトのディレクトリー構成を変更したがる実装になっているので、
当面の間は以下の方法で問題を回避することにした。

{
"type": "ansible-local",
"playbook_file": "playbook_dummy.yml",
"playbook_dir": "./"
},{
"type": "shell",
"inline": [
"cd /tmp/packer-provisioner-ansible-local && ANSIBLE_FORCE_COLOR=1 PYTHONUNBUFFERED=1 ansible-playbook /tmp/packer-provisioner-ansible-local/playbook.yml -c local -i /tmp/packer-provisioner-ansible-local/inventories/test"
]
}

ちなみにplaybook_dummy.ymlの中身は以下の通り。

- hosts: localhost

投稿者プロフィール

篠田 将彦
2014年3月よりスカイアーチネットワークスに在籍、
プログラミング歴20年。
テスト工程の省力化、リリース作業の単純化、
リファクタリングによるレガシーコードの改善を得意としています。

コメントを残す

メールアドレスが公開されることはありません。

Time limit is exhausted. Please reload CAPTCHA.

ABOUTこの記事をかいた人

2014年3月よりスカイアーチネットワークスに在籍、 プログラミング歴20年。 テスト工程の省力化、リリース作業の単純化、 リファクタリングによるレガシーコードの改善を得意としています。