Docker+chef用に作ってたものをVagrant+Chefに移植する

移植という言い方は少し意味違う気がするけれど・・、まぁ気にせず始めたいと思います。
boxは前回に作っているので端折りまして、まず今のファイルの配置ははこうなってるっていうのを載せますが、ほぼ自分の為に載せてますな。

[takeken@ubuntu]$ ls -l /home/takeken/vbox/
合計 16
drwxrwxr-x 4 takeken takeken 4096 12月 16 18:03 centos6
drwxrwxr-x 5 takeken takeken 4096 12月 16 21:19 minimal5
drwxrwxr-x 5 takeken takeken 4096 12月 16 21:56 minimal5_b
drwxrwxr-x 3 takeken takeken 4096 12月 16 21:19 ssltest

[takeken@ubuntu]$ ls -l /home/takeken/vagrant
合計 4
drwxrwxr-x 3 takeken takeken 4096 12月 17 09:04 centos5

途中から書き始めると後から見返した時に自分でも意味不明になってしまうので、念のためゲストOSの作成の最初から進めるとしますか。

まずは定義ファイルの作成から。

[takeken@ubuntu]$ vagrant box add centos6 ~/vbox/centos6/box/CentOS-6minimal.box
==> box: Adding box 'centos6' (v0) for provider:
    box: Downloading: file:///home/takeken/vbox/centos6/box/CentOS-6minimal.box
==> box: Successfully added box 'centos6' (v0) for 'virtualbox'!

 

これでcentos6という定義ファイルが出来ました。Vagrant会ではゲストのことをプロバイダーというみたいなので、なんだそりゃとならないようにちょっと注意。
Boxの作成は本来のvboxコマンドでも可能ですが、vagrantはその辺を簡単にしてくれています。いままでに試したもので例えると、virshみたいな感じでしょうか。
余談ですがvagrant-kvmもあるようです。

takeken@ubuntu]$ ls -l /home/takeken/vagrant
合計 8
drwxrwxr-x 3 takeken takeken 4096 12月 17 09:13 centos5
drwxrwxr-x 2 takeken takeken 4096 12月 17 09:20 centos6

 

続いて起動用のスクリプトを作りますが、コマンドが用意されています。

[takeken@ubuntu]$ vagrant init centos6

 

これでVagrantfileというのが出来ます。

 27    config.vm.network "private_network", ip: "192.168.33.11"
 この行をコメントアウトしておくと後での接続が楽です。
 ※別のゲストサーバーで192.168.33.10は使っているので変えています。

続いてのvagrant upで、作成したファイルに従ってゲストOSが自動的に立ち上がります。

[takeken@ubuntu]$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'centos6'...

さっき有効にしたIPアドレスで接続可能です。

[takeken@ubuntu]$ ssh vagrant@192.168.33.11
Last login: Tue Dec 16 07:11:14 2014 from 10.0.2.2
[vagrant@localhost ~]$ cat /etc/redhat-release
CentOS release 6.6 (Final)

ちょいと逸れた話をしますが、他のゲストサーバーとの通信も可能なのです。
ではCentos6を作る前にCentos5をすでに起動させているので確認してみます。お料理教室みたいですね。ちなみに1個のBox、Vagrantfileでも複数台作成することもできますが今回は1台で十分なので、1台で。

[takeken@ubuntu]$ ssh vagrant@192.168.33.10
[vagrant@localhost ~]$ cat /etc/redhat-release
CentOS release 5.11 (Final)

[vagrant@localhost ~]$ ping -c 1 192.168.33.11
PING 192.168.33.11 (192.168.33.11) 56(84) bytes of data.
64 bytes from 192.168.33.11: icmp_seq=1 ttl=64 time=0.407 ms

--- 192.168.33.11 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.407/0.407/0.407/0.000 ms

[vagrant@localhost ~]$ ping -c 1 192.168.33.10
PING 192.168.33.10 (192.168.33.10) 56(84) bytes of data.
64 bytes from 192.168.33.10: icmp_seq=1 ttl=64 time=0.241 ms

--- 192.168.33.10 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.241/0.241/0.241/0.000 ms

分かりづらいですが、双方から通信が確認できました。

