技術をかじる猫

適当に気になった技術や言語、思ったこと考えた事など。

Chef 使ってみた

Chef も使ってさっくり環境を手に入れたいのでやってみた

当たり前のように git git-flow

Chef

鯖蔵方式でクライアント側のマシンを自動でセットアップするツール。

当たり前だけどUI前提のインストーラしかない場合はやりようがない(窓ソフトでやろうとして現状諦めぎみ)

install

  sudo gem install chef
  knife configure

vagrant は Vagrant 使ってみる - 謎言語使いの徒然 この辺に入ってる筈なので飛ばし。

  sudo gem install knife-solo
  sudo gem install berkshelf

knife-solo は簡易操作IF群。berkshelf は chef のインストール設定(cookbook)を管理するソフト。 あと、適当に便利そうな vagrant プラグインを この辺 から選ぶ

  sudo vagrant plugin install vagrant-berkshelf
  sudo vagrant plugin install vagrant-omnibus
  sudo vagrant plugin install sahara

上記は上から順に

  • vagrant up 時に berkshelf を実行
  • vagrant up 時に VM に chef をインストールする
  • VM にサンドボックスモードを設定する(起動中の設定をロールバックできる)

予備知識

  • resource : インストール操作のコマンド単位
  • recipe : 複数の resource を記載する論理単位(cf: サービスユーザの作成等)
  • cookbook : 複数の recipe を入れておく単位プロダクト単位に作るといい感じ
  • node : chef で管理されるサーバのこと
  • role : web/db とかの役割を定義。使う recipe や変数を設定する

使ってみよう

knife solo init java

まぁJava環境欲しかったから。実行すると java ディレクトリが掘られて、Chef の kitchen(repository ともいう) が設定される。 各ディレクトリ

  • cookbooks : サードパーティ製の cookbook を入れておく場所
  • data_bags : ユーザ等データ管理機能使用時に使う
  • nodes : 各サーバ向け JSON ファイル(適用 cookbook 指定JSON)置き場
  • roles : Role を使う際のディレクトリ
  • site-cookbooks : 自作cookbook置き場

cd java

したら knife cookbook create user -o site-bookmarks する。 すると、site-bookmarks に user という cookbook が作成される。

そしたら site-packages/user/recipes/user.rb 開いて

#
# Cookbook Name:: user
# Recipe:: user
#
# Copyright 2013, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#

user "program" do
  # openssl passwd -1 'program'
  password '$1$2y4//tUR$sX0KWu52nSbgznsgIGBnl0'
  home     '/home/program'
  shell    '/bin/bash'
  system   true
  action   :create
end

として、site-packages/user/recipes/defaults.rb

#
# Cookbook Name:: user
# Recipe:: default
#
# Copyright 2013, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#

include_recipe "user::user"

したら kitchen ルートの Berksfile を開いて編集

site :opscode

cookbook 'apt'
cookbook 'java'
cookbook 'scala-sbt', git: 'https://github.com/garrettux/scala-sbt-cookbook.git'
cookbook "user", path: "site-cookbooks/user"

1 行目はデフォルトで opscode リポジトリから coookbook を探すという設定。 なので、得にリポジトリが指定されない場合、上記だと apt/java が該当。

https://github.com/opscode-cookbooks

opscode のリポジトリはこれ。ここの中のものはかなり優秀。

scala-sbthttps://github.com/garrettux/scala-sbt-cookbook のもの。

そしたら

ここまで来たらカレントディレクトリを kitchen のルートに戻る。

vagrant init "debian" "https://dl.dropboxusercontent.com/u/197673519/debian-7.2.0.box"

Vagrantfile 開いて下記を編集

  config.berkshelf.enabled = true
  config.omnibus.chef_version = :latest

  # Enable provisioning with chef solo, specifying a cookbooks path, roles
  # path, and data_bags path (all relative to this Vagrantfile), and adding
  # some recipes and/or roles.
  #
  config.vm.provision :chef_solo do |chef|
     chef.cookbooks_path = ["cookbooks", "site-cookbooks"]
     chef.add_recipe("apt")
     chef.add_recipe("java")
     chef.add_recipe("scala-sbt")
     chef.add_recipe("defuser")
  end

起動とログイン

そしたら Vagrantfile up すると、debian イメージが落ちてきて Berksfile の cookbook をデプロイして Vagrantfile の provision chef_solo 定義に従って cookbook を適用してくれると。

vagrant ssh 叩くと入れるし、vagrant ssh-config --host debian >> ~/.ssh/config しておくと楽。

あと java と sbt と program ユーザの存在確認しておくといい。

これで毎度コマンド一発で java セットアップ済みの VM が拾ってこれる。