Skip to content

Instantly share code, notes, and snippets.

@ssig33
Created June 25, 2012 08:16
Show Gist options
  • Star 11 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save ssig33/2987329 to your computer and use it in GitHub Desktop.
Save ssig33/2987329 to your computer and use it in GitHub Desktop.
ファーストサーバーの事故についてちょっと具体的に想像してみました
# ホットスタンバイがバックアップじゃないとかその手の話はとりあえず置いておきます
#
# なぜこんな間抜けな事故が起きたかについてだけ想像
#
# 1. いろんなサーバーメンテナンスをスクリプトでやっていた
# 2. スクトプトは随時使い回したり書き換えたりして使っていた
#
# という状態であったと推測する。中小規模自社サービスとかやってるところとかもわり
# とこうなんじゃないですかね。ホスティングでそのレベルでいい加減なのどうなんでし
# ょうか。
#
# 非常に高い確率で各種の「管理プログラム」はシェルスクリプトで書かれていたと予想
# されますが、僕が読み書き徳井なのは Ruby なので以下 Ruby で書きます。
# 最初にこんなスクリプトが書かれたんじゃないかな。
#
# 全テスト環境再起動
open('servers').read.split("\n").each{|x|
`ssh #{x} 'sudo shutdown -r -t 0'`
}
# servers にはずらーっとサーバーの IP アドレスが書かれているようなイ
# メージ。テスト環境の servers があるディレクトリでスクリプトを実行すれ
# ば、テスト環境に向けて実行できて、本番環境の servers があるところで実
# 行すれば、本番環境に向けて実行できるとかそんなん。
# こういうの書いたことある人多いんじゃないでしょうか。
# そしてある日、こんなものが書かれた
# 特定のサーバーにアップデートを適用して再起動
`ssh #{ARGV[0]} 'sudo apt-get update'`
`ssh #{ARGV[0]} 'sudo apt-get upgrade'`
`ssh #{ARGV[0]} 'sudo shutdown -r -t 0'`
# こんなもの書いたことある人も多いんじゃないでしょうか。
# それから、こんなものも書かれました
#
# サーバーのホームディレクトリの初期化
open('servers').read.split("\n").each{|x|
`ssh #{x} 'sudo rm -rf /home/*`
}
# そして様々なスクリプトが書かれるようになりましたが、社内ではスクリプトが沢山書
# かれて散逸していることが問題視されるようになりました。
#
# そこで、あるエンジニアがスクリプトを一つにまとめよう、という提案をして、実際に
# 作ってみました。
if ARGV[0] == 'single'
case ARGV[1]
when 'update'
`ssh #{ARGV[2]} 'sudo apt-get update'`
`ssh #{ARGV[2]} 'sudo apt-get upgrade'`
`ssh #{ARGV[2]} 'sudo shutdown -r -t 0'`
when 'hogehoge'
`ssh #{ARGV[2]} hoge`
`ssh #{ARGV[2]} hoge`
`ssh #{ARGV[2]} hoge`
`ssh #{ARGV[2]} hoge`
`ssh #{ARGV[2]} hoge`
end
end
open('servers').read.split("\n").each{|x|
`ssh #{x} 'sudo rm -rf /home/*`
}
if ARGV[0] == 'group'
case ARGV[1]
when 'update'
open('servers').read.split("\n").each{|x|
`ssh #{x} 'sudo apt-get update'`
`ssh #{x} 'sudo apt-get upgrade'`
`ssh #{x} 'sudo shutdown -r -t 0'`
}
when 'reset'
open('servers').read.split("\n").each{|x|
`ssh #{x} 'sudo rm -rf /home/*`
}
end
end
# そして、特定のサーバーに向けてアップデートを適用することになりました。その作業
# に今回の統一スクリプトが仕様されることになりました。まずテストを実行することに
# しました。テスト対象のサーバーはホームディレクトリを事前にフルリセットしておき
# ました。
#
# > cd /home/admin/test && /home/adimin/script single update 192.168.11.125
#
# するとどうしたことでしょう、 single と group の間に挟まれた全サ
# ーバーのデータを削除するスクリプトが実行されてしまったではありませんか。テスト
# 環境の全サーバーのホームディレクトリは吹き飛ばされました。アップデート対象サー
# バーも例外ではありません。ですがアップデート対象サーバーは予めフルリセットして
# いたので気付きませんでした。
#
# 無事、アップデートが完了したことに安心して、本番環境にも上記スクリプトを適用し
# ます。するとどうしたことでしょう。サーバーが全部飛んでビジネスは傾き、苦情対処
# の為に派遣社員を雇うことになりました。
#
# さて。上記の滑稽なスクリプトが出来てしまった理由は、統一されたスクリプトが「サ
# ーバーのホームディレクトリを初期化する」というスクリプトにいろんなものを書き加
# えて、条件判定するものを書いた、というのが原因でした。実際のスクリプトはもっと
# 機能が多く、行数が長かったので、条件判定とかに関係なく実行されてしまう部分が残
# っていることに気付きませんでした。
#
# というのがだいたいのシナリオなのではないかと勝手に想像しています。
#
# さてみなさん、この手の間抜けなミスしたことあるんじゃないですか?実のところ私は
# 何度かあります。
#
# こうした間抜けなミスから救ってくれるのは、スタンバイサーバーはなくスナップショ
# ットであることが非常に多いです。結局のところ、最初に「置いて」おいた「ホットス
# タンバイがバックアップじゃないとかその手の話」が重要だという話ですね。
#
#
#
#
#
#
#
#
#
#
#
# ところでホスティング屋がいくらなんでもこんな間抜けなミスはしないだろうとお考え
# の紳士淑女も多数いらっしゃるとは思いますが、これを書く前に予備調査としてホステ
# ィング会社の人 3 名に話を聞いたところ、こういう間抜けなミスをすることもあり
# そうだと思った次第です。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment