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