萌えキャラとは何だったのか

ギークにも絵描きにもなれない者の末路

前の記事@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やらを研修で学んだと聞くのでそろそろ後輩に追いつかないといかんとですよ。