Subscribed unsubscribe Subscribe Subscribe

Vagrant×Chef×Knife-Solo×VirtualBoxのプロビジョニング

vagrant init [box-name] [box-url]

VagrantFileが作成される

実際はVagrantFileを共有して、vagrant upする方がよさげ。

VagrantFileのサンプル

# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = 'bizevo/centos7_64'
  config.vm.box_url = 'https://f0fff3908f081cb6461b407be80daf97f07ac418.googledrive.com/host/0BwtuV7VyVTSkUG1PM3pCeDJ4dVE/centos7.box'

  if ENV["PROCESSOR_ARCHITECTURE"] == 'x86'
    puts "falling back to 32-bit guest architecture :("
    config.vm.box = 'bizevo/centos6.4_i386'
    config.vm.box_url = 'http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-i386-v20131103.box'
  end
  config.vm.network "private_network", ip: "192.168.33.30"
end
※config.vm.network "private_network", ip: "192.168.33.30"はホストOSからアクセスする際に使用するipの設定です。

vagrant up

VagrantFileの内容に基づいて仮想サーバーが立ち上がります。

vagrant up時のエラーについて

Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available.

こちらはGuest Additions VersionとVirtualBox Versionが違うと上手くマウントできないのが原因のようなので、
自動的にゲストOSにホストOSのVirtualBoxのGuest Additionsを自動でインストールしてくれるvagrant-vbguestを使います。

$ vagrant ssh -c 'sudo /etc/init.d/vboxadd set up'でもうまくいきますが、
仮想サーバーを作る際に毎回するのは面倒ですね。

vqguestプラグインのインストールについて

$ vagrant plugin install vagrant-vbguest

この後にvagrant upした際にvagrant-vbguest関連のエラーが出る場合は以下のコマンドを実行してみてください。

$ sudo ln -s /opt/VBoxGuestAdditions-4.3.18/lib/VBoxGuestAdditions /usr/lib/VBoxGuestAdditions

4.3.18の部分は適宜ご利用のVirtualboxのバージョンに合わせてください。
もしくは、vagrant up時のエラーメッセージに自身が指定すべきバージョンが書いてあります。

正しくインストールできたか確認する際は以下のコマンドを実行してみてください。

$ sudo vagrant vbguest --status
GuestAdditions 4.3.18 running --- OK.

仮想サーバーの廃棄

$ vagrant destroy

これで作成した仮想サーバーは完全に破棄されます。

仮想サーバーの停止

$ vagrant halt

これで仮想サーバーが停止します。
再び仮想サーバーを起動したい場合はvagrant upとすればよいです。

※仮想サーバーが立ち上がっている場合にAVD(Android Virtual Devices)を同時に立ち上げると、

HAX is working and emulator runs in fast virt mode emulator: Failed to sync vcpu reg emulator: Failed to sync HAX vcpu context

とのエラーが発生する場合はvagrnat haltで仮想サーバーを止めた後にAVDを立ち上げるとうまくいきます。

こちらは、HAXの仮想cpuがVirtualBox上の仮想サーバーとシンクロすればいいのか、
AVDとシンクロすればいいのかの判断がつかないためにエラーになっているのだと思います。

HAXを開発したIntelの技術者の人が複数の仮想マシーンからシンクロすべき仮想マシーンを
選べるようにする費用対効果が低いと判断したからだと思います。

ssh ホスト名で仮想サーバーに接続する

$ vagrant ssh-config --host ホスト名 >> ~/.ssh/config

これで$ ssh ホスト名で仮想サーバーにログインできるようになります。
もし、ログイン出来ない場合は~/.ssh/configのポートを2222にしてみてください。

もちろん、vagrant sshでも仮想サーバーにログインできます

Chef ServerとChef Solo

  • Chef Server
構成管理サーバー。
各ChefClient(Chef Node)がクライアントとして、Chef Serverから構成管理情報を取得・実行
  • Chef Solo
各サーバー内にログインして毎回chef soloを実行する必要がある(スタンドアローン)
Chef Serverチックに使うためにはknife soloがある。
複数のリモートホストに対して、chefが実行できるようになります。

chef soloとknife solo

  • chef solo
chef soloはログインしたサーバー内での実行を前提としています。
レシピを書くのにsudo権限が必要で、ゲストOSでの作業になります。
  • knife solo
ローカルで編集したクックブックをrsyncでノードに転送して、chef-soloを実行できます。
knife soloを使えば、ホストOS側でリモートホストにchefをインストールしたり、
chef soloを実行することができます。

rsyncとはUNIXシステムにおいて、ファイルやディレクトリをバックアップ/同期するためのツールです。
差分のみが転送されます。
knife solo prepareは内部的にはrsync [オプション] コピー元 コピー先のコマンドを使っていると考えて良いと思います。

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

