前の記事が @fujiwara さんにブクマされた後もりもりっとブクマがのびてビビるなど。mix3です。
vagrantやansibleが流行っぽいので、MBP13インチをRetinaモデルに新調してウキウキハイテンションの今のうちに触っておくことにしました。
ちなみにpacker,vagrant,ansibleに対する自分の理解は以下のような感じ
- packer
- vagrantのboxを作るためのツール
- vagrant
- 昔virtualboxのフロントエンドツールだったぽいけど今はvirtualboxに縛られなくなってるんだっけ?
- ansible
- provisioningツール chefとかより軽量
正しくないかもしれないけど、大きく外してないと思いたい。
インストール
packerはbrew install packerか、バージョンを気にする場合はgit clone > make
vagrantはVagrant Downloadsからdmgを持ってきてインストールでサクっと完了。
ansibleはbrew install ansibleで。なおpyenvを使ってsystemのpythonを使われないようにしました。
packerを試す
やったのはcentos5.6のboxを作ること my-packer-template-files/centos6.4を元に弄りました
- vmwareの項目を削った
- netinstallだと時間がかかるのでDVD1of2をローカルに持ってきておいてそれを使うようにした
- Virutalboxで実際にインストールした後に出来るanaconda.cfgををもとにks.cfgを弄った
- GuestAdditionsのせいで削ったyumが元に戻った
- etc...
色々削れないかなぁと思って色々削った末に色々削れずに元に戻るということをpacker buildを打ちまくって繰り返してました。
なお、最小構成でのOSインストールにしているとはいえboxがexportされるまでそれなりに時間が掛かるのでtry&errorで試すのは結構面倒くさいです。
- box作成までの流れ
- vmが立ち上がってkickstartでOSインストール
- vm再起動後、provisionersの設定が走ってyumやら色々インストール
- vm落とした後box作成
ちなみにboxは Vagrantbox.esに色々あるのでそれで問題ないのであればpacker使って自作する前にそっちを使うべきかと思います。
centos5.6のboxもあります。
ということで自作したpacker templateはこちらになります my-packer-template-files/centos5.6
json手書きとかケツカンマの関係でやりたくなかったのでperlで書いてjsonに直す感じになってます
vagrant upする
boxが出来たので起動するのですが、いまいちvagrantの使い方がわかっていないのでとりあえず以下の手順で起動してみた
- vagrant box add [box name] [box file]
- cd 適当な場所
- vagrant init [box name]
- vagrant up
vagrant init でVagrantfileが作られるので設定が必要な場合はupするまえに弄る感じになるっぽい 例えばvirtualboxの設定を変えたいときは以下を弄ったりするんだと思われる
packerの時点でGuestAdditionsインストールを削って使わない設定にするとかもここかな?
# config.vm.provider :virtualbox do |vb|
# # Don't boot with headless mode
# vb.gui = true
#
# # Use VBoxManage to customize the VM. For example to change memory:
# vb.customize ["modifyvm", :id, "--memory", "1024"]
# end
sshで入るときは vagrant ssh すると入れる vagrant ssh-config で .ssh/config の設定が見えるので手動で何かしたいときはそっちを見ると良いかな
ansibleを試す
ansibleを動かすにはINVENTRY(サーバリスト)とplaybook(chefでいうレシピ)が必要になります。今回は配信先が一つなのでINVENTRYはシンプルに一行で良いのですが、意味も無くグルーピングしてみました
$ cat hosts
[vagrant]
127.0.0.1 ansible_ssh_port=2222
# きちんとグルーピング指定するならこんな感じかな?
# [vagrant-app]
# 127.0.0.1 ansible_ssh_port=2223
# 127.0.0.1 ansible_ssh_port=2224
# 127.0.0.1 ansible_ssh_port=2225
# 127.0.0.1 ansible_ssh_port=2226
# [vagrant-db]
# 127.0.0.1 ansible_ssh_port=2227
# [vagrant-app:vars]
# ...
# [vagrant-db:vars]
# ...
[vagrant:vars]
ansible_ssh_user=vagrant
ansible_ssh_private_key_file=~/.vagrant.d/insecure_private_key
ansible_*のオプションはAnsible in detail で確認しました
ひとまずはこれで配信が出来るか試したところ
$ ansible all -i hosts -m ping -s
127.0.0.1 | FAILED >> {
"failed": true,
"msg": "SUDO-SUCCESS-moxmhsptrmdnainrjekmubryetybkhrq\r\nError: ansible requires a json module, none found!",
"parsed": false
}
という感じで怒られてしまいました。配信先のpythonにjson moduleが別途必要なようです(python2.6からは不要)文言が違うけど以下参考
これはに対して -m raw でjsonを使わず -a "..." で実行内容を直接指定して配信先に対してjson moduleを入れるのが定石のようなようです
$ ansible all -i hosts -m raw -a "yum -y install python-simplejson" -s
$ ansible all -i hosts -m ping -s
127.0.0.1 | success >> {
"changed": false,
"ping": "pong"
}
これでplaybookを作ってやれば配信できる状態になったと思われます。
ちなみに ansible all -i hosts all -m ping -s のオプションの意味ですが以下のようになっています
$ ansible
Usage: ansible <host-pattern> [options] # host-pattern は all指定で全グループへ、グループ名指定で特定のグループへ配信
Options:
-i INVENTORY, --inventory-file=INVENTORY
specify inventory host file # ホストリストファイルの指定
(default=/usr/local/etc/ansible/hosts)
-s, --sudo run operations with sudo (nopasswd) # 配信先での操作でnopassのsudoを使う
playbook
playbookは以下をつまみ食いしたあと、後公式ドキュメン Ansible Modules をつまみ食いして作りました
作ったplaybookの内容は以下の通り なにやら怪しい感じですが気にしてはいけません。
- apacheのyumインストール
- fcgiのyumインストール
- mod_fastcgi2.4.6のソースインストール
- mysqld5.1のrpmインストール
- memcachedのyumインストール
ということで、具体的にはhttps://gist.github.com/mix3/7611961のようになりました 意味も無くymlを分割したりしています。
rpmモジュールはAnsible で RPM を扱うから拝借させてもらいました
本来必要の無いものなのですが、CentOS5だとyumモジュールでのrpmインストールがうまく行かないようなので使わせてもらいました
ということで
仮想化やらクラウドやらのおかげで複数台のサーバを気軽に扱えるような時代になってるので、気軽に扱えるなら扱えるなりに扱い方を覚えていかないとなぁとそんなこと思いながらpacker, vagrant, ansible とかを触ってみました。
次はserverspecとか触りたいですね。確か今年の新卒たちはchefやらserverspecやらを研修で学んだと聞くのでそろそろ後輩に追いつかないといかんとですよ。