コワーカーの若者が「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だけれど、まるで外部サーバーにインストールするように行ってみます。
環境
- OSはWindows7
- C:\vagrant\centos7で作業
が前提になっています。
インストール
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のインストール
これはすでにある人は当然必要ありません。ただ古いと環境がちがってしまう可能性もあり、アップデートしておくことをお薦めします。
http://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html?ssSourceSiteId=otnjp#vboxからダウンロードして、インストールしてください。PATHとかは追加してくれています。
Vagrantのインストール
https://www.vagrantup.com/downloads.htmlからダウンロードして、インストールしてください。PATHとかは追加してくれています。リスタートを要求されますので、リスタートしてください。
そして立ち上がったら、コマンドプロンプトで次の2つのpluginをインストールしてください。
1
2
>vagrant plugin install vagrant-vbguest
>vagrant plugin install sahara
vagrant-vbguestは
1
2
3
4
5
6
7
8
9
10
11
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)
1
>vagrant vbguest
とすると(GuestAddtionsをアップデートすると)、解消するからです。
またsaharaというプラグインをインストールすることで、Vagrantで作成した仮想環境の状態を、指定したポイントに戻すことができるようになります。
つまり、
1
2
3
4
5
>vagrant sandbox on # sandboxモード開始
>vagrant sandbox commit # 変更を反映する
>vagrant sandbox rollback # 変更を元に戻す
>vagrant sandbox off # sandboxモード終了
>vagrant sandbox status # 現在のモードの確認
というようなことができるので、
- vagrant sandbox onでいつでも戻せるようにして
- Chefのもろもろを実行して(時には失敗して)
- vagrant sandbox rollbackで、一度初期状態に戻す
というような使い方ができます。でないと、VagrantでBoxの作り直しなどが必要になって無駄に時間がかかる可能性があるからです。
Chef DKのインストール
Rubyユーザならgemコマンドでインストールしたいところですが、最近は、Rubyユーザじゃない人も多いせいでWindowsだけじゃなくLinuxやMacユーザなども、このChef DKを利用していることが多いようです。
https://downloads.chef.io/chef-dk/windows/#/に行って、最新版をダウンロードしてインストールしてください。PATHとかは追加してくれています。
さて、ここからが本番です。
VagrantでBoxの作成
とりあえずC:\vagrant\centos7で、作業をする準備をします。DOSプロンプト立ち上げて
1
2
3
4
5
6
>cd \
>mkdir vagrant
>cd vagrant
>mkdir centos7
>cd centos7
>vagrant init
最後のvagrant initで、Vagrantfileというファイルができていますので、次の内容で全て置き換えてしまいます。
1
2
3
4
5
6
7
8
9
10
11
12
13
# -*- 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を使います。
そして
1
>vagrant up
して、しばし待ちます。ここで最後に上で行ったようなエラー(mounting failed)が起こったら、vagrant vbguestします。
ここでupしたら、SSHでログインできるか確認します。
1
2
3
4
>vagrant ssh
$ exit
>ssh 127.0.0.1 -l vagrant -p 2222 #パスワードはvagrantなので、それを入力
$ exit
で、無事ログインできるはずです。
SSHで自動ログインできるようにする
vagrant sshではパスワードは聞かれませんが、上記の2つ目の方法ですと聞かれてしまうので面倒です。そこで秘密鍵を置いて、聞かれないようにします。
ここで少し注意事項があります。現在利用しているSSHが環境変数のhomeが設定されていると、そこがホームディレクトリと認識されます。もしないなら、C:/Users/ユーザー名になっているはずなんですが、何故かうまくいかず、結構はまりましたw。
なので、今回は環境変数にhome環境変数を新規に作成しました。
1
home=C:\Users\ユーザー名
などです。こうすると、そこがホームディレクトリになります。
さて、このディレクトリの下に.sshディレクトリを作成してそこに、次のような内容のconfigファイルを作成します。
1
2
3
4
5
6
7
8
9
10
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
そして、
1
2
>ssh vmcentos #パスワードなしでログインできたらOK
$ exit
で、パスワードなしでログインできたらOKです。
ようやくChef
コマンドプロンプトでカレントをC:\vagrant\centos7にしてください。
1
2
3
4
>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 …です。
そこで
1
2
>chef gem install knife-solo
>chef gem install knife-zero
で、インストールされるはずです。
さて、こんな作法が許されるかどうかは知りませんが、とりあえず、このc:\vagrant\centos7ディレクトリ以下にディレクトリを作成して作業を進めます。
1
2
3
>mkdir chef-repo
>cd chef-repo
>knife solo init .
最後のコマンドで色々ファイルやディレクトリが作成されています。そこで
chef-repo/.chef/.knife.rb
というファイルの先頭に
1
local_mode true
を追記します。ローカルモード以外利用しないので、いちいちコマンドラインで–local-modeを引数に渡すのは面倒ですw。
クライアントにChefをインストールする
混乱するのですが、Chefではクライアントがサーバーになります。色々なミドルウェア等をインストールされる側ということで、クライアントというわけです。そのクライアントにもChefをインストールする必要があります(Knife Zeroを利用せず、クライアントで手動でインストールする人もいるみたいです)。
1
>knife zero bootstrap vmcentos -p 2222 -x vagrant --sudo
これがうまくいけばもう少しです。私の場合ここで結構はまりました。
そして、このクライアント(Virtual BoxにインストールされているCentOS)のノード名(インストールしたいサーバーをnodeという)が自動で付いて(指定することもできるらしい)、今回はvmcentosで、実際C:\vagrant\centos7\chef-repo\nodes\vm\vmcentos.jsonというファイルができています。
そして最後に、今回はhttpdをインストールさせるだけなので、次のような作業を行います。
1
>knife cookbook create httpd cookbooks #httpdというレシピの追加
これで作成された、C:\vagrant\centos7\chef-repo\cookbooks\httpd\recipes\default.rbというファイルに次の文言を書き込みます。
1
2
3
4
5
6
7
package 'httpd' do
action :install
end
service "httpd" do
action [:enable, :start]
end
そして、Chefにそのことを教えるために
1
>knife node run_list add vmcentos httpd
を実行します。これはC:\vagrant\centos7\chef-repo\nodes\vm\vmcentos.jsonというファイルの末尾に手動で
1
2
3
"run_list": [
"recipe[httpd]"
]
と書き加えたのと同じ意味です。
これで準備万端。
1
>knife zero chef_client 'name:vmcentos' -x vagrant --sudo -a hostname
これでエラーが起こらなければ、Apacheがインストールされているはずです。
http://192.168.33.11
にアクセすると、下のような画面が出現すれば成功ですw
今回は、動作確認だけでしたが、次はBerkShelfを利用したもう少し高度な方法を試してみます。
おしままい。