EngineYard日本支社クローズにともなって怖話さくらクラウドに移行しました。

sunziでサーバー作ってcapistranoでデプロイしてるんですが、sunziのshell scriptでちょっとわからない点があります。

debianでLANGとかLC_ALLの設定無しでapt-get installとかやると下記のようなお決まりのWARNINGが出まくります。

$ sudo apt-get install foo
...
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
	LANGUAGE = (unset),
	LC_ALL = (unset),
	LANG = "en_US.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").

僕の中では下記のエントリーで一応対応方法は決着していたんですが、sunziなどを使う場合はreboot無しで反映されないと気持ち悪い。

Setting locale failedを防ぐ - komagata

現状のrecipeは下記で、これはreboot必要なんですよね。みなさんどうやってるんでしょうか?(en_US.UTF-8でもかまわない)

sunzi-recipes/locale-jp.sh at master · fjordllc/sunzi-recipes

if ! grep -Fq "LC_ALL" /etc/environment; then
  sed -i 's/.*ja_JP.UTF-8 UTF-8.*/ja_JP.UTF-8 UTF-8/' /etc/locale.gen
  locale-gen
  cat < /etc/environment
LANG=ja_JP.UTF-8
LC_ALL=ja_JP.UTF-8
EOF
  source /etc/environment
fi

これsunzi recipeにした。

使い方

sunzi.ymlにremoteのrecipeを持ってくる設定を書く。 wordpress_domainにはwordpressで使うdomain名を書く。 wordpress_jaは日本語で使いたい時だけ必要。 eval_erbはテンプレート中でrubyを評価するのに必要。

sunzi.yml:

---
attributes:
  wordpress_domain: fjord.jp

recipes:
  wordpress: https://raw.github.com/komagata/sunzi-recipes/master/recipes/wordpress.sh
  wordpress_ja: https://raw.github.com/komagata/sunzi-recipes/master/recipes/wordpress_ja.sh

preferences:
  eval_erb: true

install.shで読み込む。

#!/bin/bash
set -e

export DEBIAN_FRONTEND=noninteractive
source recipes/sunzi.sh
sunzi.mute "apt-get update"
sunzi.mute "apt-get -y upgrade"
source recipes/wordpress_ja.sh

sunzi.installを使ってるのでsunzi.shもsourceする。日本語化の必要がなければwordpress.shだけをsourceすればいい。

$ sunzi deploy fjord.jp

便利。

Sunzi: Server provisioning utility for minimalists

"The supreme art of war is to subdue the enemy without fighting." - Sunzi

いわゆるchefのようなサーバープロビジョニングツール。

特徴

  • レシピはshell script
  • 冪等性?犬にくれてやれ!
  • root前提
  • デフォルト設定との差分だけを設定する
  • サーバー側に入れなきゃいけないソフトは無し(shell scriptだから)

ミニマリスト向けツールに見えますが意外と高機能で、基本的にknife-soloのようにクライアントからサーバーに対して使うの前提だし、berkshelfのようにリモートのrecipeを取り込む機能があるし、erbのテンプレートやweb, dbみたいなrole機能もあります。

そもそも俺はdebian(今だったらwheezy)しか使わないし、冪等性とか要らないし、VPSをサクッと設定したいだけなのでちょうどハマりました。

recipes/ruby.sh:

apt-get install -y ruby1.9.3

例えばrubyのrecipeはこんな感じ(少しだけ賢いsunzi.installの方がおすすめですが)。shell scriptなので他人のrecipeがいきなり読めるのがおっさんエンジニアには嬉しい。ちょっとした設定書き換えをsedでやってるの見るとホッとします。

これだったらちょこっと設定してcapistranoでrailsアプリデプロイするとこまで道筋がすごく見えやすいです。

vagrantでsandbox rollbackしながらrecipeを書いてくのが快適です。

疑問

仕事に使おうとしてるんですがいくつか疑問点が。

  • 鍵認証のrootユーザー、sshはデフォルトの22番で運用するのが普通?
  • capistranoでdeploy(=appサーバーの実行者)もrootユーザーでやるの?
  • ソフトのバージョンアップとかはどういう感じでやるの?