使い始めるまでは何が便利なのか分からなかった仮想マシンをあれこれするVagrantとサーバを自動設定するAnsibleをWindowsで使ってみた話。今、仮想マシンを使ってる人や、今まで何度もOSを入れてる方は多分便利になりますよ。
VAGRANT ??
ナニソレ?
VirtualBoxなどの仮想マシン(VM)を便利に操作したり、機能を追加しちゃう何か的なものです。プラグインでAWSのインスタンスもいじれたりするようですが、今回は仮想マシンの話。Windows、Mac、Linuxなんかで黒い画面を操作して使います。
- Vagrant
http://www.vagrantup.com/ - Vagrant日本語ドキュメント
http://lab.raqda.com/vagrant/
何が便利なの?
「便利便利」みたいな話は見ていましたが、何が便利なのかいまいちピンと来ていませんでした。
従来通りのやり方でも仮想マシンの起動や終了はマウスで出来るし、OS入れるのもLinuxであればISO落として入れるだけだし、スナップショットも取ろうと思えば取れるし…と。でも使い始めると(黒い画面にさえ抵抗無ければ)便利便利。使ってみて良かったなぁと思ったのは次の点。
- 気軽に仮想マシンを作ったり壊したりできる
元のOSは一緒だけど異なる環境を複数作りたいとか、複数のVMを同一仮想ネットワークで気軽に起動したいとか、元のOSは残した状態で作った環境を捨てたいとかが、お手軽に「さくっ」とできる。 - 気軽にスナップショットやサンドボックスが使える
ファイルだけなら消せば良いけど、DBに書いちゃうような物や、複数のパッケージをインストールするような物を入れた後、戻すのってメンドクサイじゃないですか。でもコレ使うと簡単に戻せたり、状態が保存できます。初めてgitやsvnなんかを使った時の感覚。戻れるって嬉しい。 - 標準でWindowsのディレクトリがVM中にマップされる
これは素のVirtualboxでもできるのですが、起動時に勝手にWindowsの特定のディレクトリがVM中のディレクトリにマップされるので、VM中のファイルではなくローカルのコードをいじって、VMのWebサーバで確認みたいなことが手軽にできる。 - 手軽に人様が作った環境が手元に出来あがる
はてブやgunosyを賑わすあんな技術やこんな環境、今の環境は汚さず「とりあえず試してみたい。入れるのメンドクサイ」と思ったこと無いですか?
最近はVagrantの設定ファイルが置いてあることも多いので、それをコピペ or git cloneすれば、OSから落としてくれて、放置しておけば(後半にお話しする自動構成ツールなんかが勝手に動いて)あんな技術入りの環境が出来上がるので、同じ事してるつもりだけど自分の環境では上手く動かないムッキーって時間も短縮されて幸せです。
個人的には1と2が嬉しくて、OSの基さえ入れておけば、それを元に直ぐに違う環境を用意できるので、ちょっと○○入れてみようとか、WordPressのプラグインをバージョンアップしてちゃんと動くかどうか試してみようみたいなのが直ぐにできます。
どうやって入れるの?
Windowsの場合、バイナリファイルが公式から落とせるのでそれ&VirtualBoxをインストールします。基本「次へ」を押していれば入ります。
- Vagrant downloads
http://www.vagrantup.com/downloads.html - Oracle VirtualBox
https://www.virtualbox.org/wiki/Downloads
ちなみに8/7時点で最新のVirtualBox 4.3.14は、私の環境ではVagrantを使わず単体でもVMを起動すると下記のエラーが出て使えなかった(vagrantでも当然使えない)ので、こちらから4.3.12を入れました。
The virtual machine 'hogehoge' has terminated unexpectedly during startup with exit code 1. Result Code: E_FAIL (0x80004005) Component: Machine Interface: IMachine { }
どうやって使うの?
- 後述のスクリプトを修正&起動→黒い画面へ
- Vagrantbox.esなどでOSイメージをとってくる(vagrant box add)
- 設定ファイル(Vagrantfile)を自動作成(vagrant init)
- 設定ファイルを変更(IPアドレスを固定にしたいなど必要に応じて)
- VMを起動する(vagrant up)
- 接続する(ターミナルソフト)
スナップショットを取ったり、自動構成ツールのchefを使ったりは別途プラグインを入れます。
Windowsを使ってて日本語のユーザ名でログインしている場合や、bsdtarやVBoxManageが見つからない的なメッセージが出たらVagrantをインストールしたディレクトリの “embedded\mingw\mingw32env.cmd” を下記の感じに書き換えてからmingw32env.cmdを実行→その黒い窓で操作すると使えると思います。
VAGRANT_HOMEは日本語を含まない適当な場所へ、PATHにはVirtualBoxのインストールディレクトリを追加します。
@title vagrant @set VAGRANT_HOME=C:\home\vagrant\.vagrant.d @set PATH=%CD%\bin;C:\Program Files\Oracle\VirtualBox;%PATH% @call cmd
2~6は先人達が色々書いてくれているのでそちらを参照。
- ドットインストール Vagrant入門
http://dotinstall.com/lessons/basic_vagrant - Windows7にVirtualBoxとVagrantをインストールしたメモ
http://k-holy.hatenablog.com/entry/2013/08/30/192243 - VagrantをWindows7にインストールしてCentOSの開発環境を簡単に作る手順 @Arubeh Inc
http://www.arubeh.com/archives/217
Vagrantbox.esに置いてあるファイルがどれ位信用できるのかが(怪しい物が入っていないか)いまいち分からなかったのがなんだか嫌だなぁとは思いましたが、心配しすぎなんですかね。Dockerみたいに公式で配ってくれたらいいのに…(もちろんboxファイルを自分で作ることもできます)
VMには(ライセンスさえ良い感じにすれば)Windowsも入ります。
- Vagrant で作ったり壊したりできる Windows 環境を手に入れるまでの手順 @てっく煮
http://tech.nitoyon.com/ja/blog/2014/02/20/vagrant-win-guest/
まぁこんな感じで入れます。
Vagrantでよく使うコマンドをまとめたチートシート?を作ったので置いておきます。ダウンロードはコチラ。
ただ、今のままだと開発環境を用意するのが便利だなぁで終わり。ここから一手間かけると、vagrant upしたときに、色んなプログラムを入れてくれたり、設定を変更してくれたりします。それがAnsible。
ANSIBLE ??
ナニソレ?
Unix系OSのセットアップ的な物を自動的にしてくれます。
同じような物にchefと言うのがあり、情報が多くメジャーなので、当初はこちらに挑戦したのですが、私と相性が悪いのかどうにも設定が分かりにくい…
やっぱりメモ帳に貼り付けられた手順書でいいやと思ってた所、Ansibleは随分 分かりやすかったので使ってみることにしました。
- Ansible
http://www.ansible.com/ - 日本語ドキュメント @shkumagai
http://shkumagai.github.io/blog/2013/08/19/ansible_docs_v1_2_2_translated.html
何が便利なの?
大量に多くの環境を用意したいときや、複数人開発の場合とかは便利なんだろうなぁとは思ってましたが、個人レベルでは別になぁと感じてたので使ってなかったのですが、実際使ってみると便利でした。
例えばLinuxでWordpress入れるだけとかなら、
yum install httpd mysql-server php php-mysql php-mbstring
とか叩いて、wp-cli入れてWordpressが使えるようになるまでは、そんなに時間はかかりません。
VMであれば入れた状態でイメージのコピーやスナップショットを取っておけば、次回以降は直ぐに使えますし、VPSやAWSを使っている場合も、手順を書いたメモを見ながらやれば、そこまでの時間はかかりません。
でもね。
前者の場合であれば、OSのバージョン等、とりあえず色んな物を最新にした状態で使いたい、遠く離れたあの人にも同じ環境で使って欲しい(でもVMのイメージを送るのはなぁ…)とか、後者であればテスト環境と本番環境の手順(構成)を全く一緒にしたい、将来的にはまた同じ事を何回かする予定がある…みたいな事って無いでしょうか。
そんな時に、1度これをやっておく or 構成変更には絶対コレを使うと決めると次からは楽ちんになります。
ちなみに、動かすための設定(playbook)がちゃんと書かれてたら、設定が足りないところだけ補ってくれたりします。
問題点を1点あげるとすると、playbook作るのにちょっと時間がかかるんですよね… サーバーの設定なんて似たり寄ったりなので、数個パターンを作っちゃえばあとは選択していくだけになるのかもしれませんが、手順をメモ帳に貼り付けするくらいのスピードで作れれば楽なんだけど… 慣れかなぁ。
どうやって入れるの?
Ansibleはpythonで書かれており、Windowsでpythonその他を動かすにはcygwinって言う、できれば手を出したくない選択肢があります。「windows ansible」で検索して来ていただいた方には申し訳ないのですが、この方法では(実際やってみたのですが)どーにも上手く動かなかったので止めました。
最終的には上記のVagrantでもう一つLinuxの入ったVMを上げ、そこから動かすようにしました。「えーそんな方法か…」って声が聞こえてくる気もしますが、急がばまわれ。
ちなみに「こうやって変更しろ」と命令する方はAnsible本体その他が必要ですが、「命令を受ける方」は命令する方からSSH接続ができ、入ったユーザーがsudoが使えれば特に設定などは必要有りません。
vagrant add box CentOS-6.5-64 https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box vagrant init CentOS-6.5-64
config.vm.define :make-playbook do |node| node.vm.box = "CentOS-6.5-64" node.vm.network :forwarded_port, guest: 22, host: 2001, id: "ssh" node.vm.network :private_network, ip: "192.168.33.11" end config.vm.define :target do |node| node.vm.box = "CentOS-6.5-64" node.vm.network :forwarded_port, guest: 22, host: 2002, id: "ssh" node.vm.network :private_network, ip: "192.168.33.12" end
vagrant upで起動させたら、192.168.33.11(make-playbook)にsshで接続して、
wget http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6 sudo rpm --import RPM-GPG-KEY-EPEL-6 wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm sudo rpm -ivh epel-release-6-8.noarch.rpm sudo yum install -y ansible
ってすると、ansibleがインストールできます(Redhat系の場合)。
どうやって使うの?
「こーやって動いてね」ってのが書いてあるファイル群をplaybookと言います。これをゴニョゴニョすることによって動きます。慣れないうちは若干とっつきにくいけど、個人的にはchefよりははるかにましです。
この辺を見てざっくりと内容を把握しましょう。
- Ansible Tutorial
http://yteraoka.github.io/ansible-tutorial/
roles以下のディレクトリで最初に知っておきたかったなぁと思ったことのメモ。
- files
ターゲットのサーバー上で実行したいシェルスクリプトとかいれとく。スクリプトはtaskから実行する - handlers
task中でイベントが発生したときだけ動かしたいタスクを入れておく - task
タスクを入れておく。ここがメイン - templates
コピーしたい設定ファイルの元とかを入れておく - vars
設定ファイルやタスクで使う変数っぽいものを入れておく
Kindleで出てるこの本もかなり詳しそうです。
あとは個人的には自分が使いそうな既に作られたplaybookをansible galaxy or google or githubで検索→適用してみて、自分の用途に変えていくと良いのでは無いかなぁと思いました。
- Ansible galaxy(playbookの共有サイト)
https://galaxy.ansible.com/
WordPressを入れるまでのplaybook。
- Ansible Tutorial – Ansible を使って WordPress サーバーのセットアップを行う
palybook: https://github.com/yteraoka/ansible-tutorial/tree/playbook
くわしいドキュメント: ここ - Ansibleで環境構築(9) – WordPressの設定 @エロサイトの作り方
http://hentai-kun.hatenablog.jp/entry/2014/06/21/000000
Vagrantと連携させる(起動時にansibleを実行する)
上で作ったplaybookをvagrant upの時に使いたい的な話。
vagrantに標準で入っている “provision – ansible” が使えそうな気がするのですが、これはvagrantを起動する側にansibleが入っていないと動きません=Windows上ではansibleを動かしてないので使えません。
と言うことで、provision時に自分自身にansibleをインストールし、自分にplaybookを適用する感じにしてみます。
Windows側はこんな感じで配置して、
+--Vagrantfile +--provision.sh +--provisioning | +--roles | +--色々 | +--hosts | +--site.yml
Vagrantfileをこんな感じにして、
config.vm.define :target2 do |node| node.vm.box = "CentOS-6.5-64" node.vm.network :forwarded_port, guest: 22, host: 2003, id: "ssh" node.vm.network :private_network, ip: "192.168.33.13" node.vm.provision :shell do |sh| sh.path = "provision.sh" sh.args = "provisioning/site.yml provisioning/hosts" end end
provision.shは、
#!/bin/bash ANSIBLE_PLAYBOOK=$1 ANSIBLE_HOSTS=$2 TEMP_HOSTS="/tmp/ansible_hosts" if [ ! -f /vagrant/$ANSIBLE_PLAYBOOK ]; then echo "Cannot find Ansible playbook" exit 1 fi if [ ! -f /vagrant/$ANSIBLE_HOSTS ]; then echo "Cannot find Ansible hosts" exit 2 fi if ! [ `which ansible` ]; then wget http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6 sudo rpm --import RPM-GPG-KEY-EPEL-6 wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm sudo rpm -ivh epel-release-6-8.noarch.rpm sudo yum install -y ansible fi cp /vagrant/${ANSIBLE_HOSTS} ${TEMP_HOSTS} chmod -x ${TEMP_HOSTS} echo "Running Ansible" bash -c "ansible-playbook /vagrant/${ANSIBLE_PLAYBOOK} --inventory-file=${TEMP_HOSTS} --connection=local" rm ${TEMP_HOSTS}
ってしました(CentOSの場合)。
vagrant up や vagrant provisionするとansibleが入って自分自身にplaybookが適用されると思います(それなりに時間はかかります)。
まとめ
この記事を読んでも、なんだかややこしいしやっぱり自分には必要ないかなぁと思ったあなた。vagrantだけでも一度入れてみてくださいよ。あと、ここ最近サーバー設定的なものはどんどんプログラマもさわれる感じになって来てて、面白いなぁと思いました。
コメント
Vagrant便利ですよね!私も使ってます。私もChefはうまく使えなかったので、Ansible、挑戦してみます!
慣れないうちは断然手でやった方が早いよってイライラするけど、慣れてくると我慢はできます。でも、ちょっとしたことだと、ついサーバに直で入って設定したくなるんですよね。cronで毎日深夜にでもplaybookを適用して、「ansibleに書いてある物以外は認めん」くらいに戒めておくと良い気がしました。