Packerを使ってみて分からないところを調べてみた。

# はじめに
前回([Packerを使ってBoxイメージファイルを作成してみた。](https://qiita.com/kotapontan/items/0d772cd7756d8498167d))、Packerを使ってみましたが、ファイルの中身について分からない部分が残っていたので、分からない箇所を調べてみました。

## Packerに関する理解

[マシン・イメージを自動構築し、作業効率を高めるPacker入門](https://thinkit.co.jp/story/2015/04/13/5875)を読むのが早いです。

## packerコマンドオプション

packerコマンドを実行したコマンドラインは次のとおり。

```
$ packer build -only=virtualbox-iso -var-file=centos7.json centos.json
```

| オプション | 説明 |
| -------- | -------- |
|-only  |カンマで区切られた名前を持つビルドのみをビルドする。|
|-var-file |指定ファイルからテンプレート変数を設定する。 |

参照: [build Command](https://www.packer.io/docs/commands/build.html)

## テンプレートの定義

### builders

buildersは、複数のプラットフォーム向けのマシンイメージを生成するための定義。

```
{
  "builders": [
    // ... one or more builder definitions here
  ]
}
```

|設定項目 |説明 |
| --------- | -------- |
|boot_command| virtualマシンの初期起動時に実行するコマンド群を定義する。コマンドの目的は、OSのインストールであるため、インストールのための必要なコマンドを定義する必要がある。|
|disk_size |VM用のハードディスクのサイズをメガバイトで指定する。デフォルトは、40GB |
|guest_additions_path| ★不明|
|guest_os_type| ゲストOSの種類を設定する。|
|hard_drive_interface | 主要ハードドライバに付属されるコントローラの種類を定義する。デフォルトはide。
Sataを設定すると、ドライバはAHCI SATAコントローラが付属される。scsiを設定すると、ドライバはLsiLogic SCSIコントローラーが付属される。|
|headless | Packerのデフォルトは、マシンのコンソールを起動しVirtualBoxのvirtualマシンを構成する。trueを設定すると、コンソールを表示せずにマシンを起動する。|
|http_directory | HTTPサーバを使用するためのディレクトリのパスを設定する。設定したパスにあるファイルは、virtualマシンからHTTPを経由し取得される。|
|iso_checksum | OS ISOファイルのチェックサムを記述する。iso_checksumかiso_checksum_urlのどちらかを定義する必要がある。iso_checksum_urlが優先される。|
|iso_checksum_type | checksumの種類を記述する。種類としては、md5,sha1,sha256,sha512がある。|
|iso_urls | ISOのURLを指定する。URLには、HTTP URLかファイルURL(ファイルパス）を指定することができる。|
|output_directory | virtualマシーンをどこのディレクトリに作成するのか指定する。デフォルトは、output-BUILDNAMEで作成する。(BUILDNAMEは、ビルド名)|
|shutdown_command |プロビジョニングが終了する際に、マシンを終了する際に使用するコマンド。 |
|ssh_password | sshのパスワードを指定|
|ssh_username |sshのユーザー名を指定 |
|ssh_wait_timeout | sshのタイムアウトを指定|
|type | ビルドの種別。|
|vboxmanage |virtualマシンを作成するためのVBoxManageコマンドをカスタマイズするための設定をする |
|virtualbox_version_file |★不明 |
|vm_name | 新規virtualマシンのOVFファイルの名前を指定する。デフォルトは、packer-BUILDNAME(BUILDNAMEは、ビルド名)|

### provisioners

provisionersは、マシンイメージにミドルウェア、アプリケーションなどのインストールや設定を自動で行うための定義。

```
{
  "provisioners": [
    // ... one or more provisioner definitions here
  ]
}
```

|設定項目 |説明 |
| --------- | -------- |
|environment_vars | key/valuesのペアをexecute_commandに注入する。(環境変数の設定)|
|execute_command | スクリプトで実行するコマンドを定義する。|
|scripts | スクリプト群をマシン上で実行する。絶対パスまたは相対パスで定義可能で、相対パスの場合は、Packer実行じのワーキングディレクトリが開始位置となる。|
|type | provisionersの種別を定義。ここではshell|
|expect_disconnect |デフォルトはfalse。エラーが発生した際に、サーバーとの接続を切断する。sshサーバまたはリブートした場合、切断が発生する。 |


### post-processors

post-processorsは、ビルダーの結果を取得し新たらしいアーティファクトを作成するための定義。

```
{
  "post-processors": [
    // ... one or more post-processor definitions here
  ]
}
```

|設定項目 |説明 |
| --------- | -------- |
|keep_input_artifact| trueを設定した場合、ビルド成功時に、output_directoryを削除しない。|
|output | post-processorによって作成されるboxファイルのパスを指定する。デフォルトは、packer_{{.BuildName}}_{{.Provider}}.box|
|type | post-processorsの種別|
|vagrantfile_template | boxとセットのVagrantfileのテンプレートのパス|

### {{user xxxxx} } とは？

{{user xxxxx}} と記述するとuserという関数を使用してxxxxxの値を取得することができる。
例えば、{{ user `disk_size` }}の場合は、variablesに定義したdisk_sizeの値を設定される。
[Template Engine](https://www.packer.io/docs/templates/engine.html)
[Template User Variables](https://www.packer.io/docs/templates/user-variables.html)


# 参考ページ
[build Command](https://www.packer.io/docs/commands/build.html)
[マシン・イメージを自動構築し、作業効率を高めるPacker入門](https://thinkit.co.jp/story/2015/04/13/5875)
[Packerを使ったISOイメージからの仮想マシン自動デプロイ](https://knowledge.sakura.ad.jp/2376/)