VMの自動構成にはChef(とその仲間達)を使うといいみたいです。

chef関連の情報はググると色々でてきますが、chef自体の変化が激しいようなので情報錯綜気味です。

公式もあてにならなかったりします。

そんな中こちらとかこちらを参考にさせていただきました。

Chefツール群

よくわからないツール・コンポーネントがたくさん。

ChefDK

Chef

インフラをコードで書こうってコンセプトの自動構成ツール。コードのまとまりをcookbookと呼ぶらしい
berkshelf
cookbookのライブラリを管理するツール
knife
chefの管理コマンド
Vagrant Plugin

vagrant-omnibus

VMにchefをセットアップしてくれるvagrantプラグイン
vagrant-berkshelf
“Berkshelf integration to the Chef provisioners”だそうで、なんかvagrantでいい感じにBerkshelf使えるようにしてくれるみたいです。(理解不足)

いらないっぽい。

その他

knife solo

chefレポジトリの雛形作るときに使用します。他にもいろいろ便利なツールらしいです。knifeのプラグイン
bundler
ruby-gem のライブラリ構成管理ツール

それぞれインストールします。

Chef + berkshelf

berkshelfのページによりますと、Chef-DKをインストールすればよさそうです。

Chef-DKのMAC OS Xからdmgをダウンロードしてpkgでインストール。

pkg後にも色々設定が必要なようです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#インストールチェック
Mac ~$chef verify
#rubyをChefDK付属のものと使うようにする(やらなくてもいいかも?)
Mac ~/vagrant/testvm/myapp$which ruby
/usr/bin/ruby
Mac ~$echo 'eval "$(chef shell-init bash)"' >> ~/.bash_profile
Mac ~$source ~/.bash_profile
Mac ~$which ruby
/opt/chefdk/embedded/bin/ruby
#knife初期設定。
Mac ~$knife configure

rubyを指定のものにしとかないといけないようですが、なんかイケてないような気がします。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#Chefは色々なコマンドの集合みたいですが、代表選手はknife
Mac ~$knife --version
Chef: 12.0.3
#berkshelfもインストールされています
Mac ~$berks --version
3.2.3
#/usr/bin/から/opt/chefdkにリンクされているようです。
Mac ~$ls -la /usr/bin/ | grep "chef"
lrwxr-xr-x     1 root   wheel        21  3 19 10:00 berks -> /opt/chefdk/bin/berks
lrwxr-xr-x     1 root   wheel        20  3 19 10:00 chef -> /opt/chefdk/bin/chef
lrwxr-xr-x     1 root   wheel        26  3 19 10:00 chef-apply -> /opt/chefdk/bin/chef-apply
lrwxr-xr-x     1 root   wheel        27  3 19 10:00 chef-client -> /opt/chefdk/bin/chef-client
lrwxr-xr-x     1 root   wheel        26  3 19 10:00 chef-shell -> /opt/chefdk/bin/chef-shell
lrwxr-xr-x     1 root   wheel        25  3 19 10:00 chef-solo -> /opt/chefdk/bin/chef-solo
lrwxr-xr-x     1 root   wheel        25  3 19 10:00 chef-zero -> /opt/chefdk/bin/chef-zero
lrwxr-xr-x     1 root   wheel        23  3 19 10:00 fauxhai -> /opt/chefdk/bin/fauxhai
lrwxr-xr-x     1 root   wheel        26  3 19 10:00 foodcritic -> /opt/chefdk/bin/foodcritic
lrwxr-xr-x     1 root   wheel        23  3 19 10:00 kitchen -> /opt/chefdk/bin/kitchen
lrwxr-xr-x     1 root   wheel        21  3 19 10:00 knife -> /opt/chefdk/bin/knife
lrwxr-xr-x     1 root   wheel        20  3 19 10:00 ohai -> /opt/chefdk/bin/ohai
lrwxr-xr-x     1 root   wheel        23  3 19 10:00 rubocop -> /opt/chefdk/bin/rubocop
lrwxr-xr-x     1 root   wheel        20  3 19 10:00 shef -> /opt/chefdk/bin/shef
lrwxr-xr-x     1 root   wheel        22  3 19 10:00 strain -> /opt/chefdk/bin/strain
lrwxr-xr-x     1 root   wheel        24  3 19 10:00 strainer -> /opt/chefdk/bin/strainer

knife solo

1
Mac ~$gem i knife-solo --no-ri --no-rdoc

“knife solo”コマンドが無いみたいなこと言われたら、ターミナル再起動で動くこともあるみたいです。

vagrantプラグイン

1
Mac ~$vagrant plugin install vagrant-omnibus

bundler

すでにインストール済みな場合が多いかも。

1
2
3
4
Mac ~$sudo gem update
Mac ~$sudo gem install bundler
Mac ~$bundle -v
Bundler version 1.8.5

VMの作成

前回作成したVMだとchefがすでに入ってて、動作検証には向かない気がするので、新たなboxからVMを作成します。

いちばんメジャーっぽいchef/centos-6.5を使用します。

1
2
3
4
5
Mac ~$vagrant box add chef/centos-6.5 --provider virtualbox --insecure
Mac ~$mkdir ~/vagrant/testvm
Mac ~$cd ~/vagrant/testvm
Mac ~/vagrant/testvm$vagrant init chef/centos-6.5
Mac ~/vagrant/testvm$vagrant up

