[和訳] ChefDK on Windows サバイバルガイド #opschef_ja #getchef_ja
この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。
本項は The ChefDK on Windows Survival Guide (2014/11/04) の和訳です。
はじめに
ChefDKは「Chefを使い始めるのに必要なすべてを含む」こと、開発者のワークステーションを設定する手順を大幅に簡単にすることを意図しています。Chef Omnibusパッケージと明らかに似ているにも関わらず、ChefDKユーザは、特にWindowsにおいて、多くの問題や矛盾点を見つけています。
本項の目的は、ChefDKがどのように動作するかのよりよい理解と、よくある落とし穴を避けてWindowsにワークステーションを設定する方法を提供することです。
ChefDKとChef Omnibusパッケージの違い
AppBundler
AppbundlerはChefDKで用いている新しい技術で、実行ファイル内にGemバージョン依存を埋め込むものです。bundle execと同じような機能を提供していますが、実行時にバージョン制約を解決する必要がないため、より早く読み込めます。
Appbundlerは、ChefDK内には同じgemの2つのバージョンを含めておく必要があります。例えば、chef 12 gemはChefDKの中核機能が依存しており、chef 11 gemは多くのユーザやChef Server自身によって必要とされています。
appbundleされた実行ファイルはChefDKのbinディレクトリ、MacやLinuxでは/opt/chefdk/binに、WindowsではC:\opscode\chefdk\binにインストールされます。
chefコマンド
chefコマンドはChefDKユーザに多くの有用な機能を提供します。
- chef execは、ChefDKのembedded/binディレクトリやユーザが独自にインストールしたgemから、実行ファイルを適切に呼び出せます。
- chef gemは、ChefDK内で利用するためのRubyGemsをインストールするためのgemコマンドのラッパーです。/opt/chefdkではなく、ユーザの~/.chefdkディレクトリにインストールされることに注意してください。
- chef shell-initは、ChefDKのRubyやGem群をchef execを用いずに直接利用するための環境変数を提供します。
- chef verifyは、ChefDKのすべてのコンポーネントが正しくインストールされているかどうかを検証します。
- chef generateは、Cookbook、Cookbookのサブコンポーネント(Recipe、Attribute、LWRPなど)や完全なRepoディレクトリを生成します。
- ポリシーファイル関連を含んだ、より詳しい情報はドキュメントを参照してください。
訳注: 「Chef Development Kit 0.3.2を使ってみよう:基本編」、「Chef Development Kit 0.3.2を使ってみよう:ポリシーファイル編」も参照してください。
ChefDKにおけるPATHの重要性
インストール時、ChefDKは/opt/chefdk/binやC:\opscode\chefdk\bin内の実行ファイルのみをユーザに見せています。これらは前述した通りAppbundleされた実行ファイルです。Chef初心者がembedded/binディレクトリの実行ファイルを実行するためには、chef execを使うことをお勧めします。
慣れたChef Omnibusユーザは通常はembedded/binをPATHに追加し、ChefDKのコマンドのすべてをコマンドラインから直接実行したいと思うでしょう。そのようにするための正しい方法は、ドキュメントにある通り、chef shell-initを使うことです。残念ながら、Windowsユーザのためのshell-initサポートはちょっとした混乱やPATH中のbinディレクトリの順番が間違っているというバグレポートのためにまだ作業中です。
その他の共通の問題として、ChefとChefDKの両方のbinディレクトリがユーザのパス中に存在していることがあります。ChefDKはOmnibus Chefの上位パッケージなので、ユーザは両方ではなくどちらか1つをインストールすべきです。ChefDKをインストールする前に、ワークステーションからchef-clientをアンインストールしてください。
PowershellユーザのためのChefDKセットアップ
chef execを完全に使わないようにするために、embedded\binをPATHに追加する正しい方法は、次のようにPATH、GEM_ROOT、GEM_HOME、GEM_PATH環境変数を設定することです。
$env:Path += ";$env:USERPROFILE\.chefdk\gem\ruby\2.0.0\bin;c:\opscode\chefdk\embedded\bin"
$env:GEM_ROOT = "c:\opscode\chefdk\embedded\lib\ruby\gems\2.0.0"
$env:GEM_HOME = "$env:USERPROFILE\.chefdk\gem\ruby\2.0.0"
$env:GEM_PATH = "$env:USERPROFILE\.chefdk\gem\ruby\2.0.0;C:\opscode\chefdk\embedded\lib\ruby\gems\2.0.0"
注意: ChefDK 0.3.xはRuby 2.0.0を含んでいます。ChefDKがより新しいRubyに更新した場合、この2.0.0をその新しいRubyバージョンに書き換える必要があります。
この変更を永続化するには、bashのプロファイルと同じように、Powershellの$profileに先の内容を追加します。$profileの位置は次のように決めることができます。
PS C:\> echo $profile
C:\Users\Irving Popovetsky\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
PS C:\> echo $profile.AllUsersAllHosts
C:\Windows\System32\WindowsPowerShell\v1.0\profile.ps1
詳しい情報はman about_Profilesを参照してください。
プロファイルを実行する前に、Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope LocalMachine -Force も実行する必要があります。
BashユーザのためのChefDK
注意: 私達が公式にサポートして推奨しているWindowsシェルはPowershellのみです。Bashは自己責任で使ってください。
Windowsには、2つの有名で本質的に異なるBash実装であるcygwinとmsysがあります。MinGWプロジェクトによるmsysが、特にmsysとOmnibus ChefでPATH表記の互換性があるという点で、Chefユーザにとってよりよい選択でしょう。msysgitプロジェクトが提供するすばらしいインストーラが、BashやGitやその他の重要なUnixコマンドラインツールを含んでいます: http://msysgit.github.io/
残念ながら、chef shell-initはいくつかの理由により、Windows用の有用な環境変数を提供していません。
- パス区切りにコロンを用いるWindowsスタイルのパス(c:\)
- ディレクトリ名にスペースを含んでいる場合に対応するための変数におけるクォートの欠如
動作させるには次のようにします:
- bashプロファイルに次を設定する:
RUBY_VERSION="2.0.0"
export PATH="${PATH}:${HOME}/.chefdk/gem/ruby/${RUBY_VERSION}/bin:/c/opscode/chefdk/embedded/bin"
export GEM_ROOT="/c/opscode/chefdk/embedded/lib/ruby/gems/${RUBY_VERSION}"
export GEM_HOME="${HOME}/.chefdk/gem/ruby/${RUBY_VERSION}"
export GEM_PATH="${HOME}/.chefdk/gem/ruby/${RUBY_VERSION}:/c/opscode/chefdk/embedded/lib/ruby/gems/${RUBY_VERSION}"
- bashシェルを閉じて再度開き、環境を検証する:
$ chef verify
Running verification for component 'berkshelf'
Running verification for component 'test-kitchen'
Running verification for component 'chef-client'
Running verification for component 'chef-dk'
Running verification for component 'chefspec'
.......................................................................................
---------------------------------------------
Verification of component 'chef-client' succeeded.
Verification of component 'chefspec' succeeded.
Verification of component 'berkshelf' succeeded.
Verification of component 'chef-dk' succeeded.
Verification of component 'test-kitchen' succeeded.
Windowsにおける既知の大きな問題
- スペースを含むパスにGemのネイティブエクステンションがインストールできない(https://github.com/rubygems/rubygems/issues/523)。これはChefDKだけの問題ではなく、次のようなことをしたユーザに影響のある、RubyGemsとWindowsの一般的な問題です。
- ChefDKを「C:\Program Files」のようなスペースを含むパスやc:\opscode以外のどこかにインストールしようとした。
- bundle installでgemを「C:\Users\My User\My Documents\src\cookbook」のようなスペースを含むパスの他のプロジェクトにインストールしようとした。
- Gemは260を越えた長さのパスにインストールできない: 参考
ChefDk 0.2.0と0.3.0において、supermarket.getchef.comと通信しようとしたBerkshelfがSSLエラーを起こす(0.3.2で修正) もしChef Serverと通信しようとしたBerkshelfがSSLエラーを起こした場合、次をRubyワンライナーを実行してSSL検証を無効化してください。
PS C:\Users\Irving Popovetsky> ruby -e "require 'json'; Dir.mkdir('.berkshelf') unless Dir.exists?('.berkshelf') ; File.open('.berkshelf/config.json', 'w+') { |config| config.write(JSON.pretty_generate({ssl: { verify: false }})) }"