Skip to content

Instantly share code, notes, and snippets.

@shunirr
Forked from ssig33/yosou.rb
Created June 25, 2012 08:19
Show Gist options
  • Save shunirr/2987338 to your computer and use it in GitHub Desktop.
Save shunirr/2987338 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