また余談ですが、eth1をブリッジ接続にしてセグメント内に組み込む事も可能です。
うちで言うところのWindows機からサーバー機のゲストOSへのログインという事になりますが、設定は以下のような感じ。
Vagrantfileのpublic_networkをコメントアウトします。IPは不要かもしれません。

config.vm.network "public_network", ip: "192.168.24.102"

そして普通にvagrant upで起動して、ゲストOSの/etc/sysconfig/network-scripts/ifcfg-eth1を修正して、network restartすれば接続可能です。

login as: takeken
takeken@192.168.24.102's password:
Last login: Thu Dec 18 21:13:09 2014 from 192.168.24.58
[takeken@localhost ~]$

こんな感じで。

あとは、今のところまだ未確認なのですが、ホストOSをシャットダウンすると、KVMみたくゲストOSが自動的にサスペンドされるとかではなくてゾンビになってました。
vagrant suspend があるのでスクリプトでやれば可能かもです。
ただKVMを触ってたのも随分と前のことになるので記憶が曖昧ですが。その辺はKVMの方が良さげに感じます。ただKVMだと完全に独立した感じになるので、Vagrant+Virtualboxの方が欲しい用途にはあっていますな。

では、環境も整いましたので先に進みましょう。
chef-soloはBoxを作ったときのProvisonerでインストール済みです。

[vagrant@localhost ~]$ chef-solo -v
Chef: 12.0.1

さて!
Docker+ChefとVagrant+VirtualBoxでめちゃくちゃ違う点があります。
どこでしょうか。
Docker+ChefはChef-soloをキックしていました。Vagrant+VirtualBoxではknife-soloでリモートで実行するので、Chef-soloを実行するのと、Knife-soloで実行するという大きな違いがあります。

移植するにはその辺を理解しつつ変えていく感じになりますじゃ。
GithubにアップしているChef-repoをgit cloneしてknife-soloでリモート実行してみます。
ってことなので、移植という事は何もしてません。おほほ。

jsonファイルはnode/docker.jsonに作ってあるので、そこから弄りますか。

~~ 作業中

とりあえずbaseだけ動かすようにjsonファイルを編集しました。baseがどんなレシピだったかというと、epelのインストール・selinuxの無効化・takekenユーザーの作成・必要パッケージのインストールなどなどです。

じつはBoxの作成の時にほとんどが済んでる事なので不要と言えば不要なのですが、実行テストも兼ねてやってみませう。そしてCentos6用に作っていたレシピなので無効化する必要があったところがちらほら。なので、はっきり言うてHello world!くらいの効果しかないですが、まず実行してみます。

何にも載せないのも味気ないのでdiffだけ。

一応Diffでも載せておきます。

[takeken@ubuntu]$ diff -u nodes/docker.json{.org,}
--- nodes/docker.json.org       2014-12-17 21:22:21.735160924 +0900
+++ nodes/docker.json   2014-12-17 21:25:48.195159298 +0900
@@ -1,17 +1,5 @@
 {
-       "nginx":{
-                       "env":["php", "ruby"]
-               },
-
-
  "run_list" : [
-               "recipe[yum]",
-               "recipe[yum-epel]",
-               "nginx",
-               "recipe[selinux::disabled]",
-               "recipe[base]",
-               "recipe[nginx]",
-               "recipe[php-env]",
-               "recipe[ruby-env]"
+               "recipe[base]"
        ]
 }

レシピはまぁほとんとコメントアウトしてます。

[takeken@ubuntu]$ cat site-cookbooks/base/recipes/default.rb
#
# Cookbook Name:: base
# Recipe:: default
#
# Copyright 2014, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#
# 外部cookbookを利用してepelをインストール
#yum_repository 'epel' do
#        description 'Extra Packages for Enterprise Linux'
#       url 'http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm'
#       gpgkey  'http://ftp.riken.jp/Linux/fedora/epel/RPM-GPG-KEY-EPEL-6'
#  mirrorlist 'http://mirrors.fedoraproject.org/mirrorlist?repo=epel-6&arch=$basearch'
#  gpgkey 'http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6'
#        action :create
#end
# 基本的なパッケージをインストール
%w{ gcc make openssh-server kernel-devel zlib-devel openssl-devel readline-devel
                perl wget curl bind-utils git sudo ntp openssh-clients rsync sysstat }.each do |p|
        package p do
                action :install
        end
