uzullaがブログ

uzullaがブログです。

ChefのRecipeだけVagrantでつかう

Apache+mod_php 5.3をOSXで作ろうとおもったけど、環境汚さずに良い感じにいれるのがダルかったので、ひさびさにVagrantをいじっておりますが、数ヶ月放置してたレシピが腐ってつかえなくなってたuzullaですこんばんわ。

いや、そういう用途にはPuPHPetっていいかんじのがあるんですけど、
https://puphpet.com/

これ、vagrant upするとエライ勢いでエラー出るんですよね。まあうごくんですけど、不安でしゃーないので、自分で書くしかない。*1


さて、放置するとサードパーティー(というか本家)のレシピは仕様がかわるというのでちょっと悩んでいて、あー結局レシピ全部手書きでメンテしかないかなーっておもったけど、はたしてその状態で環境をとっておくための、利用頻度の低い「soloの」Chefの意味がどれだけあるのかと悩んでおります。

「腐らない」スクリプトのほうが、数年後使うハメになるとか、そういう場合には良いのではないか…。


さておき、VagrantではChefのRecipeを手軽につかえますね。Recipeが簡単につかえるのであって、Chefがどうこうではない*2。Recipeをシェルスクリプトみたいな風にみるやつですね。

Vagrant VirtualBox入れる、Bakeshelfもいれる

省略、適当にいれる、BakeshelfはGemとかでいれる。ChefやKnife-soloはいらない(けど、BakeShelfいれたら入るのかな)

VMのイメージ(box)はChef対応のやつを選びましょう。

ファイル構造

vmのディレクトリ
├── Berksfile
├── Vagrantfile
├── cookbooks
│   └── Berkshelfで自動的に入るやつ
└── site-cookbooks
    └── 自分のレシピ

Berksfile書く

たとえば

site :opscode
cookbook "yum"
cookbook "yum-epel"
cookbook "mysql"
cookbook "database"
cookbook "simple_iptables"

その後

berks install -p cookbooks

してサードパーティーRecipeをcookbooksにいれておく。

site-cookbookに好きに書く

省略、自作のrecipeをsite-cookbooksにいれておく。

本当はもう全部どっかのRepoで管理して、Berksfileにまとめて書くべきで、site-cookbooksは書くべきではないなーとはおもってます(が、それにしても多少はのこるよね!)

Vagrantfile書く

たとえば

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

(略)

    config.vm.provision :chef_solo do |chef|
        #chef.log_level = :debug
        chef.cookbooks_path = ["./cookbooks", "./site-cookbooks"] # <-- 配列でわたせる
        chef.add_recipe "yum-epel" # <-- レシピを指定する
        chef.add_recipe "mysql::server"
        chef.add_recipe "install-httpd-php"
        chef.add_recipe "create-virtualhost"
        chef.add_recipe "setiptables"

        chef.json = { # <-- node/*.jsonみたいなのを書ける
            mysql: {
                server_root_password: "greatpass",
                server_repl_password: "greatpass",
                server_debian_password: "greatpass",
                bind_address: "127.0.0.1"
            },
            vhost: {
                site_admin_email: "admin@example.co.jp",
                site_fqdn: "example.jp",
                site_root_dir: "/vagrant_data/code/public/",
                site_db: "app",
                site_db_user: "app",
                site_db_pass: "app-greatpass"
            }
        }
    end

end

みたいなの書く。

knifeでいうところのnode/hogehoge.jsonがそのまま書けるの最近までしらなかったですね、まあとかにかく便利だ。

あとはvagrant upだ。

recipeのテスト(というか修正というか)は vagrant provisionでOKだ。

つまり

ChefのRecipeをChefのなんやらと切り離してたんなるスクリプトとしてみると、まあややこしいところも減って簡単便利でよいですね、という目新しさのとくにない自分向けメモでした。

*1:直そうかとおもったけど、Puppetよくわからないマン

*2:まあ、Boxは普通にChefはいってなきゃダメですけど