chefとかvagrantとかfabricとか

chefを使いそうなのでその辺素振りしてみる。

chefの前にまずvagrantvirtualboxをそれぞれダウンロードしてインストール

  • Boxファイルの追加
$ vagrant box add centos63 https://dl.dropbox.com/u/7225008/Vagrant/CentOS-6.3-x86_64-minimal.box
$ vagrant init centos63
$ vagrant box list
centos63       (virtualbox)
$ vagrant plugin install sahara
$ vagrant plugin list
sahara (0.0.16)
  • sandbox on
$ vagrant sandbox on
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
$ vagrant sandbox status
[default] Sandbox mode is on
  • ゲストOSの起動
$ vagrant up
$ vagrant ssh
[vagrant@localhost ~]$
  • ~/.ssh/configへの追加
$ vagrant ssh-config --host host1 >> ~/.ssh/config
$ ssh host1
[vagrant@localhost ~]$

これでvagrantの準備は整ったのでホストOS側でchef環境を整備する。

chefはrubyで出来ていてgemでインストール出来るんだけどsystem rubyを使うのもアレだしrbenvでも良いんだけどrbenv rehashとか忘れそうなのでxbuild使ってみる。

  • xbuild install
$ git clone https://github.com/tagomoris/xbuild.git
  • xbuildでruby-1.9.3-p448をinstall
$ xbuild/ruby-install 1.9.3-p448 ~/local/ruby-1.9.3-p448
$ export PATH=.../local/ruby-1.9.3-p448/bin:$PATH
  • chefとknife-soloのinstall
$ gem install chef
$ gem instll knife-solo
  • knifeの初期設定
$ knife configure
$ knife solo init chef-repo
$ cd chef-repo/
$ ls
cookbooks	data_bags	environments	nodes		roles		site-cookbooks
  • knife soloの準備
$ knife solo prepare host1
Bootstrapping Chef...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
101  6790  101  6790    0     0   1137      0  0:00:05  0:00:05 --:--:-- 19738
Downloading Chef 11.8.0 for el...
Installing Chef 11.8.0
警告: /tmp/tmp.i3lCsktz/chef-11.8.0.x86_64.rpm: ヘッダ V4 DSA/SHA1 Signature, key ID 83ef826a: NOKEY
準備中...                ########################################### [100%]

これでゲストOSでchef-solo が実行できるようになる。

  • phpをinstallするレシピを作成してみる
$ knife cookbook create php -o site-cookbooks
** Creating cookbook php
** Creating README for cookbook: php
** Creating CHANGELOG for cookbook: php
** Creating metadata for cookbook: php
  • site-cookbooks/php/recipes/default.rb
package "php" do
  action :install
end
{
  "run_list": [
    "recipe[php]"
  ]
}
  • レシピを実行してゲストOSにphpをinstallしてみます。
$ knife solo cook host1
Running Chef on host1...
Checking Chef version...
Uploading the kitchen...
Generating solo config...
Running Chef...
Starting Chef Client, version 11.8.0
Compiling Cookbooks...
Converging 1 resources
Recipe: php::default
  * package[php] action install
    - install version 5.3.3-23.el6_4 of package php

Chef Client finished, 1 resources updated

再度実行しても冪等性があるのでもう1回installされることはありません。

$ knife solo cook host1
Running Chef on host1...
Checking Chef version...
Uploading the kitchen...
Generating solo config...
Running Chef...
Starting Chef Client, version 11.8.0
Compiling Cookbooks...
Converging 1 resources
Recipe: php::default
  * package[php] action install (up to date)
Chef Client finished, 0 resources updated

そうすると

[vagrant@localhost ~]$ php -v
-bash: php: コマンドが見つかりません

だったものが下記のようになります。

[vagrant@localhost ~]$ php -v
PHP 5.3.3 (cli) (built: Jul 12 2013 20:35:47)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
  • 変更をcommitしてみます。
$ vagrant sandbox commit
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%

rollbackも試してみます。
ゲストOSの/tmpを削除してみます。

[vagrant@localhost ~]$ sudo rm -rf /tmp
[vagrant@localhost ~]$ ls /
bin  boot  cgroup  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  sbin  selinux  srv  sys  usr  vagrant  var

rollbackします。

$ vagrant sandbox rollback
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%

/tmpが復活してますね。

[vagrant@localhost ~]$ ls /
bin  boot  cgroup  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  sbin  selinux  srv  sys  tmp  usr  vagrant  var

ミドルウェアのインストールはchefで良いと思いますがアプリケーションのdeployなんかはchefじゃなくてデプロイツールを使うかもしれません。
なのでcapistranoを調べようかと思いましたが下記の理由からカジュアルに試すにはちょっとつらそうだったので以前触ったことあるpython製のfabricを試します。

  • ちょっと重厚な気がした
  • ver 3系とver 2系があってネットにはその辺の情報が混在している感じ

system python使うのもアレだしpythonbrewしてほげほげするのもアレなのでxbuildでpythonをインストールしてみる。

$ xbuild/python-install 2.7.5 ~/local/python-2.7.5
$ export PATH=.../local/python-2.7.5/bin:$PATH
  • setuptoolsのinstall
$ wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py
$ python ez_setup.py
  • fabricのinstall
$ easy_install fabric
  • fabfile.py
from fabric.api import run

def host_type():
        run("uname -s")

しかし実行するとエラー

$ fab -H host1 host_type
[host1] Executing task 'host_type'
[host1] run: uname -s

Fatal error: Name lookup failed for host1

Underlying exception:
    nodename nor servname provided, or not known

Aborting.

どうも~/.ssh/configを見れていないようでググってみると以下のようにすればいいらしい。

from fabric.api import env,run

env.use_ssh_config = True

def host_type():
        run("uname -s")

実行するとできた。

$ fab -H host1 host_type
[host1] Executing task 'host_type'
[host1] run: uname -s
[host1] out: Linux
[host1] out:


Done.
Disconnecting from vagrant@127.0.0.1:2222... done.

ついでにfabricのwebフロント版auroraなるものを試そうとしたんだけどドキュメントがほとんどないしエラーが出たりとちょっと使うのは厳しい感じ。

https://github.com/ak3n/aurora

capistranoだとwebistranoなるものがあるようだけどこちらは更新が止まっている感じ

https://github.com/peritor/webistrano


参考にしたもの

Vagrant入門ガイド

Vagrant入門ガイド

入門Chef Solo - Infrastructure as Code

入門Chef Solo - Infrastructure as Code