tkm9

自分向け技術メモ(?)

Vagrant + Chef + VirtualBox で 開発環境チャレンジ(2)

主に Chef について。

あれこれやんないで、まずはシンプルにレシピを作って適用してみようの回

Chefについて復習

Chef とは、サーバ構築・デプロイを管理・自動化するためのソフトウェア。

Chefの定めるフォーマット(rubyDSL)にて、各サーバがどうあるべきか(どういう設定で何がインストールされて...)といった設定を記述していく。
設定内容はChefサーバに保持され、その管理下に置かれたChefクライアントが定期的にChefサーバに問い合わせ、設定をChefクライアント自身に適用することで、各種設定変更やインストール作業などインフラ系のもろもろ、手順が一元管理できる上に適用を自動化することができる。
Chefクライアントへ設定を適用することは「収束」と表現され、「収束」は、何度実行しても結果が同じくなるという”べき等性”を有する。

Chefの設定の内容は、「リソース」という単位で記述する。
リソースは、実行条件、アクション、通知、属性 を定義したコードのかたまりで、例えば、こんなの。

directory "/tmp/folder" do
  owner 'root'
  group 'root'
  mode '0755'
  action :create
end

これを1こないし複数積み重ねたものが「レシピ」と呼ばれるもので、それの上位に「クックブック」さらにそれの集合が「リポジトリ」となる。
リソース>レシピ>クックブック>リポジトリ という関係。
なお、レシピを適当作ってしまうと前述の「べき等性」が失われるので作るならそのへんを意識する必要がある。

リソースについて参考

なお、Chef は、Chefサーバ・Chefクライアントがセットでの運用となるが、Chef-Zeroというものもあり、こちらを使えば Chef サーバを自身に立ち上げそこ経由で自身(クライアント)に設定を適用してくれる。お手軽を求めるなら Chef-Zero が良さそう。

かんたんなレシピを作る

chef-apply コマンドを使うのが一番お手軽みたい。
Chef が入っているマシンで、chef-apply コマンドを実行すればよい。

レシピを記述したファイルが recipe.rb だとしたら、

chef-apply recipe.rb

としてやればOK。

ゲスト用意

まっさらな CentOS7 を vagrant で用意しておきました。
ここからは、全部ゲスト側のCentOS7での操作です。

chefDK インストール
$ wget https://opscode-omnibus-packages.s3.amazonaws.com/el/6/x86_64/chefdk-0.4.0-1.x86_64.rpm
sudo rpm -ivh chefdk-0.4.0-1.x86_64.rpm
$ chef -v
Chef Development Kit Version: 0.4.0
chef-apply が動くか確認
$ cd /vagrant
$ vi rails_app.rb
  file 'motd' do
    content 'hello world'
  end

$ chef-apply rails_app.rb
Recipe: (chef-apply cookbook)::(chef-apply recipe)
  * file[motd] action create
    - create new file motd
    - update content in file motd from none to b94d27
    --- motd	2015-03-08 03:47:21.000000000 -0400
    +++ ./.motd20150308-7574-1x5883w	2015-03-08 03:47:21.000000000 -0400
    @@ -1 +1,2 @@
    +hello world
    - restore selinux security context

うん、ちゃんと chef-apply rails_app.rb が実行できて、レシピ通りファイルが作成された。

レシピ書いてく

vi rails_app.rb
selinux_config =<<-EOS
  SELINUX=disabled
  SELINUXTYPE=targeted
EOS
file "/etc/selinux/config" do
  content selinux_config
  owner 'root'
  mode '644'
end

bash "selinux off" do
  user "root"
  code 'setenforce 0'
end

%w(yum-fastestmirror git gcc gcc-c++ openssl-devel readline-devel
   libffi-devel python-devel).each do |package_name|
  package package_name do
    action :install
  end
end

service 'iptables' do
  action [:disable, :stop]
end

directory "/usr/local/rbenv" do
  owner  "root"
  action :create
end
git "/usr/local/rbenv" do
  repository "https://github.com/sstephenson/rbenv.git"
  revision   "master"
  user       "root"
  action     :sync
end

directory "/usr/local/rbenv/plugins/ruby-build" do
  owner  "root"
  recursive true
  action :create
end
git "/usr/local/rbenv/plugins/ruby-build" do
  repository "https://github.com/sstephenson/ruby-build.git"
  revision   "master"
  action     :sync
end

rbenv_config =<<-EOS
  export RBENV_ROOT="/usr/local/rbenv"
  export PATH="${RBENV_ROOT}/bin:${PATH}"
  eval "$(rbenv init --no-rehash -)"
EOS
file "/etc/profile.d/rbenv.sh" do
  content rbenv_config
  owner 'root'
  mode '644'
end
bash "rbenv_init" do
  code 'source /etc/profile.d/rbenv.sh'
end

bash "rbenv install 2.2.1" do
  # リソースが変わるとPATHはリセットされてしまうらしい、のでとりあえず毎回sourceしとく
  user   "root"
  code   "source /etc/profile.d/rbenv.sh; rbenv install 2.2.1"
  not_if { ::File.exists? "/usr/local/rbenv/versions/2.2.1" }
end
bash "rbenv rehash" do
  user   "root"
  code   "source /etc/profile.d/rbenv.sh; rbenv rehash"
end
bash "rbenv global 2.2.1" do
  user   "root"
  code   "source /etc/profile.d/rbenv.sh; rbenv global 2.2.1"
end

gem_package 'bundler' do
  gem_binary '/usr/local/rbenv/shims/gem'
  action :install
end

yum_package 'vim' do
  action :remove
end
remote_file "/tmp/vim-7.4.tar.bz2" do
  source "ftp://ftp.vim.org/pub/vim/unix/vim-7.4.tar.bz2"
end
bash 'install_vim' do
  user 'root'
  code <<-EOS
    cd /tmp
    tar jxvf /tmp/vim-7.4.tar.bz2
    cd /tmp/vim74
    ./configure --disable-selinux --enable-multibyte --with-features=huge --enable-rubyinterp --enable-pythoninterp --disable-xsmp-interact --disable-xsmp --without-x --disable-gui
    make
    make install
  EOS
end

で、実行する。

sudo chef-apply rails_app.rb

これで、CentOSのまっさらな状態から以下を自動で実行できます。

  • selinux オフ
  • iptables オフ
  • いくつかのyumパッケージインストール
  • vimインストール
  • rbenvの下での ruby インストール

結構強引な記述もありますがより良い記述が見つかったらこっそり直そうかと思います。

あとは、レシピを1ファイルに書くんじゃなくて cookbook 化して、設定を外出ししたりとかしていけばいいのかな?