Packer v1.7からプラグインを特定のルールに沿って作成されたGitHub Releasesからダウンロード〜インストールできるpacker init
コマンドが追加されました。
最近さくらのクラウド向けPackerプラグイン sacloud/packer-plugin-sakuracloudでこのpacker init
に対応しましたので今回はその紹介をしていきます。
packer init
コマンド
Packer v1.7からpacker init
コマンドが追加されました。
従来はPackerに組み込まれていないビルダーやプロビジョナーなどのプラグインは手動でインストールしていましたが、packer init
を実行することでプラグインのダウンロード〜インストールを行ってくれるようになりました。
Terraformにおけるterraform init
みたいな感じです。
ただ、Packerには今の所状態を管理する機能はありませんのでpacker init
はプラグインのインストールのみを行います。
また、プラグインのダウンロードは今の所GitHub上の公開リポジトリからのみ可能とのことです。
なおpacker initのドキュメントでは Currently って書いてあるのが目につくので、将来的にいろいろ拡張されそうな気配を感じます。
packer init
の使い方
ドキュメントはこちらです。
まずpacker init
を行うためにはいくつかの条件があります。
古くからあるJSONテンプレートでは利用できない点に注意が必要です。
これらの条件を満たすプラグインであれば、以下のようなrequired_plugins
ブロックをテンプレートファイルに記載した上でpacker init
でインストール可能です。
packer { required_plugins { sakuracloud = { version = ">= 0.7.0" source = "github.com/sacloud/sakuracloud" } } }
# プラグインのインストール
$ packer init template.pkr.hcl
なお、v1.7時点では従来Packer本体に組み込まれていたビルダーやプロビジョナーはまだ別リポジトリに分離されておらず、packer init
なしで利用可能です。
また、packer init
に対応していないプラグインでも手動インストールすることで利用は可能です。
ただし、Packer v1.7ではPacker本体とプラグインとの間の通信プロトコルのバージョンが変更されている(マイナーバージョンという概念が追加された)ため、古いプラグインはそのままだと利用できないケースもあります。
プラグインとの通信プロトコルバージョンによるエラーメッセージの例:
Error: Failed to load source type The protocol of this plugin (protocol version 4 and lower) was deprecated, please use a newer version of this plugin.Or use an older version of Packer (pre 1.7) with this plugin.
利用例: さくらのクラウド向けプラグイン
packer init
の利用例としてさくらのクラウド向けプラグインでの利用方法を紹介します。
packer-plugin-sakuracloud v0.7からpacker init
に対応しています。
(packer init
に対応するために名称をpacker-builder-sakuracloud
から変更しました)
以下のようなテンプレートを用意することでプラグインのインストール〜packer build
の実行が可能です。
# template.pkr.hcl # required_pluginブロックで利用するプラグインを宣言 packer { required_plugins { sakuracloud = { version = ">= 0.7.0" source = "github.com/sacloud/sakuracloud" } } } source "sakuracloud" "example" { zone = "is1a" os_type = "centos8" password = "input-your-password" disk_size = 20 disk_plan = "ssd" core = 1 memory_size = 1 archive_name = "packer-example-centos" archive_description = "description of archive" } build { sources = [ "source.sakuracloud.example" ] provisioner "shell" { inline = [ "echo 'hello!'", ] } }
テンプレートを用意し以下のコマンドで実行していきます。
# APIキーを環境変数に設定 $ export SAKURACLOUD_ACCESS_TOKEN=xxx $ export SAKURACLOUD_ACCESS_TOKEN_SECRET=xxx # プラグインのインストール $ packer init template.pkr.hcl Installed plugin github.com/sacloud/sakuracloud v0.7.0 in "~/.packer.d/plugins/github.com/sacloud/sakuracloud/packer-plugin-sakuracloud_v0.7.0_x5.0_darwin_amd64" # buildの実行 $ packer build template.pkr.hcl
従来の手動インストールと比べると手軽に利用できるようになりました。
GitHub Container Registryでのpacker-plugin-sakuracloudのDockerイメージの配布
なおpacker-plugin-sakuracloud v0.7からDockerHubに加えGitHub Container RegistryでのDockerイメージ配布も行われるようになりました。
Dockerで利用する場合は次のようなコマンドで実行します。
$ docker run -it --rm \ -e SAKURACLOUD_ACCESS_TOKEN \ -e SAKURACLOUD_ACCESS_TOKEN_SECRET \ -v $PWD:/work \ -w /work \ ghcr.io/sacloud/packer:latest build template.pkr.hcl
ベースイメージにhashicorp/packer:lightを使うようになりました。
従来通りのsacloud/packer
も継続して利用可能です。
(プラグイン開発者向け)プラグイン側がpacker init
に対応するには
Packerプラグインがpacker init
に対応するにはいくつかの条件があります。
- Packer Plugin SDKに対応していること
(かつmulti-component RPC server
であること) - プラグインのバイナリの名前が
packer-plugin-*
という形式(従来はpacker-builder-*
やpacker-provisioner-*
だった)であること
(これはmulti-component plugins
と呼ばれる。従来のものはsingle-component plugins
) - 所定の手順でGitHub Releasesでリリースすること
詳細は以下のドキュメントに記載されています。
新しくプラグインを作成する場合はscaffoldが提供されています。
Packer v1.6以前にプラグインを提供していた場合向けの移行ガイドやPacker Plugin SDKへのマイグレーションツールも提供されています。
packer init
に対応するかはともかくとしても、Packer Plugin SDKへの移行はしておかないとPacker v1.7でエラー(The protocol of this plugin~
)がでるようですので
Packer v1.6以前のプラグインは早めにマイグレーションした方が良さそうです。
以上です。