Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?

開発環境を3文クッキング

はじめに

この記事は OUCC アドベントカレンダー 2015の3日目の記事です.

昨日は@anonemakiさんによる近況報告でした.明日は@tree0_0treeさんです.

ところで皆さん,

新しいPCを買って開発環境を整えることが面倒だと感じたことはありませんか? PCを複数台持っていて,それぞれで環境が違うことでストレスを感じたことはありませんか? どのPCに何が入っているのか把握したいと思ったことはありませんか?

そんな時に便利なのが***Chef***です. 以下,Chefの紹介です.

Chefとは

Chefとは,システム,インフラ構築を自動化するためのツールです.

従来のインフラ構築方法には,

  1. 台数が増えると,その分作業に時間がかかる.
  2. 人が作業するため間違いが生じる.手順を間違えると状態が変わってしまうことも...
  3. プロジェクトごとに異なる様式で手順書を作成していると,再利用ができず無駄が生じる.

などの問題がありました.

これらの問題を解決するのに考えられたのがコードによるインフラ構築です.先ほどの問題は,

  1. 台数が増えても,書いたコードを適用するだけなので時間がかからない
  2. コードで記述した通りに実行されるので,手順を間違える心配がない.同じコードを実行すれば,同じ環境ができる.
  3. コードで記述されているので再利用が容易.

のように解決されます.

Chefは***Ruby***によって設定を記述でき,シェルスクリプトやデプロイツールなどより柔軟かつ簡潔に書くことができます.

Chefを利用している身近な(?)例としてはFacebookが挙げられます

特徴

Rubyを使って設定を記述する

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

cookbookの作成

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

recipeの作成

Chefの構文とRubyの制御構文を使って書きます. 変更しやすいように,userはjsonで設定できるようにしています. プラットホームによって処理を変えることもできます. only_ifnot_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"
  }
}

chef-soloの実行

インストールしたいマシンの/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

chef-solo_result.png

これでインストールは終わりです.3分クッキングならぬ3文クッキング!!

一度レシピを作成しておけば,あとは設定ファイルを少し変更する程度で何度でも再利用することができます.

まとめ

Chefで環境構築を行えば,異なるプラットホームでも同じ環境が簡単に構築でき,時間やストレスはだいぶ軽減されます. 設定ファイル以外は共通なので,設定ファイルのみを管理するだけで全てのマシンの状態が把握でき,管理がとても楽です.

複数マシンを管理する方は,Chefの導入を検討してみては如何でしょうか.

以上,Chefの紹介でした.この記事を書くにあたって,「Chef実践入門(技術評論社)」を参考にしました.また,今回作ったレシピはgithubに上げています.

Rubyは宗教上の理由で書かないため,構文等推奨ではない書き方をしているかもしれませんが,そのあたりはお許し下さい.

宣伝

OUCCでは月に100時間以上バイトをするような奇特なバイト畜部員を募集しています.

以下,ホームページより抜粋.

OUCCは、複数のIT企業とつながりを持ち、プログラマのアルバイトなどをさせていただいています。
OUCCに入れば、プログラマのアルバイトを紹介してもらえるでしょう。
最近では、C#を用いたソフトの保守・修正やPHPによるWebアプリ製作などを行っています。
詳しくはこちら

最後に

**Pythonが書ける2016年度新入生にはオススメのバイト先があります!!

阪大に合格したら私(@okwrtdsh)まで連絡下さい!!

Owner

okwrtdsh commented Dec 2, 2015

chsh -s `which zsh`

した時にroot権限で実行されているので,root userのshellが変更されていていたのが原因でした.

chsh -s `which zsh` #{user}

userを指定することでログインシェルの変更もできました.
ご指摘ありがとうございました.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment