パッカーは構成にJSON形式を使用するため、条件ステートメントのようなフロー制御メカニズムをサポートしていないため、これはパッカーのネイティブテンプレート形式では可能ではないと思います。ただし、ユーザー変数とシェル プロビジョナーを使用して同様の動作をアーカイブすることは可能です。
アイデア
最も簡単な方法は、ビルド コマンドからユーザー変数を設定し、この変数を packer からシェル プロビジョナースクリプトに渡すことです。シェル プロビジョナー スクリプトは、ユーザー変数の値を検出し、puppet、salt などの適切なプロビジョナー スクリプトを呼び出します。
免責事項:
私はこのアプローチをテストしませんでしたが、私が何を意味するかについてのヒントを与えるはずであり、おそらくより良い解決策を思いつくことができます. ;-)
問題解決アプローチ
1. 使用されるプロビジョナーを示す変数を定義します。
ユーザー変数を定義するには複数の方法があります。
-var フラグを指定して packer build コマンドを呼び出す (回答の最後を参照)
box-template ファイルでユーザー変数を定義する
The packer box template file: **template.json**
"variables": [
"using_provision_system": "puppet"
]
"provisioners": [
{...}
変数定義ファイルを定義し、ビルド コマンドで -var-file を使用してそのパスを指定します。
The variable file: **variables.json**
Is a great alternative if you want to define variables in a seperate file.
{
"using_provision_system": "puppet"
}
2. プロビジョナー スクリプトを呼び出すシェル スクリプトを呼び出します。
ここで、定義された変数を引数として「マスター」スクリプトが呼び出されるように、execute_command を変更します。
"provisioners": [
{
"execute_command": "echo 'vagrant'|sudo -S sh '{{.Path}}' '{{user `using_provision_system`}}'",
"override": {
"virtualbox-iso": {
"scripts": [
call_provisioner_script.sh
]
}
},
"type": "shell",
}
]
スクリプトを 1 つだけ指定する必要があることに注意してください。この 1 つの「マスター」スクリプトは、渡された変数を引数として取り、その値をスイッチ条件で事前定義されたプロビジョナー名と比較します。(簡単: どのプロビジョナー スクリプトを実行するかを選択します。)
マスター プロビジョニング スクリプト: call_provisioner_script.sh
case $1 in
puppet*) sh puppet_provisioner.sh
*) sh shell_provisioner.sh
気をつけて!
このスクリプトはボックス内で実行されるため、このコマンドを実行する前に、スクリプトをボックスにアップロードする必要がある場合があります。
3. 最後のステップは、ボックスを作成することです :)
packers build コマンドの呼び出し:
#define variable in build command (first option from above)
$ packer build -var 'using_provision_system=puppet' template.json
#define variables in variable file and set path in build command
$ packer build -var-file=variables.json template.json
ユーザー変数を使用する代わりに、ボックスに環境変数を設定し、このタイプの変数を使用してプロビジョナーを指定する方法があるはずです。