Chef for Windows ChefがWindowsで動くか試してみた

modified at:20 June 2015

コワーカーの若者が「Chefの情報がMacのものが多くて、Windowsの情報が少ない上に、Cygwin等が必要で、Chefが動いてくれない」と仰っていたので、一度私も試してみようと試みたメモ書きです(今までに一度も使ったことのない、あくまでも素人のメモ書きですので、悪しからず)。

結論から先に述べておきますと、ちょっと苦労したけれどChefが一応動きました

先ほどの彼の言っていること(Windowsの情報が少ない)は本当なんですが、それ以上にChefの変化も大きく、Chef Soloなのか、Knife Soloなのか、はたまたKnife Zeroなのかというような情報が錯綜していて(よくわかっていない私も含めた人たちにとっては)、その辺の情報をうまく整理できず苦労する、ということも大きい気がしました。

ここでは、高度なことは一際せず、とにかくChefが動いて、Vitutal BoxにあるCentOS7にApacheがインストールされるところまでの手順です。

vagrantという開発環境であれば、vagrant-omnibusというプラグインをインストールすれば、vagrant provision で、環境設定が終わるようですが、その場合、外部の本サーバーではその方法はとれないので、今回はあくまでもvagrantだけれど、まるで外部サーバーにインストールするように行ってみます。

環境

  1. OSはWindows7
  2. C:\vagrant\centos7で作業

が前提になっています。

インストールTopへ

Rubyのインストール

そもそもRubyは必要ありません。というのも、「Chef DK」にはRubyが付いてきているからです。

では何故必要か。

WindowsにはSSHコマンドがないからです。SSHはTeratermやPuttyなどを利用している方も多いかもしれませんが、Chefの場合裏側でSSHコマンドを叩いたりするので、どうしても必要になります。

そこで、Cygwinなどをインストールする必要がありますが、これには結構時間がかかりますし、あまりにも多くのプログラムまでインストールされてしまうので、無駄も大きい。というわけで、RubyをインストールするとGitやSSHが使えるようになるので、それを利用しようというわけです。

ただし、Cmderを使うという選択肢もありますが、ここでは今の私の環境に合わせますw。

ただ、通常のhttps://www.ruby-lang.org/ja/downloads/「安定版」じゃなくhttp://railsinstaller.org/enから、下のリンクのWindows RUBY 2.1というのをダウンロードして、インストールします。

ここで忘れてならないのがPATHの編集です。インストーラはC:\RailsInstaller\Git\cmd;C:\RailsInstaller\Ruby2.1.0\bin;というパスを追加してくれています。まずはこれらが一番最初にあることを確認し(あとから編集していなければ最初にあるはず)、C:\RailsInstaller\Git\bin;を先頭に追加します。この追加したPATHにSSHがあるからです。

もし、別のGitがあって邪魔だという人はC:\RailsInstaller\Git\cmdを取る必要がありますし、先ほども言いましたがRuby自体も必要ないので、別のRubyを使っているので邪魔だという人はC:\RailsInstaller\Ruby2.1.0\bin;を取ってしまってください。

PATHを変えたので、コマンドプロンプトを開き直すか、念のためにWindowsをリスタートしておきます(リスタートは必要ないはずなんですが、たまにランチャーからコマンドプロンプトを立ち上げたからか、反映されないことがあって、その場合はです)。

Virtual BoxのインストールTopへ

これはすでにある人は当然必要ありません。ただ古いと環境がちがってしまう可能性もあり、アップデートしておくことをお薦めします。

http://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html?ssSourceSiteId=otnjp#vboxからダウンロードして、インストールしてください。PATHとかは追加してくれています。

VagrantのインストールTopへ

https://www.vagrantup.com/downloads.htmlからダウンロードして、インストールしてください。PATHとかは追加してくれています。リスタートを要求されますので、リスタートしてください。

そして立ち上がったら、コマンドプロンプトで次の2つのpluginをインストールしてください。

      >vagrant plugin install vagrant-vbguest
>vagrant plugin install sahara
   

