📦
Packerで複数のイメージを出し分ける方法
この記事は?
Packerを使う時に1つのpacker.jsonで複数のbuilderの定義を書いてイメージをビルドしたい場合があると思います。
その場合に全部のbuilderを同時にビルドするのには packer build packer.json
でいいですが、例えばイメージの更新作業などで複数のbuilderの中で1つのイメージだけをビルドしたいときはどうすればいいか調べてみました。
結論
(記載しているjsonはサンプルなのでコピぺしてもそのままでは動かないです)
各builderには名前がつけられるので名前をつけていきます。
packer.json
"builders": [
{
"name": "server-1", <-これが名前になる
"type": "googlecompute",
"project_id": "project-name",
"zone": "asia-northeast1-b",
"source_image_family": "ubuntu-1804-lts",
"image_name": "server-1-{{ user `image_name` }}",
"ssh_username": "root",
},
{
"name": "server-2",
"type": "googlecompute",
"project_id": "project-name",
"zone": "asia-northeast1-b",
"source_image_family": "ubuntu-2004-lts",
"image_name": "server-2-{{ user `image_name` }}",
"ssh_username": "root",
},
]
実行の際にビルドしたいbuilderをonly
のoptionに入れて実行します。
例えば、server1のみをビルドしたい場合は以下のようになります。
packer build -only=server-1 packer.json
provisionerも分けたい場合
例えばAnsibleでプロビジョニングをしたい場合、各builderで参照するplaybookのファイルをわけたい場合は以下のようになります。
packer.json
"provisioners": [
{
"type": "ansible",
"playbook_file": "./server-1-playbook.yml",
"only":["server-1"]
},
{
"type": "ansible",
"playbook_file": "./server-2-playbook.yml",
"only":["server-2"]
},
],
ちなみに、このonlyは他のprovisionerにもあるため、server-1はAnsibleを使い、server-2はshellを使うなどもできます。
特定のbuilder以外を実行する場合
例えばserver-1のビルド以外全てを実行したいはexcept
を利用します。
packer build -except=server-1 packer.json
以上。
Discussion