Capistranoでログを標準出力とファイル出力の両方に出力する方法

もっとシンプルにできるやり方があれば教えてくださいませ!

chefを動かしているCapistranoのログをよしなにする必要があり
標準出力とファイル出力の両方に出力することはできないかなと悪戦苦闘した記録になります。

- 参考
capturing output to log file


require 'capistrano'
require 'capistrano/logger'

output = '/var/log/capistrano.log'
custom_logger = Capistrano::Logger.new(:output => output)
custom_logger.level = Capistrano::Logger::TRACE
self.logger = custom_logger

まず、こちらの設定で標準出力は行わず、ファイル出力されることを確認。

では合わせて標準出力に出すにはoutputをもうひとつ指定したらよしなにしてくれるだろうと。

custom_logger = Capistrano::Logger.new(:output => output)

custom_logger = Capistrano::Logger.new(:output => output, :output => STDOUT)


1つ目のoutput引数が2つ目のoutput引数に上書きされて終わり。
そう簡単にはいかないですよね。

ということでCapistranoの中身を確認するとlog関係は
/lib/capistrano/logger.rbここにありそうだなと。

    def initialize(options={})
output = options[:output] || $stderr
if output.respond_to?(:puts)
@device = output
else
@device = File.open(output.to_str, "a")
@needs_close = true
end

@options = options
@level = 0
end

def close
device.close if @needs_close
end

def log(level, message, line_prefix=nil)
if level <= self.level
indent = "%*s" % [MAX_LEVEL, "*" * (MAX_LEVEL - level)]
message.each do |line|
if line_prefix
device.puts "#{indent} [#{line_prefix}] #{line.strip}\n"
else
device.puts "#{indent} #{line.strip}\n"
end
end
end
end

putsってメソッドがあればdeviceってのに格納することがわかったので
それを偽装してやればいいんだ。ということがわかります。

config/mydevice.rb

class MyDevice

attr_accessor :buffer
def puts(msg)
STDOUT.puts(msg)
@buffer = @buffer + msg
end
def tty?
return false
end
def initialize
@buffer = ""
end
def clone
end
end

こんな風にSTDOUT(標準出力)と@buffer(ファイル出力のための変数)に出力するようにします。

deploy.rb

require 'capistrano'
require 'capistrano/logger'
load 'config/mydevice'

self.logger.device = MyDevice.new

そしてdeploy.rbに上記記述を書くことで、設定が上書きされます。

  task :message do
open("/tmp/capistrano.log", "w") {|f| f.write self.logger.device.buffer}
end

こんな感じでmessageを出力するtaskを記載することで
/tmp/capistrano.logへ上書きで出力してくれます。

Perlのツールでもこんなにコードを読んだことはなかったので
どうやって読んでいったらいいかのきっかけになったのと、クラスとかそういうものが
ぼんやりとわかってきたような気がします。

@fujiwara++

CentOS6.3をインストールしようとしたらCustom Layoutの項目がなくてGUIかVNCを立ち上げるかkickstartでインストールしないとLVMしか選べなくなった

あれー、何か設定忘れてたかなーとか思って5系で試したら出てきて
あれー、何でだろーって思って色々しらべていたら

9.13. Disk Partitioning Setup




Important — Installing in text mode

If you install Red Hat Enterprise Linux in text mode,
you can only use the default partitioning schemes described in this section.
You cannot add or remove partitions or file systems
beyond those that the installer automatically adds or removes.
If you require a customized layout at installation time,
you should perform a graphical installation over a VNC connection or a kickstart installation.

Furthermore, advanced options such as LVM, encrypted filesystems,
and resizable filesystems are available only in graphical mode and kickstart.

カスタムレイアウトが選べなく鳴るのは100歩譲っても
デフォルトがLVMになるのってどうなの?って思った。
RedHatが今後どこへ向かうのか注意深く見ないといけないのかもしれない。
っていうのを海外のフォーラムで結構見たし本当にそう思う。

GNU/Debianの世界がはじまる!

CentOS6.3上にKVMでCentOS6.3を入れる苦行

いやー、KVMのおかげで仮想環境がだいぶ簡単に構築できるようになりましたね。
ということで作業メモ。

仮想君にはブリッジで橋渡しをするのでbride-utilsも仮想関係と一緒に。

yum install bridge-utils
yum groupinstall Virtualization "Virtualization Client" "Virtualization Platform" "Virtualization Tools"

問題なくインストールが完了すれば
virshコマンドとかqemu-imgコマンドとかが使えるようになる。


# /etc/sysconfig/network-scripts/ifcfg-br0 

DEVICE=br0
TYPE=Bridge
BOOTPROTO=static
IPADDR=192.0.2.100
BROADCAST=192.0.2.255
NETMASK=255.255.255.0
NETWORK=192.0.2.0
ONBOOT=yes

# /etc/sysconfig/network-scripts/ifcfg-eth0 

DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
BRIDGE=br0

上記設定でbr0のインタフェースが上がればOK。

