6

「プロビジョナー」の段階で、パッカー テンプレートで条件ステートメントを使用したいと思います。

  "provisioners": [
    {
      "execute_command": "echo 'vagrant'|sudo -S sh '{{.Path}}'",
      "override": {
        "virtualbox-iso": {
          "scripts": [
            "scripts/base.sh",
            "scripts/puppet.sh",
          ]
        }
      },
      "type": "shell",
    }
  ]

たとえば、ユーザーが「packer build」コマンドラインで何らかの方法で「puppet」パラメーターを指定すると、「scripts/puppet.sh」が実行されます。それ以外の場合はスキップされます。

どうやってやるの?

4

2 に答える 2

10

パッカーは構成に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

ユーザー変数を使用する代わりに、ボックスに環境変数を設定し、このタイプの変数を使用してプロビジョナーを指定する方法があるはずです。

于 2015-04-19T14:08:27.923 に答える