vagrant-vbguestは

      Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` vagrant /vagrant

The error output from the last command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device
   

上のようなエラーをvagrant upしたとき出たら(私は出ましたw)

      >vagrant vbguest
   

とすると(GuestAddtionsをアップデートすると)、解消するからです。

またsaharaというプラグインをインストールすることで、Vagrantで作成した仮想環境の状態を、指定したポイントに戻すことができるようになります。

つまり、

      >vagrant sandbox on       # sandboxモード開始
>vagrant sandbox commit   # 変更を反映する
>vagrant sandbox rollback # 変更を元に戻す
>vagrant sandbox off      # sandboxモード終了
>vagrant sandbox status   # 現在のモードの確認
   

というようなことができるので、

  1. vagrant sandbox onでいつでも戻せるようにして
  2. Chefのもろもろを実行して(時には失敗して)
  3. vagrant sandbox rollbackで、一度初期状態に戻す

というような使い方ができます。でないと、VagrantでBoxの作り直しなどが必要になって無駄に時間がかかる可能性があるからです。

Chef DKのインストールTopへ

Rubyユーザならgemコマンドでインストールしたいところですが、最近は、Rubyユーザじゃない人も多いせいでWindowsだけじゃなくLinuxやMacユーザなども、このChef DKを利用していることが多いようです。

https://downloads.chef.io/chef-dk/windows/#/に行って、最新版をダウンロードしてインストールしてください。PATHとかは追加してくれています。

さて、ここからが本番です。

VagrantでBoxの作成Topへ

とりあえずC:\vagrant\centos7で、作業をする準備をします。DOSプロンプト立ち上げて

      >cd \
>mkdir vagrant
>cd vagrant
>mkdir centos7
>cd centos7
>vagrant init
   

最後のvagrant initで、Vagrantfileというファイルができていますので、次の内容で全て置き換えてしまいます。

      # -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure(2) do |config|
  config.vm.box = "opscode-centos-7.0"
  config.vm.box_url = "http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-7.0_chef-provisionerless.box"
  config.vm.network "private_network", ip: "192.168.33.11"
  config.vm.hostname = "vmcentos"
  config.vbguest.auto_update = false
  config.vm.provider "virtualbox" do |vb|
    vb.name = "centos7_vagrant"
    vb.memory = "2048"
  end
end
   

上のconfig.vm.hostname = “vmcentos”のhostnameは重要で、Chefはこれを取得してhostnameとして保存します。そして、この後sshのconfigでこのvmcentosを使います。

そして

      >vagrant up
   

して、しばし待ちます。ここで最後に上で行ったようなエラー(mounting failed)が起こったら、vagrant vbguestします。

ここでupしたら、SSHでログインできるか確認します。

      >vagrant ssh
$ exit
>ssh 127.0.0.1 -l vagrant -p 2222 #パスワードはvagrantなので、それを入力
$ exit
   

で、無事ログインできるはずです。

SSHで自動ログインできるようにする

vagrant sshではパスワードは聞かれませんが、上記の2つ目の方法ですと聞かれてしまうので面倒です。そこで秘密鍵を置いて、聞かれないようにします。

ここで少し注意事項があります。現在利用しているSSHが環境変数のhomeが設定されていると、そこがホームディレクトリと認識されます。もしないなら、C:/Users/ユーザー名になっているはずなんですが、何故かうまくいかず、結構はまりましたw。

なので、今回は環境変数にhome環境変数を新規に作成しました。

   home=C:\Users\ユーザー名

などです。こうすると、そこがホームディレクトリになります。

さて、このディレクトリの下に.sshディレクトリを作成してそこに、次のような内容のconfigファイルを作成します。

      Host vmcentos
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile C:/vagrant/centos7/.vagrant/machines/default/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL
   

そして、

      >ssh vmcentos #パスワードなしでログインできたらOK
$ exit
   

で、パスワードなしでログインできたらOKです。

ようやくChefTopへ

コマンドプロンプトでカレントをC:\vagrant\centos7にしてください。

      >pwd
/cygdrive/c/vagrant/centos7
>which pwd
/cygdrive/c/RailsInstaller/Git/bin/pwd
   

上記のpwd(カレントディレクトリの表示)やwhich(コマンド在処)コマンドは、SSHを使えるようにしたPATHにあるので使えます。/Cygdrive/といのはCygwin系の場合で使われるドライブを表す方法です(シェル/環境変数/拡張子/IDE・エディタ参照)。

Knife SoloとKnife Zeroのインストール

通常ならgemコマンドを利用しますが、Chef DK下のgemを利用します。これはchef gem install …です。

そこで

      >chef gem install knife-solo
>chef gem install knife-zero
   

で、インストールされるはずです。

さて、こんな作法が許されるかどうかは知りませんが、とりあえず、このc:\vagrant\centos7ディレクトリ以下にディレクトリを作成して作業を進めます。

      >mkdir chef-repo
>cd chef-repo
>knife solo init .
   

最後のコマンドで色々ファイルやディレクトリが作成されています。そこで

chef-repo/.chef/.knife.rb

というファイルの先頭に

   local_mode true

を追記します。ローカルモード以外利用しないので、いちいちコマンドラインで–local-modeを引数に渡すのは面倒ですw。

クライアントにChefをインストールする

混乱するのですが、Chefではクライアントがサーバーになります。色々なミドルウェア等をインストールされる側ということで、クライアントというわけです。そのクライアントにもChefをインストールする必要があります(Knife Zeroを利用せず、クライアントで手動でインストールする人もいるみたいです)。

   >knife zero bootstrap vmcentos -p 2222 -x vagrant --sudo

これがうまくいけばもう少しです。私の場合ここで結構はまりました。

そして、このクライアント(Virtual BoxにインストールされているCentOS)のノード名(インストールしたいサーバーをnodeという)が自動で付いて(指定することもできるらしい)、今回はvmcentosで、実際C:\vagrant\centos7\chef-repo\nodes\vm\vmcentos.jsonというファイルができています。

そして最後に、今回はhttpdをインストールさせるだけなので、次のような作業を行います。

   >knife cookbook create httpd cookbooks #httpdというレシピの追加

これで作成された、C:\vagrant\centos7\chef-repo\cookbooks\httpd\recipes\default.rbというファイルに次の文言を書き込みます。

   package 'httpd' do
    action :install
end

service "httpd" do
  action [:enable, :start]
end

そして、Chefにそのことを教えるために

   >knife node run_list add vmcentos httpd

を実行します。これはC:\vagrant\centos7\chef-repo\nodes\vm\vmcentos.jsonというファイルの末尾に手動で

     "run_list": [
    "recipe[httpd]"
  ]

と書き加えたのと同じ意味です。

これで準備万端。

   >knife zero chef_client 'name:vmcentos' -x vagrant --sudo -a hostname

これでエラーが起こらなければ、Apacheがインストールされているはずです。

http://192.168.33.11

にアクセすると、下のような画面が出現すれば成功ですw

Apache


今回は、動作確認だけでしたが、次はBerkShelfを利用したもう少し高度な方法を試してみます。

おしままい。

  created at:24 May 2015




[投稿する]場合は、 枠の中の図形をマウスでドラッグして、(あるいは指で)なぞって下さい。それほど厳密でなくても大丈夫です。