Packerのプラグインについて調べたこと

最近Goを書こうかなと思ってとりあえず A Tour of Goを一通り進めた

ただやっぱり実際にものを作りながら身につけたいので何か作ることにした
最近業務でも個人でも使っているPackerがGoで作られれたので勉強がてらプラグインを作ってみる

Packerとは?

www.packer.io

HashiCorp製でGCPAWSなどのプラットームむけのマシンイメージを作成するためのコマンドラインツール
僕はDocker Imageを作成する時やAWSのAMIを作成する時に使用してたりする

PackerではTemplateと呼ばれるJSONファイルに中身を記載していきます
詳しくはこちら

Packerのプラグインについて

Packerでは

  • buildersと呼ばれる作成するマシンイメージの元になるイメージなどを定義したもの
  • provisionersと呼ばれる作成するマシンイメージに必要なパッケージをインストールするもの
  • post-processorsと呼ばれる作成したイメージをどこかにアップロードしたりする後処理

を定義することが出来るがそれぞれにはPacker側でサポートされているものがあります (例: provisionersでいえばChefやAnsible)
これらはユーザー自身が拡張してプラグインを追加できるように設計されています

プラグインを作るにあたって

まず既に作成されているプラグインなどを探す時は「packer plugin x」とググって探すそうです

プラグインのインストールについてはバイナリの名前をpacker-TYPE-NAMEにしてあげて適切な場所に配置する必要があります
例えば名前に関してで言うとamazon-ebsのbuilderプラグインを作るとしたらpacker-builder-amazon-ebsみたいな

インストールする場所については下記の順番でよみこんでいき同じ名前のものがあった場合は後から見つかったものが使われるとのこと

  1. packerがあるディレクトリもしくはPATHが通ったディレクト
  2. ~/.packer.d/plugins配下 windoewsだと%APPDATA%/packer.d/plugins
  3. カレントディレクト

プラグインについてはいずれも対応するinterfaceが存在しているのでそれを実装していく
開発をしていく中ではPACKER_LOGを設定することで標準出力が出るので便利そう
プラグイン開発中にテストするためにはコンパイルされたプラグインのパスを指定すると良いらしい

{
  "builders": {
    "hoge": "/home/packer-plugins/packer-builder-hoge"
  }
}

Goのアプリケーションはプラットフォームごとに異なるのでクロスコンパイルする必要があり下記がオススメらしい

github.com

次からは実際にプラグインを作っていこうと思う