ぺーぺーSEのブログ

備忘録・メモ用サイト。

VirturlBox、Vagrant、Chefのまとめ

ドットインストールとかWeb検索で調べたメモ。
現状ガチメモ。たぶん今度まとめ直す。

事前に用語をWeb検索

Vagrantとは?

VirtualBoxのフロントエンドであるVagrantを使用して、仮想OSを作成。
Vagrantは単に仮想OS作成が楽にできるだけでなく、Chef(等の自動設定ツール)と連携して環境構築まで楽にできる。
Chefを使用して、Vagrantで作成した仮想OSにソフトウェアをインストールできる。
vagrant upで起動したとき、Chefを使用して任意のソフトウェアをインストールすることが可能。

Chefとは?

ruby製のサーバの構成管理ツールで、サーバ構築の自動化をしてくれるツール
ソフトウェアのインストールや設定などを設定ファイルに記述しておくことで、サーバをその設定ファイルの状態にしてくれる。
設定ファイルにはサーバのあるべき完成状態を記述し、その差分をChefがうまいこと埋めてくれる感じ。
Chefでよく使用される用語は下記。

  • Client:Chef Serverに接続するもの全て。管理ツール(knife等)もClient
  • Node:Chef Serverに接続するClientの中で、Chefで管理するマシンのこと。NodeはClient
  • Resouce:設定の最小単位。例えば「◯◯をインストールする」とか
  • Recipe:複数のResourceで構成される1つのグループ
  • Cookbook:1つ以上のRecipeをグループとしてまとめたもの
  • Role:どのCookbookをどういう設定で使うかを記述する
  • リポジトリ:Cookbookを入れる場所。Git等でのバージョン管理が推奨される

download:
https://learnchef.opscode.com/quickstart/workstation-setup/#windows

Chef-soloとは?

Chefサーバ無しでレシピを実行することができるツール

knifeとは?

Chefに付属するためのリポジトリ操作ツール
このコマンドを使ってCookbookを作ったり、NodeとRecipeを関連付けたりする。

knife-soloとは?

knifeのプラグイン
これを使用すると、ローカルで作ったRecipeをリモートサーバへ送り、リモートサーバでchef-soloを実行することが可能。

参考:
http://dev.classmethod.jp/tool/vagrant-chef/





VirtualBox

■ツール
CenstOS > iso形式のを入手
	[FTP] ftp.riken.jp
	[ContOS directory] /Linux/contos/5/os/i386
VitrualBox - 仮想化ソフトウェア PCに別OSを入れる
hoster - hostsの書き換えをする
cyberduck - scpツール
ターミナル - teratermとかでいっか

■設定手順
・新規仮想マシンを作成
・CentOSを入れるときはLinuxのRetHatを選択
 # CentOSはRedHat系ない
・設定→ネットワークで、ネットワークの設定を「NAT」から「ブリッジ」へ
・設定→ストレージで、「CD/DVDドライブ」へCentOSのisoを割り当てる
・起動する
・設定時はカスタマイズを選択し、「開発->開発ツール」「ベースシステム->ベース」「言語->日本語おサポート」
・再起動するときはVirtualBoxでインストールメディアを外してから。
	設定→ストレージで、「CD/DVDドライブ」にて仮想ディスクから除去
・最初にパッケージの最新化「yum -y update」
	※実際にはプロキシ等のネットワーク設定をしないとyumは実行できないから注意
・ターミナルから操作できるようにする。
	hosterでVMのIPとエイリアスを関連付け
	sshで上記で設定した名前でアクセス。「ssh -l root [サーバ名]」