end
# 外部cookbookを利用してselinuxを無効
#selinux_state "SELinux Disabled" do
#        action :disabled
#end

# 作業ユーザー作成
user "takeken" do
        comment "takeken"
        home "/home/takeken"
        shell "/bin/bash"
        password "$1$Sdk6GWI3$8wCs/GirgmAfyjEd3K8rp/"
        supports :manage_home => true, :non_unique => false
        action [:create, :manage]
end
#
group "wheel" do
        action :modify
        members [ 'takeken' ]
        append true
end
#
template "sudoers" do
        owner "root"
        group "root"
        path "/etc/sudoers"
        mode "0440"
        source "sudoers.erb"
end

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

 

それではknife-solo実行。

[takeken@ubuntu]$ knife solo cook vagrant@centos5 nodes/docker.json
WARNING: solo.rb found, but since knife-solo v0.3.0 it is not used any more
WARNING: Please read the upgrade instructions: https://github.com/matschaffer/knife-solo/wiki/Upgrading-to-0.3.0
Running Chef on centos5...
Checking Chef version...
Installing Berkshelf cookbooks to 'cookbooks'...
Resolving cookbook dependencies...
Fetching 'nginx' from source at site-cookbooks/nginx
Fetching 'php-env' from source at site-cookbooks/php-env
Fetching 'ruby-env' from source at site-cookbooks/ruby-env
Using nginx (0.1.0) from source at site-cookbooks/nginx
Using php-env (0.1.0) from source at site-cookbooks/php-env

~~略

Running handlers:
Running handlers complete
Chef Client finished, 3/23 resources updated in 9.435718 seconds

 

実験結果は成功でございます!
何故かcookbookにあったものやらを全部読み込んでしまってましたが、エラーにはなっていないのでスルーしますか。

ともかくbaseの実行はクリアです。
以上の結果から、Vagrant+Chefへの移行は成功しました!!
おめでとう。さようなら。

終わり。

 

 

ってのもしょうもないので、もうちょっと続けますか。

とは言うものの、先の流れが読めてしまったのです。
Centos6、Centos5というならではのところでエラーが出るはずなので、そこを修正しつつKnife-soloを実行していけば、こないだ作ったrubyのインストールまで終わるという事だ。

あれこれ考えるのはめんどうなので一気にやっちまいますか。

バキューンと旧ファイルに戻します。

[takeken@ubuntu]$ cp nodes/docker.json.org nodes/docker.json
cp: `nodes/docker.json' を上書きしますか? y
[takeken@ubuntu]$

ではDockerじゃないけど、ドッカーンといったらエラーが出た。
バキューンとかドッカーンとか忙しいやつです。

 

エラーは1つでもなかったので、箇条書きにしました。

・Vagrantなんてユーザーは想定していないのでsudoできなくなってしまった。
・php-fpm php-pecl-zendopcacheがCentos5でむりぽ。

これだけでした。でしたというのはもう終わってしまったからです。

いってこーい。

[takeken@ubuntu]$ knife solo cook vagrant@centos5 nodes/docker.json
WARNING: solo.rb found, but since knife-solo v0.3.0 it is not used any more
WARNING: Please read the upgrade instructions: https://github.com/matschaffer/knife-solo/wiki/Upgradin

~~ 略
Running handlers:
Running handlers complete
Chef Client finished, 12/47 resources updated in 685.937504 seconds

ゲストにログイン
[takeken@ubuntu]$ ssh centos5
Last login: Wed Dec 17 21:57:58 2014 from 10.0.2.2

[vagrant@localhost ~]$ su - takeken
パスワード:
[takeken@localhost ~]$ ruby -v
ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-linux]
[takeken@localhost ~]$ rbenv -v
rbenv 0.4.0-129-g7e0e85b

ホストから直でもいいよと。

[takeken@ubuntu]$ ssh 192.168.33.10
takeken@192.168.33.10's password:
[takeken@localhost ~]$

ドーン、終了です!

 

Related Posts


投稿者: Takeken

インターネット利用者のITリテラシーを向上したいという設定の2次元キャラです。 サーバー弄りからプログラミングまで手を付けた自称エッセイストなたけけんの物語。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です