$ cd (VagrantFileがあるディレクトリ)
$ bundle exec knife solo init .
$ echo .vagrant/* >> .gitignore

クックブックの作成

$ bundle exec knife cookbook create クックブック名A -o site-cookbooks
site-cookbooks/クックブック名A/recipes/default.rbができる
$ bundle exec knife cookbook create クックブック名B -o site-cookbooks
site-cookbooks/クックブック名B/recipes/default.rbができる

こちらは必ず、.chefが存在するディレクトリで実行してください。
そうしないとクックブックのディレクトリ構成がおかしくなってしまいます。

クックブックの実行の設定

.chefが存在するディレクトリ/nodes/ホスト名.json
{
  "authorization": {
    "sudo": {
      "users": ["vagrant", "webservice"],
      "passwordless": true,
      "sudoers_defaults": [
        "env_reset",
        "mail_badpass",
        "secure_path=\"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\""
      ]
    }
  },
  "automatic": {
    "ipaddress": "precise"
  },
  "redis": {
    "install_type": "source",
    "source": {
      "version": "2.8.13",
      "url": "http://download.redis.io/releases/"
    },
    "symlink_binaries": true
  },
  "nodejs": {
    "install_method": "binary"
  },
  "samba": {
    "hosts_allow": "192.168.33.0/8",
    "interfaces": "enp0s8 192.168.33.30"
  },
  "run_list": [
    "yum",
    "base::packages",
    "recipe[chef-solo-search]",
    "recipe[selinux::disabled]",
    "base::users",
    "recipe[samba::server]",
    "recipe[sudo]",
    "recipe[ruby_build]",
    "recipe[vim]",
    "recipe[nodejs]",
    "base"
  ]
}

このrun_list内に実行するクックブックを指定します。
もちろん、ひとつひとつのクックブックを実行することもできます。
$ bundle exec knife solo cook ホスト名 -o クックブック名

knife-solo prepare

$ bundle exec knife solo prepare ホスト名

ホスト名にchef-soloをインストールしてくれます。
最近ならchef-zeroになっています。 sshrsyncの設定もしてくれます

クックブックの実行

$ bundle exec knife solo cook ホスト名

.chefが存在するディレクトリ/nodes/ホスト名.jsonに記載されているクックブックが実行されます

berkshelfについて

$ sudo gem install berkshelf

cookbookとその依存関係を管理するツールです。 $ knife solo cook ユーザー名@ホスト名を実行するときに
.chefが存在するディレクトリにBerksfileが存在する場合には WARNING: Berkshelf could not be loaded
WARNING: Please add the berkshelf gem to your Gemfile or install it manually with gem install berkshelf
となります。
依存管理のためにはインストールしてくださいねという感じでしょうか。

http://downloads.getchef.com/chef-dk/
http://berkshelf.com/

chef-soloをknife-soloで実行できるようにする

$ sudo gem install knife-solo

これでホストOSへのknife-soloのインストールが完了します。
Gemfile内にgem 'knife-solo'として、bundleを実行してもインストールできます。

vagrantでchef-soloが実行できるようにする

$ knife solo prepare bizevo

これを実行するとChefノード(仮想サーバー)上でchef-soloコマンドが
knife-soloコマンドで実行できるようになります。

プロビジョニング(構成管理の実行)

$ knife solo cook bizevo

これで実際に構成管理が実行されて、諸々インストールされます。

Could not find the X.Org or XFree86 Window System, skipping

https://www.virtualbox.org/ticket/12479

The installation is successful otherwise,
but it still prints an error based on this issue.
Can there be an option to not install video related components if there is no GUI to be found? とのことです。
パッチを適用すればいいのでは?との回答があります。

VM上でvideoを使用することはないので、まあいいかと考えているのですが、
プロビジョニングに成功したとはいえ、failというワードが出たままなのはちょっと嫌ですね。

Failure to install VBox 4.X.XX guest additions when X is not installed

こちらは以下の問題と同様にシンボリックリンクを貼ったら解決していました。

Failed to mount folders in Linux guest.
This is usually because the "vboxsf" file system is not available.
Please verify that the guest additions are properly installed in the guest and can work properly.

vagrant-vbguestのインストールがうまくいっていないために発生するようです。
シンボリックリンクを貼れば直ります。
$ sudo ln -s /opt/VBoxGuestAdditions-4.X.XX/lib/VBoxGuestAdditions /usr/lib/VBoxGuestAdditions

http://stackoverflow.com/questions/22717428/vagrant-error-failed-to-mount-folders-in-linux-guest