Packer Chef Provisioningの時にSSL Warningが出る

2014.05.09

こんにちは。望月です。
今日はPacker関連の小ネタです。

発生した事象

今日、少し久しぶりにPackerを触っていました。PackerでChef Provisioningを行うために、以下のようなテンプレートを書いていました。

{
  "builders": [{
    "type": "amazon-ebs",
    ....
  }],
  "provisioners": [
    {
      "type": "chef-solo",
      "cookbook_paths" : "cookbook"
      },
      "run_list" : [
      	"apache24"
      ]
    }
  ]
}

このテンプレートを一ヶ月ほど前に実行した時は問題なく作成されていたのですが、今日実行したところ以下のWarningが。

$ packer build packer.json
<snip>
==> amazon-ebs: Provisioning with chef-solo
<snip>
    amazon-ebs: Executing Chef: sudo chef-solo --no-color -c /tmp/packer-chef-solo/solo.rb -j /tmp/packer-chef-solo/node.json
    amazon-ebs: [2014-05-09T04:20:29+00:00] WARN:
    amazon-ebs: * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    amazon-ebs: SSL validation of HTTPS requests is disabled. HTTPS connections are still
    amazon-ebs: encrypted, but chef is not able to detect forged replies or man in the middle
    amazon-ebs: attacks.
    amazon-ebs:
    amazon-ebs: To fix this issue add an entry like this to your configuration file:
    amazon-ebs:
    amazon-ebs: ```
    amazon-ebs: # Verify all HTTPS connections (recommended)
    amazon-ebs: ssl_verify_mode :verify_peer
    amazon-ebs:
    amazon-ebs: # OR, Verify only connections to chef-server
    amazon-ebs: verify_api_cert true
    amazon-ebs: ```
    amazon-ebs:
    amazon-ebs: To check your SSL configuration, or troubleshoot errors, you can use the
    amazon-ebs: `knife ssl check` command like so:
    amazon-ebs:
    amazon-ebs: ```
    amazon-ebs: knife ssl check -c /tmp/packer-chef-solo/solo.rb
    amazon-ebs: ```
    amazon-ebs:
    amazon-ebs: * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    <snip>

Chefの実行時に発生するSSL関連のWarningのようです。少し調査したところ、Chef 11.12.0からSSL証明書の確認を行うようになったのですが、そのデフォルト設定である:verify_noneのまま実行すると、上記の警告が表示されるようです。

対応

通常のchef-soloであれば、solo.rbssl_verify_mode :verify_peerと記述すれば解決します。ですがPacker経由でのChef実行のため、Packerの設定ファイルに記述しなければなりません。記述方法はPackerの公式ドキュメントに書いてありました。

まず、Packerのテンプレートファイル(今回ではpacker.json)を以下の様に修正します。

  "provisioners": [
    {
      "type": "chef-solo",
      "config_template" : "chef.template",
      "cookbook_paths" : ["cookbooks"],
      "run_list" : [
        "apache",
      ]
    }

config_templateという行が追加されています。config_templateについて、Packerのドキュメントには以下の様に記述されています。

By default, Packer uses a simple Chef configuration file in order to set the options specified for the provisioner. But Chef is a complex tool that supports many configuration options. Packer allows you to specify a custom configuration template if you'd like to set custom configurations.

Chefの設定は非常に複雑で設定項目が多岐にわたるので、Packerのテンプレートで用意された項目で足りない場合には自分で設定ファイルを記述することができます。そのファイル名を指定するのがconfig_templateです。今回はchef.templateというファイルを作成しました。

chef.templateファイルは以下のような内容になっています。

cookbook_path [{{.CookbookPaths}}]
ssl_verify_mode :verify_peer

2行目で、警告を消すための:verify_peerを設定しています。一行目のcookbook_pathの右側にある、{{}}で囲まれた部分はPackerの組み込み関数です。{{.CookbookPaths}}は、Packerテンプレートに記述されたcookbook_pathsの値を取得するための関数です。(今回の例ではcookbooksが取得されます)
config_templateを指定しない場合には、Packerの内部で以下の設定ファイルデフォルト設定として作成され、作成されるマシンイメージで実行されるようです。

cookbook_path [{{.CookbookPaths}}]

まとめ

この警告はPackerだけでなく、Vagrantやknife-solo等のChefを使うツールで同様に起こりうる問題だと思います。この問題を解決するために調べた結果、Packerからも複雑なChefの設定ファイルが記述できることが分かったので、これからのPacker業が捗りそうです。

参考