達人が語る,インフラエンジニアの心得
第10回 インフラエンジニアの道具
さて今回は,インフラエンジニアとしてやっていくための道具?についてちょっと書いてみたいと思います。ただ正直,今回の内容は若干ジェネレーションギャップがあるかもしれません。あったらスミマセン(笑)。
インフラエンジニアといっても,その働く環境は千差万別です。まあインフラエンジニアという定義が広すぎるというのもありますが。私は自分の働いてきた環境が基準なので,それを前提にしてみたいと思います。
入門編
何はなくともターミナル
インフラエンジニアにとって何よりも重要なのはコンソールというかターミナルです。ttyやptyのことです。サーバだろうがルータだろうが,作業の9割以上はターミナル上で行います。─あくまで筆者のいた環境のことですよ。Windowsサーバとかは考えていませんすみません。
昔の話をしてすみませんが,1990年代にはまだ「TTY端末」というものがたくさんありました。TTY端末というのは,いわゆるシリアルコンソールまたはダム端末と呼ばれる,シリアルポートで接続するモニタとキーボードの環境です。ターミナルソフトで「VT100」というモードや設定を見たことがある人もいると思いますが,このVT100というのは昔のダム端末の商品名です。ターミナルの標準が80×24というのはそのころの名残りですね。
まあ昔話はさておき,サーバに接続するとき大概は自分のPCからターミナルソフトを使用してsshで接続,というのがよくあるパターンだと思いますが,そうは言ってもコンソール接続しないといけないケースも多々あるはずです。シリアルポートでコンソール接続することもあれば,モニタとキーボードをそのまま接続することもあるでしょうが,いずれにしてもキャラ端末(疑似ダム端末)の環境で目的を達しないといけません。
当時現役というか下っ端だったころは,シリアルケーブルとジェンダーチェンジャを山ほど持っていました。形状がD-Sub25/D-Sub9/RJ45,配線がクロス/ストレートというパターンがあるので,そのどれにでも自分のPCを接続できる必要があったのです。もちろんPCは直でD-Sub9ポートが出ているもの以外は論外でした。そして当時の定番ソフトはTera Termです。
…って,気付いたらまた昔話ですね。
ターミナルを自由自在に使えるというのは,インフラエンジニアにとっての第一歩でありまた遠大な目標でもあります。自分のPCでターミナルソフトの設定もバッチリでサーバ側の設定もバッチリなら快適に作業できるでしょうが,インフラエンジニアたるもの普段使わない端末,設定が全然自分好みじゃないサーバでも,スラスラと作業できなくてはなりません。
sttyの設定を自在に操るあたりは初歩の初歩,キーボードの日本語配列,英語配列を気にせず使えるとか,ページ制御がおかしい状態で全画面制御をするソフトを一切使わない(エディタやページャ)とか,たとえばエコーバックがまったくなくなっている状態で勘で設定ファイルを編集する,ということもありました。
私の世代の直前くらいだと「edを使えedを」という流行文句(?)があったくらいで,ページではなくラインでも作業できる,というのはひとつの重要なスキルです。「いまどきそんなことないよ」というのもたしかにそうかもしれませんが,たとえばキーボードの配列が違ったり,ページングが効かない状態で「お手あげです」というよりは,苦にせず作業できるほうがカッコいいでしょう。
catやechoを駆使して設定ファイルを一から作るとか,やったことある人も結構いるんではないでしょうか(結構はいないかな?)。あとはgrepやリダイレクトやheadやtailを使って,いかにページングというかtty制御なしで作業したりというのもよくあるパターンだと思います。
ここで1つtipsを。コンソールとかターミナルがおかしくなったときは,stty saneと叩くとたいがい正常に戻りますので覚えていて損はないと思います。
そしてvi
あとやっぱり,インフラエンジニアだとviをいかに自由自在に,しかもdefaultの設定で使いこなせるか,というのもあると思います。
vimとかだとすごい高機能で,設定もバリバリ書いておけばかなり作業の効率化もできると思いますが,nativeのviで.inputrcもなにもない状態で,edコマンドなどを駆使してガリガリ作業する様はすごくカッコいいものです。
とくに,インフラエンジニアがvi使うときは設定ファイルをいじってることが多いと思いますが,viで一番いいキーアサインは.(ピリオド)だと思います。.j や .n を連打したことは誰でもあるんではないでしょうか。
/fooRETcwbarESCn.n.n.n.n.n.
とかですね。まあそういうときは
:%s/foo/bar/g
かもしれませんが。
dd.......
とかもよくありがちです。
インフラエンジニアに誇りをもってる人はまず必ずviが好きだと思います。まあ私は最近プログラムを書くことが多いのでEmacsばかり使っていますが,でも設定関連の作業などはviです。/etcの下に hosts~ とかあるとわりとゾッとしますよね。
シェルも必須
viと並んで重要なのがシェルを自由に使いこなせるかです。私が下っ端のころは,ちょうどshとcshの戦いが盛んで,それがそのあとtcshとbashの戦いに引き継がれていたころですが,いまはもうあまりcsh系というのは無いような気がします。もうbashあたりは必ず標準で入っていますね。
bashの場合も.bashrcとかは駆使せず,必要な環境変数はその場で入れて必要ならexportして使えるのが良いインフラエンジニアです。もちろん普段自分が使う環境はバリバリカスタマイズして快適に作業しても良いと思いますが。
そして,bashに限らずCiscoのIOSとかでもそうですが,いわゆるreadline,もしくはreadline的なインターフェースを用意しているものは多いので,readlineの操作は一通り覚えておきたいところです。
なにかあればmanを引く
もう一つ重要なのがmanですね。
インフラエンジニアは自分があまり詳しくない環境のものでも問題をshootできるのがいいエンジニアですから,manを引くのは必須です。日本語manが入っているとは限らないので,英語のmanもちゃんと挫けず読めなければいけません。というか,挫けるようではインフラエンジニアはやっていられませんが。
Linuxサーバ編
ここまでの,tty関連(キーボード含む),vi,bash(というかshell),manあたりがまずはインフラエンジニア共通で必須な道具の入門編というところだと思います。
この先で次に必要になるのは,インフラエンジニアとしての特性というか方向性によって差が出てくる気もしますが,ここではサーバ(Linux)で作業をするエンジニアとして話を進めてみます。
sshは必須
まずはやはりsshを自在に使えるかというのがあると思います。sshの概念,オプション,ポートフォワード,sshのSTDIN/STDOUTあたりを自由自在に使いこなせると,結構インフラエンジニアとして一皮剥けるような気がします。特にポートフォワードを自由に使えると,かなり武器が増える感じではないでしょうか。
またssh(に限らずたいていのLinux/UNIX系コマンドがそうですが)もSTDIN/STDOUTを取ることを知るのも重要です。
tar cf . - | ssh hostname '(cd dir; tar xf -)'
とかいった操作は結構よくあるのではないでしょうか。
知りたいことはパケットに聞け
次に,これは以前に書いたと思いますが,これを自在に使えればほぼ無敵というのが,tcpdumpとstraceです。「パケットは嘘をつかない」というのは私の名言ですが(笑),生パケットを見れればたいがいのことはわかります。もちろん暗号化されていればわかりません。
もう1つがkernelのsystem callを見ることのできるstraceです。tcpdumpやstraceの出力結果を見るのは忍耐が必要ですが,慣れれば短時間でトラブルなどの原因を見つけることができるようになります。
「とりあえず使える」だけではダメ
あとここまで出ていないもので比較的必須に近いものと言えば,gdbなどのデバッガや,stringsやldd,それに正規表現あたりでしょうか。正規表現は比較的というより必須ですね。
これらを自由自在に使いこなすことができるようになれば,とりあえずインフラエンジニアに必要な道具はもっていると言えると思います。あとはその時その時に応じた道具を揃えていけばいいでしょう。ただ,「自由自在」というところがポイントです。前述したように,とりあえず使える,とかではなくて,普段自分で使っていないような環境,状況でも問題なく作業ができるということが,重要だと思います。
たとえば出先でコンソールしかない場合,人のPCを借りて作業する場合,そういう普段と違う状況でこそ真価が問われるというものです。所詮Linuxなんて,kernel,tty,shell,networkあたりが組み合わさって動いているという点においては20年前のBSDやSunOSと何ら変わりません。ということは,こういった基本構造を把握して自在にいじれたら,それはインフラエンジニアとしての基礎体力が高いということになると思います。
あ,最後に,タッチタイピングはできたほうがいいですよ!!