VMにchefとネットワーク設定

Vagrantfileに

config.omnibus.chef_version = :latest

config.vm.network

を追加します。

```bash Mac ~/vagrant/testvm$ cat Vagrantfile

-- mode: ruby --

vi: set ft=ruby :

Vagrant.configure(2) do |config| config.vm.box = “chef/centos-6.5” config.omnibus.chef_version = :latest # Create a private network, which allows host-only access to the machine # # using a specific IP. config.vm.network “private_network”, ip: “192.168.33.10”

end

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
        #### sshのconfig設定

        vagrant sshでなくてsshからお手軽にアクセスできるよう設定します。

        ```bash
#~/.ssh/config設定
Mac ~/vagrant/testvm$ vagrant ssh-config --host testvm >> ~/.ssh/config
#スカッとアクセスできるようになります
Mac ~/vagrant/testvm$ ssh testvm
Last login:  from 10.0.2.2
[vagrant@localhost ~]$
1
2
3
    後でcookするときにrsyncが必要になります。なんか本末転倒のようきがするけどyumでインストールします。

    ```bash

Mac ~/vagrant/testvm$ ssh testvm [vagrant@localhost ~]$ sudo yum install rsync

1
2
3
4
        ### chefレポジトリ作成

        ```bash
Mac ~/vagrant/testvm$ knife solo init chef-repo
1
2
3
4
5
6
7
8
9
    ### テスト用cookbookを作る

    #### テスト用cookbook

    helloという名前のcookbookを作ります。

    独自のcookbookはsite-cookbooksに作るお作法みたいです。

    ```bash

Mac ~/vagrant/testvm$ cd chef-repo/ Mac ~/vagrant/testvm/chef-repo$ knife cookbook create hello -o site-cookbooks/ Mac ~/vagrant/testvm/chef-repo$ vim site-cookbooks/hello/recipes/default.rb Mac ~/vagrant/testvm/chef-repo$ cat site-cookbooks/hello/recipes/default.rb log “hello world”

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
        #### node定義

        cookbookを作ったら、node定義を作らなきゃいけないようです。なんか面倒っすね。

        run_listの書き方とかよくわからんし。

        ```bash
#node定義作成
Mac ~/vagrant/testvm/chef-repo$ knife node create testvm -e vim -z
Mac ~/vagrant/testvm/chef-repo$ knife node list -z
testvm
Mac ~/vagrant/testvm/chef-repo$ ls nodes/
testvm.json
Mac ~/vagrant/testvm/chef-repo$ cat nodes/testvm.json
{
  "name": "testvm",
  "run_list": [
    "recipe[hello]"
  ]
}
1
2
3
4
5
    #### cookbook適用

    cookbookをnodeに適用します

    ```bash

Mac ~/vagrant/testvm/chef-repo$ knife solo cook testvm nodes/testvm.json

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
        ### Berkshelfでcookbook

        Berkshelfのパッケージをセットアップするcookbookを作ります。

        とは言っても、”knife solo init chef-repo”でつくられるBerksfileを編集してcookすればOKみたい。

        ```bash
#Berksfile編集
Mac ~/vagrant/testvm/chef-repo$ vim Berksfile
Mac ~/vagrant/testvm/chef-repo$ cat Berksfile
#site :opscode  #もう古いらしい
source "https://supermarket.chef.io"

#metadata  #これあるとエラーが出るので無しで

cookbook 'nodejs'
cookbook 'mongodb'
1
2
3
    #### node定義編集

    ```bash

Mac ~/vagrant/testvm/chef-repo$ vim nodes/testvm.json Mac ~/vagrant/testvm/chef-repo$ cat nodes/testvm.json { “name”: “testvm”, “run_list”: [ “recipe[hello]“, “recipe[nodejs]“, “recipe[mongodb]” ] }

1
2
3
4
        #### レシピゲット and 適用

        ```bash
Mac ~/vagrant/testvm/chef-repo$ knife solo cook testvm nodes/testvm.json
1
2
3
4
5
6
7
    これだけでcookbooksフォルダが作られて、各種cookbookが持ってこられます。

    なぜBerksfile編集するだけで上手い事いくのか?

    よくわからんですけどchef/knife.rb に定義済みだからだと思われます。

    ```bash

Mac ~/vagrant/testvm/chef-repo$ cat .chef/knife.rb cookbook_path [“cookbooks”, “site-cookbooks”] node_path “nodes” role_path “roles” environment_path “environments” data_bag_path “data_bags” #encrypted_data_bag_secret “data_bag_key”

knife[:berkshelf_path] = “cookbooks”

1
2
3
4
5
6
        うまくいくとインストールされます。

        ```bash
Mac ~/vagrant/testvm$ ssh testvm
[vagrant@localhost ~]$ node -v
v0.10.33
1
2
3
4
5
6
7
8
9
    ### まとめ

    明らかに理解不足です。

    つーか、情報が古かったり纏まってなかったりして、けっこうハマりポイントが多いとおもいます。

    わかっちゃえば、な〜んだって事でも、なかなか正解がわからない感じです。

    ただ、vagrantで気軽に仮想環境を作ったり壊したりできるので思い切っていろいろ試せるのはいいですね。