- 更新日: 2014年7月9日
- Vagrant & Chef
VagrantでChefを試しサーバーに適用するまでの流れ
これまでに行った Vagrant + Chef による作業の流れをまとめました(ほぼ自分用に)。Cookbook, Recipe を独自に作成したり、コミュニティの Cookbook を利用する方法、また最後のほうで実際のサーバーに Cookbook, Recipe を適用させる場合について少し記述しています。
以下エントリー達の要約となりますが、整理してまとめたり作業の順序を入れ替えている箇所があります。
1. MacにVagrantとVirtualBoxをインストール | EasyRamble
2. Chef超入門、Chef-soloでVagrant上の仮想マシンのCentOSにGitをインストールするとこまで | EasyRamble
3 .ChefコミュニティのCookbookでサーバー構成管理 | EasyRamble
4 .ChefでCookbook, Recipeを独自に作成 | EasyRamble
Vagrant で VM を用意
Vagrant と VirtualBox をあらかじめインストールしておく。詳細は、MacにVagrantとVirtualBoxをインストール | EasyRamble を参照。
OS の基礎となる Box をインストール。
1 2 3 |
$ vagrant box add centos64 http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20131103.box |
仮想マシン用の作業ディレクトリを作成して移動。
1 2 3 4 |
$ mkdir -p ~/Vagrant/CentOS64 $ cd ~/Vagrant/CentOS64 |
Vagrantfile 作成。
1 2 3 |
$ vagrant init centos64 |
ネットワーク設定。
1 2 3 4 |
$ vi Vagrantfile config.vm.network "private_network", ip: "192.168.33.10" |
VM 起動。
1 2 3 |
$ vagrant up |
その他の vagrant コマンド → MacにVagrantとVirtualBoxをインストール | EasyRamble
Bundler で chef, berkshelf, knife-solo をインストール
1 2 3 4 5 6 7 8 9 10 |
$ bundle init $ vi Gemfile source "https://rubygems.org" gem "chef" gem "berkshelf" gem "knife-solo" $ bundle install --path vendor/bundle |
knife solo コマンドで Chef リポジトリを作成
knife solo init で Chef リポジトリを作成します。
1 2 3 |
$ bundle exec knife solo init . |
以下が追加される。
1 2 3 4 5 6 7 8 9 10 |
├── .chef ├── .gitignore - git管理しないファイル・ディレクトリを指定 ├── cookbooks - コミュニティのクックブックを配置 ├── data_bags - Chefのデータ格納場所 ├── environments - Chefの環境ごとの設定 ├── nodes - Chefの設定先サーバーごとの設定 ├── roles - Chefのレシピを役割毎にまとめる ├── site-cookbooks - 独自カスタマイズのクックバックを配置 |
git 管理にする。
1 2 3 4 5 6 7 8 9 10 11 |
$ vi .gitignore /.bundle/ /.chef/ /.vagrant/ /cookbooks/ /vendor/ $ git init $ git add . $ git commit -m "Inital commit" |
独自の Cookbook, Recipe を作成
cookbook の雛形を site-cookbooks 以下に作成。
1 2 3 |
$ bundle exec knife cookbook create -o site-cookbooks railsapp_cookbook |
metadata.rb の編集。
1 2 3 |
$ vi site-cookbooks/railsapp_cookbook/metadata.rb |
Recipe 作成。user を追加するレシピの例。
site-cookbooks/railsapp_cookbook/recipes/user_ops.rb
1 2 3 4 5 6 7 8 9 |
# Cookbook Name:: railsapp_cookbook # Recipe:: user_ops user 'ops' do action :create supports :manage_home => true home "/home/ops" shell "/bin/bash" end |
Vagrantfile に Recipe 追加の設定。
Vagrantfile
1 2 3 4 5 6 7 8 9 |
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| # ... config.vm.provision :chef_solo do |chef| chef.cookbooks_path = ["./cookbooks", "./site-cookbooks"] chef.add_recipe 'railsapp_cookbook::user_ops' end # ... end |
上記ファイル編集の詳細は、ChefでCookbook, Recipeを独自に作成 | EasyRambleを参照。
プロビジョニング実行。
1 2 3 4 5 |
$ vagrant reload $ vagrant provision $ vagrant ssh |
ユーザーが追加されたことを確認します。
コミュニティの Cookbook を使う場合は Berkshelf で管理
Berkshelf で Git の Cookbook を追加。Berksfile に追加する Cookbook を書きます。
Berksfile
1 2 3 |
source 'https://api.berkshelf.com' cookbook 'git' |
Cookbook をインストール。
1 2 3 |
$ bundle exec berks vendor cookbooks |
確認。
1 2 3 |
$ bundle exec berks list |
Vagrantfile に Git のレシピを追加。
Vagrantfile
1 2 3 4 5 6 7 8 9 10 11 |
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| # ... config.vm.provision :chef_solo do |chef| chef.cookbooks_path = ["./cookbooks", "./site-cookbooks"] chef.add_recipe "git" end # ... end |
プロビジョニング実行。
1 2 3 4 5 |
$ vagrant reload $ vagrant provision $ vagrant ssh |
Git がインストールされたことを確認します。
実際のサーバーに Cookbook, Recipe を適用する
knife solo bootstrap コマンドで、nodes/www.example.com ファイルを生成。
1 2 3 |
$ bundle exec knife solo bootstrap username@www.example.com |
作成された nodes/www.example.com ファイルに、run_list を書く。
そして、knife solo cook コマンドで、サーバーに適用。
1 2 3 |
$ bundle exec knife solo cook username@www.example.com |
実際にサーバーに適用する作業の詳細は、また後日書こうと思います。
- Vagrant & Chef の関連記事
- Vagrantで使うVirtualBoxのVM(仮想マシン)を外付けHDDに移動
- Chefで/etc/sysctl.confのkernel.panicを設定
- Chefでtelnetをインストール
- Chefでyumリポジトリを追加する設定
- Chef で iptables の設定
- ChefでSSH接続用の公開鍵をサーバーに設置
- nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
- Chef Recipe でユーザー・グループを作成
- Chef Recipe で CentOS のネットワーク・ホストを設定
- NetworkManager 他不要なパッケージを削除する Chef Recipe
Leave Your Message!