移植という言い方は少し意味違う気がするけれど・・、まぁ気にせず始めたいと思います。
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 ~]$
ドーン、終了です!