vagrant chef knife soloを使用してvirtualbox上の仮想サーバーにnginxをインストールしてみる

今回は最近学んだプロビジョニングの知識を生かして、実際にnginxをvagrantで作成した仮想サーバー上にknife-soloを使用してインストールしてみたいと思います。

まずはGithubに新規リポジトリを作成

https://github.com/keiwt/nginx-provisioning

ローカルでクローンします

$ git clone https://github.com/keiwt/nginx-provisioning.git

Vagrantfileを作成する

$ vagrant init

Vagrantfileの編集

  • box名とboxの取得元URLの設定
# Every Vagrant virtual environment requires a box to build off of.
config.vm.box = "nginx-provisioning"
config.vm.box_url = 'https://f0fff3908f081cb6461b407be80daf97f07ac418.googledrive.com/host/0BwtuV7VyVTSkUG1PM3pCeDJ4dVE/centos7.box'
  • ホストOSからゲストOSにアクセスする際のIPの設定
# Create a private network, which allows host-only access to the machine
# using a specific IP.
config.vm.network "private_network", ip: "192.168.33.30"
※コメントアウトするだけではなく、192.168.33.10 → 192.168.33.30

knife-soloでChefリポジトリを作成する

  • Gemfileの作成
source 'https://rubygems.org'
gem 'knife-solo'

※Vagrantfileがあるディレクトリ内に配置します ※knife-soloをまだインストールしていない場合は$ bundleでknife-soloをインストールしてください'

$ bundle exec knife solo init .

.vagrant/, vendor/bundle/*を.gitignoreに追加

$ echo '.vagrant/' >> .gitignore
$ echo 'vendor/bundle/' >> .gitignore

Githubにpushする

$ git add .
$ git commit -m 'created Chef repo'
$ git push origin master

※この後も適宜pushします

cookbookの作成

  • cookbookの雛形を作成
$ bundle exec knife cookbook create nginx -o site-cookbooks
** Creating cookbook nginx
** Creating README for cookbook: nginx
** Creating CHANGELOG for cookbook: nginx
** Creating metadata for cookbook: nginx
  • cookbook(nginx-provisioning/site-cookbooks/nginx/recipes/default.rb)を編集する
#
# Cookbook Name:: nginx
# Recipe:: default
#
# Copyright 2014, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#
package "nginx" do
    action :install
end

service "nginx" do
    supports :status => true, :restart => true, :reload => true
    action [:enable, :start]
end

template "nginx.conf" do
    path "/etc/nginx/nginx.conf"
    source "nginx.conf.erb"
    owner "root"
    group "root"
    mode 0644
    notifies :reload , "service[nginx]"
end
  • 設定ファイル(nginx-provisioning/site-cookbooks/nginx/templates/default/nginx.conf.erb)の作成
user    nginx;
worker_processes    1;
error_log   /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
    worker_connections 1024;
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    server {
        listen <%= node['nginx']['port'] %>;
        server_name localhost;
        location / {
            root /usr/share/nginx/html;
            index index.html index.htm;
        }
    }
}

iptablesのcookbookの作成

  • 雛形の作成
$ bundle exec knife cookbook create iptables -o site-cookbooks
  • cookbook(site-cookbooks/iptables/recipes/default.rb)の編集
service 'iptables' do
  action [:disable, :stop]
end

yum-epelをインストール

$ bundle exec knife cookbook site vendor yum-epel

run_listの作成

{
    "nginx": {
        "port": 80
    },
    "run_list": ["yum-epel","nginx","iptables"]
}

nginx-provisioningノードでchef-soloを使えるようにする

  • prepareコマンドの実行
$ bundle exec knife solo prepare nginx-provisioning

Bootstrapping Chef... Enter the password for vagrant@nginx-provisioning: ERROR: Net::SSH::AuthenticationFailed: Authentication failed for user vagrant@127.0.0.1vagrant sshでは接続できるが、ssh nginx-provisioningでは接続できない ※vagrant sshはデフォルトでは2222ポートに接続するので、ssh接続する際も2222ポートに接続する ※vagrant ssh-config --host ホスト名 >> ~/.ssh/configではポートが2000になっているのでご注意ください ※以下を参考にしてください。

localhost - Can't SSH into a Vagrant Virtual Machine - Server Fault

$ vagrant ssh-config --host nginx-provisioning >> ~/.ssh/config
  • ~/.ssh/configの設定を変更する(Portを2222にする)
Host nginx-provisioning
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /Users/k_higo/.vagrant.d/insecure_private_key
  IdentitiesOnly yes
  LogLevel FATAL

プロビジョニングの実行

  • cookコマンドの実行
$ bundle exec knife solo cook nginx-provisioning

http://192.168.33.30/にアクセス

f:id:keiwt:20141123132301p:plain

完了!!!!!!