この記事は OUCC アドベントカレンダー 2015の3日目の記事です.
昨日は@anonemakiさんによる近況報告でした.明日は@tree0_0treeさんです.
ところで皆さん,
新しいPCを買って開発環境を整えることが面倒だと感じたことはありませんか? PCを複数台持っていて,それぞれで環境が違うことでストレスを感じたことはありませんか? どのPCに何が入っているのか把握したいと思ったことはありませんか?
そんな時に便利なのがChefです. 以下,Chefの紹介です.
Chefとは,システム,インフラ構築を自動化するためのツールです.
従来のインフラ構築方法には,
- 台数が増えると,その分作業に時間がかかる.
- 人が作業するため間違いが生じる.手順を間違えると状態が変わってしまうことも...
- プロジェクトごとに異なる様式で手順書を作成していると,再利用ができず無駄が生じる.
などの問題がありました.
これらの問題を解決するのに考えられたのがコードによるインフラ構築です.先ほどの問題は,
- 台数が増えても,書いたコードを適用するだけなので時間がかからない
- コードで記述した通りに実行されるので,手順を間違える心配がない.同じコードを実行すれば,同じ環境ができる.
- コードで記述されているので再利用が容易.
のように解決されます.
ChefはRubyによって設定を記述でき,シェルスクリプトやデプロイツールなどより柔軟かつ簡潔に書くことができます.
Chefを利用している身近な(?)例としてはFacebookが挙げられます.
ChefはRubyを使って設定を記述します.すでにRubyの経験があれば新たな言語を習得する必要がない点や,Rubyを使った独自の拡張が容易にできるのが特徴です. 宗教上の理由でRubyを書きたくない人も,簡単な制御文程度なので我慢して下さい.
詳しくは公式ドキュメントをご覧下さい.
Chefの動作形態は2種類あります.
- クライアント/サーバ形式
![クライアント/サーバ形式](http://utils.uci-sys.jp/plantuml? @startuml; package Chefサーバ{; object Chef_Server; Chef_Server : Chef_Sever_Web_UI; Chef_Server : Chef_Sever_API; Chef_Server : RabbitMQ; Chef_Server : PostgreSQL; }; package ノード(管理対象サーバ){; object Chef_Client1; object Chef_Client2; object Chef_Client3; }; package ローカル端末{; object knife; }; Chef_Server <|-- Chef_Client1; Chef_Server <|-- Chef_Client2; Chef_Server <|-- Chef_Client3; Chef_Server <|-- knife; @enduml;)
Chef Client側からChef Serverに対して変更がないかを確認し,変更があれば適用する.
また,クックブックの登録を行うローカル端末もChef Clientの1つとなります.
Chefの基本形態で,全体を統合管理するためのChef Serverを1台用意した上で,対象となるノードにはChef Clientをインストールすることになります. Chef Serverは主に情報の管理を行い,ノードにインストールされたChef Clientで設定作業が行われます. この形式では,ノードを一覧で管理したり,適用されている設定情報など様々な情報を確認することが可能です.
- スタンドアロン形式
![スタンドアロン形式](http://utils.uci-sys.jp/plantuml? @startuml; package 対象ノード{; object Chef_Solo; }; package ローカル端末{; object knife; }; Chef_Solo <|-- knife; @enduml;)
1.対象ノードにクックブックなどをアップロードする.
2.ノード上でchef-soloコマンドを実行する.
Chef SoloはChefのスタンドアロン版です. 実行対象となるサーバに直接インストールして,設定内容となるクックブックなどを設置して実行します. この形式では,Chef Serverを必要としないため,小規模な環境で用いるのに適しています.
zsh, vim等をインストールするレシピの作成を例に簡単に説明します.
ruby>=1.9.2
chef
knife-solo
berkshelf
rubyは1.9.2以降でないと動きません.
Chefの構成は, リポジトリ>cookbook>recipeという構成になっています.
knife solo init chef-repo
knife soloコマンドにより,レポジトリの雛形が作成されます.
$ tree chef-repo
chef-repo
├── Berksfile
├── cookbooks
├── data_bags
├── environments
├── nodes
├── roles
└── site-cookbooks
knife cookbook create chef-cookbook -o chef-repo/site-cookbooks/
knife cookbookコマンドによりcookbookの雛形が作成されます.
$ tree chef-repo
chef-repo
├── Berksfile
├── cookbooks
├── data_bags
├── environments
├── nodes
├── roles
└── site-cookbooks
└── chef-cookbook
├── CHANGELOG.md
├── README.md
├── attributes
├── definitions
├── files
│ └── default
├── libraries
├── metadata.rb
├── providers
├── recipes
│ └── default.rb
├── resources
└── templates
└── default
Chefの構文とRubyの制御構文を使って書きます.
変更しやすいように,userはjsonで設定できるようにしています.
プラットホームによって処理を変えることもできます.
only_if
やnot_if
があるものは,条件を満たすときのみ実行されます.
vim chef-repo/site-cookbooks/chef-cookbook/recipes/default.rb
# zshの設定をclone
user = node["chef-repo"]["username"]
git "/home/#{user}/.zsh.d" do
repository "https://github.com/okwrtdsh/zsh.git"
reference "master"
action :sync
user "#{user}"
end
# vimの設定をclone
git "/home/#{user}/.vim" do
repository "https://github.com/okwrtdsh/vim.git"
reference "master"
action :sync
user "#{user}"
end
# zsh, vim, ncurses-termのインストール
%w{zsh vim ncurses-term}.each do |pkg|
package pkg do
action :install
end
end
# zshrc, zshenvの設置
execute "set zshrc" do
command "echo 'source ~/.zsh.d/zshrc' > /home/#{user}/.zshrc"
not_if {File.exists?("/home/#{user}/.zshrc")}
end
execute "set zshenv" do
command "echo 'source ~/.zsh.d/zshenv' > /home/#{user}/.zshenv"
not_if {File.exists?("/home/#{user}/.zshenv")}
end
# vimrc vimrc.localを設置
execute "set vimrc" do
command "cp /home/#{user}/.vim/vimrc /home/#{user}/.vimrc"
end
execute "set vimrc.local" do
command "cp /home/#{user}/.vim/vimrc.local /home/#{user}/.vimrc.local"
end
# ubuntuのみ適用
if node['platform'] == 'ubuntu'
%w{guake pgadmin3}.each do |pkg|
package pkg do
action :install
end
end
# ホームディレクトリ以下を英語に
bash "change Japanese directory name" do
cwd "/home/#{user}"
user "#{user}"
code <<-EOC
LANG=C xdg-user-dirs-update --force
rm -rf テンプレート ドキュメント ピクチャ 公開 ダウンロード デスクトップ ビデオ ミュージック
EOC
only_if {File.exists?("/home/#{user}/デスクトップ")}
end
end
# ログインシェルをzshに
execute "change login shell" do
command "chsh -s `which zsh` #{user}"
end
実行する前に設定ファイルを作成します.
touch chef-repo/config.rb
vim chef-repo/config.rb
cache用のディレクトリ指定とcookbookを配置するディレクトリ指定をします.
file_cache_path "/tmp/chef-solo"
cookbook_path ["/tmp/chef-repo/site-cookbooks"]
実行するクックブックの設定をします.
touch chef-repo/nodes/localhost.json
vim chef-repo/nodes/localhost.json
{
"run_list": [
"chef-cookbook"
],
"chef-repo":{
"username":"user"
}
}
インストールしたいマシンの/tmp/chef-repoにchef-repoを移して,chef-soloコマンドを実行します.
sudo apt-get install chef git
git clone https://github.com/okwrtdsh/chef-repo.git /tmp/chef-repo
sudo chef-solo -c /tmp/chef-repo/config.rb -j /tmp/chef-repo/nodes/localhost.json
これでインストールは終わりです.3分クッキングならぬ3文クッキング!!
一度レシピを作成しておけば,あとは設定ファイルを少し変更する程度で何度でも再利用することができます.
Chefで環境構築を行えば,異なるプラットホームでも同じ環境が簡単に構築でき,時間やストレスはだいぶ軽減されます. 設定ファイル以外は共通なので,設定ファイルのみを管理するだけで全てのマシンの状態が把握でき,管理がとても楽です.
複数マシンを管理する方は,Chefの導入を検討してみては如何でしょうか.
以上,Chefの紹介でした.この記事を書くにあたって,「Chef実践入門(技術評論社)」を参考にしました.また,今回作ったレシピはgithubに上げています.
Rubyは宗教上の理由で書かないため,構文等推奨ではない書き方をしているかもしれませんが,そのあたりはお許し下さい.
OUCCでは月に100時間以上バイトをするような奇特なバイト畜部員を募集しています.
以下,ホームページより抜粋.
OUCCは、複数のIT企業とつながりを持ち、プログラマのアルバイトなどをさせていただいています。
OUCCに入れば、プログラマのアルバイトを紹介してもらえるでしょう。
最近では、C#を用いたソフトの保守・修正やPHPによるWebアプリ製作などを行っています。
詳しくはこちら。
Pythonが書ける2016年度新入生にはオススメのバイト先があります!!
阪大に合格したら私(@okwrtdsh)まで連絡下さい!!
chsh -s `which zsh`
した時にroot権限で実行されているので,root userのshellが変更されていていたのが原因でした.
chsh -s `which zsh` #{user}
userを指定することでログインシェルの変更もできました.
ご指摘ありがとうございました.