・ユーザ作成
	useradd [ユーザ名]
	passwd [ユーザ名]
	usermod -G wheel [ユーザ名]
	visudo
		wheelグル―プの設定のコメントアウトを外す→以降「sudo」「su」可能($は一般ユーザ、#はrootユーザ)
・Webサーバ等のインストール
	「sudo yum -y install httpd」→起動「/sbin/service httpd start」→起動時start「chkconfig httpd on」→パーミッション変更「chwon [ユーザ名] /var/www/html」
	「sudo yum -y install mysql-server」→起動「/sbin/service mysqld start」→起動時start「chkconfig mysqld on」
	「sudo yum -y install php php-devel php-pear php-substring php-gd php-mysql」
・selinuxを無効化
	suで実施
	「setenforce 0」→再起動で元に戻る
	「vi /etc/sysconfig/selinux」にてSELINUXをdisabledにする→再起動で元に戻らない
・iptablesの無効化
	suで実施
	「/sbin/service iptables stop」→再起動で元に戻る
	「chkconfig iptables off」→再起動で元に戻らない→「reboot」で反映
・Cyberduckの設定(サーバではなくクライアント側で使用)
	SFTPで渡す
	「/var/www/html」に置く
・PHPで動かしてみる
	test.php
		<?php
		echo "hey!";
	「/test.php」でアクセス
・PHP5.3のインストール
	既存のphpの削除「sudo yum -y remove php*」
	「sudo yum -y install php53 php53-devel php53-pear php53-substring php53-gd php53-mysql」




Vagrant

仮想マシンを簡単に立ち上げるツール(当時v1.2.3)
<www.vagrantup.com>
VirturlBox / VMware / EC2等で使用可能

1.Box(テンプレート)を取得する
	公式のgettint started -> Boxes
	「vagrant box list」
	vagrantbox.esから入手できる(有志、非公式)→「vagrant box add centos64 http://dovelopper.nrel.gov/...」
	「[home]/vagrant.d/boxes」に入ってる
2.仮想マシンを初期化
	1つのテンプレートから仮想マシンをいくつでも作れる
	・仮想マシン用のディレクトリを作成「mkdir myCentOSVM」「cd myCentOSVM」
	・仮想マシンを初期化「vagrant init centos64」
	・「Vagrantfile」というファイルができRuby形式で仮想マシンの設定が可能
	・「Vagrantfile」があるディレクトリで「vagrant up」と打つと仮想マシンを起動することができる
		→VirtualBoxから見ることができる
3.仮想マシンを操作
	vagrantコマンド -> 「Vagrantfile」があるディレクトリで「vagrant [コマンド名]」と打つ
		状態を確認:staus
		再起動:suspend
		元に戻す:resume
		停止する:halt
		起動する:up
		再起動:reload
		仮想マシンを削除:destroy
		接続:ssh
		プロビジョニング実行:provision
	network設定→3つ方法があるが、ここではその1つ
		Vagrantfileに「config.vm.network :private_network, ip: "IPアドレス"」を設定する
		「vagrant reload」
		ブラウザから設定したIPを除いてみる(ただしApacheとか立ち上げておく必要がある)
	vagrant共有フォルダ
		クライアントマシンの「myCentOSVM」と「vagrant ssh」した後の「[ホーム]/vagrant」というディレクトリは共有されている
		「ln -fs /vagrant /var/www/html」とシンボリックリンクを張るとクライアントからファイルを直置き直見できる

■Provisioning(vagrant upしたときに行われる一連の操作)Chef、Puppetも使えるが今回はシェルでやる方法
	mkdir myCentOSMV2
	cd myCentOSVM2
	vagrant init centos64
	vi Vagrantfile
		config.vm.provision :shell, :inline => "echo hello world" → vagrant upでechoされる
		config.vm.provision :shell, :path => "provision.sh" → シェルの実行が可能
	「vagrant provision」でProvisioningだけの実行が可能

■Boxを作成
	今動いている仮想マシンをBoxにする方法「vagrant package」
	package.boxができる
	「vagrant box add my_box package.box」でBoxに追加できる
	「vagrant.d/boxes」にできる

■pluginを使う
vagrant plugin install sahara(サンドボックスモードをサポートしてくれる)
vagrant plugin -h(ヘルプ)
vagrant plugin list
vagrant plugin uninstall sahara
vagrant plugin list




Chef

インフラをコードで記述するツール
<www.opscode.com>

■概要
WORKSTATION(クライアント)にてcookbookを作成し、
knifeコマンドを使用してCHEF SERVER(サーバ)にcookbookを転送し、
CHEF SERVERにて対応のNODEに設定を割り当てる。

ruby、gemを使用する。
※gem・・・RubyのパッケージシステムRubyGemsのコマンド名。またはRubyGemsで管理されるそれぞれのライブラリ/アプリケーションのこと。

1.Chef導入
	公式参照
2.knife-soloの導入
	「sudo gem install knife-solo」でインストール
	「gem list」で確認
3.knife configure
	「knife configure」で設定実行
4.Nodeの設定(Vagrantの仮想マシン)
	「vagrant init centos64」
	「vi Vagrantfile」
		config.vm.network :private_network, ip: "[IPアドレス]"
	「vagrant up」
	「vagrant status」で確認
	「vagrant ssh-comfig --host [ホスト名] >> ~/.ssh/config」でIPではなくホスト名でアクセス可能
5.Chefリポジトリ作成
	「knife solo init [リポジトリ名]」を実行
		[リポジトリ名]のディレクトリ - cookbooks/
		                             - data_bags/
		                             - nodes/
		                             - roles/
		                             - site-cookbooks/
		                             - solo.rb
		「site-cookbooks」と「nodes」を使用
		※「cookbooks」はネットで配布されているcookbookを入れ、自分では変更しないのが慣習
6.NodeをChef対応にする
	「cd [リポジトリのディレクトリ]」
	「knife solo prepare [ホスト名]」でNodeをChef対応にする
7.Cookbookを作る
	「cd [リポジトリのディレクトリ]」
	「knife cookbook create [cookbook名] -o site-cookbooks/」
		[cookbook名]のディレクトリ - attributes/
		                           - CHANGELOG.md
		                           - definitions/
		                           - files/
		                           - libraries/
		                           - metadata.rb
		                           - providers/
		                           - README.md
		                           - recipes/
		                           - resources/
		                           - templates/
		「recipes」を使用(default.rbがある)
	default.rbを編集
		log "Hello world"
8.CookbookをNodeに反映させる
	「nodes」の中の[ホスト名].jsonを編集する
		{
		    "run_list":[
		        "recipe[「cookbook名(recipe名?)」]"
		    ]
		}
	「knife solo cook [ホスト名]」→ログでHello worldが出る
・packageでvimを導入してみる
	「default.rb」を編集
		package "vim-enhanced" do
		    action :install
		end
	「knife solo cook [ホスト名]」で導入される(既に導入されている場合はそれを検出して導入しない)
・Resourceを確認
	前回の
		package "vim-enhanced" do
		    action :install
		end
	のようなものをChefではResourceと呼ぶ
	公式でその他のResourceについては確認可能(今回使ったのはpackage)
・serviceでiptablesを操作してみる
	普通にコマンドで打つと「service iptables stop」だが、ChefのResourceでは下記のようになる
		service "iptables" do
		    action :stop
		end
	「knife solo cook [ホスト名]」で実行
	実行後「sudo service iptables status」で確認
	「chkconfig iptables off」も同時に反映させたい場合は下記
		service "iptables" do
		    action [:stop, :disable]
		end
・複数のpackageを導入してみる
	rubyの文法が使用できるので下記のような書き方が可能
		%w{php mysql-server httpd}.each do |p|
		    package p do
		        action :install
		    end
		end
		service "httpd" do
		    action [:start, :enable]
		end
・templateを使ってみる
	recipeの書き方は下記
		template "index.html" do
		    path "/var/www/html/index.html"
		    source "index.html.erb"
		    mode 0644
		end
	「site-cookbooks/[cookbook名]/templates/default/」の中に「index.html.erb」を保存する
	「knife solo cook [ホスト名]」で「index.html.erb」がホストへ転送される
	「erb」はrubyの代表的なテンプレートエンジン
・templateで変数を使ってみる
	■方法1
	key-value形式で[ホスト名].jsonに覚えさせる
		{
		    "owner": {
		        "name": "HogeHoge"
		    },
		    "run_list":[
		        "recipe[「cookbook名(recipe名?)」]
		    ]
		}
	「index.html.erb」で下記のように参照できる
		<html>
		Hello from Chef! created by <%= node['owner']['name'] %>.
		</html>
	「knife solo cook [ホスト名]」で反映される。
	■方法2
	Chefの機能でohaiというものがあり、実行時のデータを記憶している
	「ohai」とうつとjson形式で出てくる
	例えば「ohai platform」と打つとos名が出てくる
	「index.html.erb」でplatformを参照するには下記のように書く
		<html>
		Hello from <%= node[:platform] %>! created by <%= node['owner']['name'] %>.
		</html>
・Webサーバの設定を変えてみる
	サーバ上の「httpd.conf」をChefリポジトリの「templates/default」に持ってきて「httpd.conf.erb」とリネームしてテンプレート化する
	recipeを下記のように書く
		template "httpd.conf" do
		    path "/etc/httpd/conf/httpd.conf"
		    source "httpd.conf.erb"
		    mode 0644
		end
	「httpd.conf.erb」のListenにおいてリッスンポートをtemplete変数化してみる
		Listen <%= ndoe['httpd"]['port'] %>
	[ホスト名].jsonに下記を追記する
		"httpd": {
		    "port": 80
		}
	「knife solo cook [ホスト名]」で反映される。
・notifiesを使ってみる
	httpd.confを変更するとrestartが必要となるためnotifiesを使う
		template "httpd.conf" do
		    path "/etc/httpd/conf/httpd.conf"
		    source "httpd.conf.erb"
		    mode 0644
		    notifies :restart, 'service[httpd]'
		end

ツール選択の勘所を掴むためのメモ

■Chef?bashスクリプト?
手順をbashスクリプト化してる場合との比較だと、
・"レシピ"という共通な言語による可読性の高さ
・"レシピ"を何回実行してもエラーにならず、実行後のサーバーは同じ状態になる
というところが利点。

■Chef Server?Chef Solo?
下記の理由に当てはまるならChef Soloがよい。
・Vagrantと組み合わせる
・導入するサーバーが数台程度
・Chef Serverをインストールしておけるサーバーが無い

■Chef Solo?Knife Solo?
Chef Soloだと、cookbookファイルを置いたサーバーに対してセットアップが実行される。
別のサーバーにセットアップをしたい場合、
 cookbookファイル一式を手動で転送 → 別サーバーにログインしてChef Soloを実行
する必要がある。
上記作業を自動でやってくれるのがKnife Soloで、Chef Soloを便利に使えるようにするツールという解釈。

参考:
http://ch.nicovideo.jp/dwango-engineer/blomaga/ar311555