📦

Packerで複数のイメージを出し分ける方法

2021/12/17に公開

この記事は?

Packerを使う時に1つのpacker.jsonで複数のbuilderの定義を書いてイメージをビルドしたい場合があると思います。

その場合に全部のbuilderを同時にビルドするのには packer build packer.json でいいですが、例えばイメージの更新作業などで複数のbuilderの中で1つのイメージだけをビルドしたいときはどうすればいいか調べてみました。

結論

(記載しているjsonはサンプルなのでコピぺしてもそのままでは動かないです)
各builderには名前がつけられるので名前をつけていきます。
https://www.packer.io/docs/templates/legacy_json_templates/builders#named-builds

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に入れて実行します。
https://www.packer.io/docs/commands/build#only-foo-bar-baz

例えば、server1のみをビルドしたい場合は以下のようになります。

packer build -only=server-1 packer.json

provisionerも分けたい場合

例えばAnsibleでプロビジョニングをしたい場合、各builderで参照するplaybookのファイルをわけたい場合は以下のようになります。

https://www.packer.io/docs/provisioners/ansible/ansible-local#only

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

https://www.packer.io/docs/commands/build#except-foo-bar-baz

以上。

Discussion