イメージをつくる前に、わたしの環境では /data/ というパーティション
別のディスクを入れているので

$ mv /var/lib/libvirt/images /var/lib/libvirt/.images
$ ln -s /data/images /var/lib/libvirt/images

とかでシンボリックリンク張っています。
これでイメージファイルとホスト側のOSのディスクが分かれるのでディ・モールト良い。

$ qemu-img create -f raw /var/lib/libvirt/images/centos-one-20G.img 20G

とかでイメージをつくる。
スパースファイルじゃない作り方メモったのにどこかに行ってしまった!!!
ご存知のかた教えてくださいませ!!!

このスパースファイルが実際にどれぐらいのディスク領域を使用しているのかは

$ qemu-img info /var/lib/libvirt/images/centos-one-20G.img

で、わかりますね。

Sparse File (スパースファイル/穴空きファイル) - うまい棒blog

id:hogemさん++

virt-install \
--connect qemu:///system \
--name=debian-love \
--ram=2048 \
--disk=/var/lib/libvirt/images/centos-20G.img \
--vcpus=2 \
--os-type=linux \
--os-variant=virtio26 \
--network bridge=br0 \
--accelerate \
--hvm \
--location http://ftp.iij.ad.jp/pub/linux/centos/6.3/os/x86_64/ \
--graphics vnc,port=5900,listen=0.0.0.0,password=hogehoge \

そしてわたしが今回困惑したのはまさにここ。
本来であればvncとか不要で、 console=tty0 console=ttyS0,115200n8' と指定してあげれば
インストールがはじまってあとは楽勝や!

ってなるはずなんですが
さっき上げたエントリーの通り、テキストモードだとLVMしか選べないため
VNCで接続しなければならないのですが、ここで console=tty0 console=ttyS0,115200n8 を指定すると固まります。
ということで、consoleの指定を外してVNCで接続してGUIでインストールすると無事起動します。
そのおかげで virs console debian-love とやっても表示されなくなります。

最悪わたしの場合は、ホストOSはGUIで動いているので問題ないのですが
これを回避するにはやはり、kickstartファイルを作成して

--extra-args='ks=ks=http://HOST/centos-6-kickstart.ks console=tty0 console=ttyS0,115200n8'

上記のようにキックスタートファイルを作成してインストールするのが賢そうです。
自宅の環境構築って色々勉強になるので有り難いのですけど、週末ずっと家に引きこもって
うんうん悩みながら翌週迎えると休んだ気分にならないので、週末のどちらかはお散歩に行ったりしましょう!!!

...

ということでkickstartでインストールしてみたら上手くいったのでそれも書きます。

かきました

( '-')-3

苦行の果てに得たCentOSの6系をインストールする時はkickstartが良さそうという解脱の境地

ということで

- CentOS6.3をインストールしようとしたらCustom Layoutの項目がなくてGUIかVNCを立ち上げるかkickstartでインストールしないとLVMしか選べなくなった
- CentOS6.3上にKVMでCentOS6.3を入れる苦行

上記苦行を経験した結果、kickstartだと問題なくインストールできることがわかったので、
KVMに限らずCentOSの6系をGUIなしやLVMなしでインストールしたい場合は
kickstartでインストールする一択になりそうですね。


** CentOS 6.3 install on KVM from kickstart

一応参考までにkickstartファイルとコマンドを載せておきます。

苦行の果てに得たCentOSの6系をインストールする時はkickstartが良さそうという解脱の境地

ということで

- CentOS6.3をインストールしようとしたらCustom Layoutの項目がなくてGUIかVNCを立ち上げるかkickstartでインストールしないとLVMしか選べなくなった
- CentOS6.3上にKVMでCentOS6.3を入れる苦行

上記苦行を経験した結果、kickstartだと問題なくインストールできることがわかったので、
KVMに限らずCentOSの6系をGUIなしやLVMなしでインストールしたい場合は
kickstartでインストールする一択になりそうですね。


** CentOS 6.3 install on KVM from kickstart

一応参考までにkickstartファイルとコマンドを載せておきます。

参考

- @fujiwara
- CentOS 6.3のKickstartファイルに指定するインストールパッケージの名前を調べる
- Kickstartでディスクの初期化時に止まってしまう

先人たちの知恵に感謝

先人たちの知恵に感謝といえば、12月14日にこんなイベントもあるらしいですね!
モヒカンに運用のことが聞けるチャンスですが、なかなか人が多いところで質問するの気後れするし、
かといって歓迎会で声かけるっていってもどうせまたモヒカン同士がワイワイやって話しかけられる雰囲気じゃないんだろう。。
勇気を出して質問しても、下手な質問したらどこからかマサカリがあらわれて命が危ないんじゃないか。。

って思っている方は、比較的情弱な私を介することで敷居低くなるとおもいますのでご利用ください。

あの憧れの先輩に声をかけたいけど
ちょっと2人じゃこわいし、けど先輩の知り合いのアイツを介せばなんとかいけそうかも!!!

みたいな感じで:)