https://yakst.com/ja/tags
Yakst - sre
2019-09-06T08:20:46+09:00
Yakst
https://yakst.com/ja/posts/5588
2019-09-06T08:20:46+09:00
2019-09-06T08:20:46+09:00
インシデント指揮官トレーニングの手引き
<p><em>私が <a href="https://www.hashicorp.com/">Hashicorp</a> で担った最初の仕事のひとつは、社内向けのインシデント指揮官のトレーニング資料を作ることでした。</em>
<em>これは私自身がインシデントへの対処にあたりながら何年ものあいだ肌身に感じてきた、あらゆる類の考えをまとめ上げる良い機会となり、最高に面白いタスクでした。</em></p>
<p><em>以下は私の書いたトレーニング資料、ほぼそのままです。</em>
<em>あなたがインシデントレスポンスのポリシーを定義するにせよ、即興でインシデントレスポンスを行うにせよ、お役に立てたら幸いです。では、どうぞ!</em></p>
<h3>さて、インシデント指揮官になることをお望みですね。</h3>
<p>私たちのインシデントレスポンスのやりかたにおいては、<strong>インシデント指揮官</strong> の存在が欠かせません。
インシデント発生時に指揮をとるのは、やりがいのある仕事です。
しかし、おそらくあなたの仕事で発揮したことのないようなスキルが必要になります。
それはもしかすると、あなたがこれまでスキルだと思ったことすらないかもしれないようなスキルです!</p>
<p>このドキュメントでは、インシデント指揮官になるにはどのようなことが必要かを説明します。
その後で、インシデントの最中にしばしば間違った方向へ行ってしまいがちな事柄の概要や、そのような事態に取り組むための戦略について述べていきます。</p>
<p>インシデント指揮官になるには、まず以下のことをやりましょう:</p>
<ol>
<li>このドキュメントを読む。</li>
<li>インシデント指揮官リファレンスに親しむ。<em>(筆者注: ここで言及しているリファレンスシートも将来ブログ記事で公開できるように、許可を得ようと試みるつもりです。基本的には、公式な手続きを解説したステップごとの指示書です)</em></li>
<li>実際のインシデントに取り組んでいるインシデント指揮官のやりかたを見て学ぶ</li>
<li><strong>@inccom</strong> のSlackグループに入れてもらう</li>
</ol>
<p>以上のステップを完了できたら、おめでとうございます!
これでインシデント指揮官の仲間入りです。
次に誰かが <strong>@inccom</strong> グループにpingしたら、自ら申し出て仕事を引き受けましょう。
インシデント指揮官のリファレンスを参照するのを忘れずに。
Slackのどのチャネルでも <code>start incident</code> と叩けば出てきますから。</p>
<h4>インシデント指揮官は何をする?</h4>
<p>インシデント指揮官の仕事は、インシデントを解決に向けて動かしていくことです。
しかし、インシデント指揮官の仕事は問題箇所を直すことでは<em>ありません</em>。</p>
<p>インシデント指揮官は、他に手を動かす人が誰もいない状況でもないかぎり、自分でターミナルを触ったりグラフを見たりデプロイしたりしてはいけません。
特にエンジニアリングのバックグラウンドを持つ人にとっては、これはやりづらいと感じられるかもしれません。
おそらくは、なんだか自分が役に立つ仕事をしていないかのような気分になるでしょう。
しかし覚えておくべきことは、普段のあなたの仕事が何であれ、インシデント指揮官になったときはインシデント指揮官に徹するのがあなたの仕事だということです。</p>
<p>自分では何も直すことなく、インシデント対応を解決に向けて動かすにはどうしたら良いのでしょうか?
まず、複数人のチームで取り組めばインシデント対応は前進します。
インシデント指揮官の仕事は、チームが同じ認識を持つ状態を作り上げてキープすることです。
それは集中を要する高度なタスクで、3つの要素からなります:</p>
<ol>
<li>インシデント対応のための階層型組織を浸透させる</li>
<li>究極の意思決定者になる</li>
<li>情報展開をファシリテートする</li>
</ol>
<p>上記について順番に解説していきましょう。</p>
<h4>インシデント対応のための階層型組織を浸透させる</h4>
<p>インシデント発生時は、問題に取り組む人たち全員が特定の役割を持っています。
決まり事として、ロールが明示的にアサイン<em>されていない</em>人は、問題に取り組んではいけません。
関与する全ての人が、自分が何の責務を負い、誰に対し説明責任があるのかを知っていることが肝要です。</p>
<p>インシデントレスポンスには、早急に任命された後インシデントがクローズされるまで欠かすことのできない、4つの <strong>主要ロール</strong> があります。
インシデント指揮官リファレンスシートに詳しく書かれている通り、インシデント指揮官には、Slackチャンネルのトピックで主要ロールに誰が就いているのかを、最新の状態に保つ責務があります。</p>
<p>主要ロールは以下の通りです。</p>
<ul>
<li><strong>インシデント指揮官 (IC = Incident Commander)</strong> - あなたです!</li>
<li><strong>主任SME (SME = Subject Matter Expert)</strong> - 問題に対し技術的な調査を行う</li>
<li><strong>外部通信役 (External Liaison)</strong> - インシデントに関する顧客との連絡を司る</li>
<li><strong>書記官 (Scribe)</strong> - Slackにインシデントに関するノートを書き、フォローアップが必要な項目を追い続ける</li>
</ul>
<p>インシデントの最初期には、インシデント指揮官としてのあなたは、上記のうち複数のロールを兼任する必要があるかもしれません。
ですが契機が来たらすみやかに、他のロールは他の人にアサインしましょう。
もしくは、あなた自身が問題解決に最適な人物ならば、他の人をインシデント指揮官にアサインして、自分自身は主任SMEを務めましょう。</p>
<p>誰かをロールにアサインするときは、宣言的にやるのが良いです。
「誰か、書記をやってくれる人はいないかな?」と尋ねる代わりに、誰か特定の人を選んで「<code>(相手の名前)</code>、このインシデントの書記官をやってくれないか?」と言ってみましょう。</p>
<p>インシデントレスポンスに4人だけでは足りないことは非常によくあります。
しかし前述したように、インシデントに関与する人たち全員が、自分が何の責務を負い、誰に対し説明責任があるのかを知っていることが肝要です。
このため、誰か新しい人がインシデントに取り組み始めたいというときは、その人を主要ロールにアサインするか、すでにアサインされている人の直属のロールにアサインしなければなりません。
たとえば、外部連絡役が顧客とのコミュニケーションで手いっぱいになっていて助けを求めていたならば、次に相当するようなことを言ってみると良いでしょう:
「<code>(相手の名前)</code>、これからは君は副外部通信役だ。報告先は <code>外部通信役</code> である。確認してほしい。」</p>
<p>誰が何に責任を持つのかについては、インシデントに関わる全員が、インシデント管理者へ最終的な判断を仰ぐ必要があります。
これは究極の意思決定者たることの一部です。</p>
<h4>柔軟さこそがあなたの特権</h4>
<p>事前に定められたインシデントの階層型組織は、大半のシナリオに合致するようデザインされたものです。
ときには、その組織構造ではあまり<em>うまくいかない</em>インシデントもあるでしょう。
インシデント指揮官は、その時々のケースに合わせて、目の前のインシデントに一番合う形へ階層型組織を変更する権限を持ちます。
慣例に固執するあまり、あなたのもたらす効果が阻害されることがないようにすることが重要です。
あなたは、その場に合うようにシステムを一時的に変更する力を持つのです。</p>
<p>たとえば、主任SMEを複数設けるのもアリかもしれません。
もしインシデントが複数システムに跨って影響するなら、各システムに対しSMEを選んでも良いでしょう。
複数のSMEをアサインする手続きはSMEが一人の場合と同じですし、彼ら彼女らの責任についても同様です。
こんな風に言うと良いでしょう:「<code>(相手の名前)</code>、これから君は <code>(特定の責任範囲)</code> における主任SMEである。確認してほしい。」</p>
<h4>究極の意思決定者であれ</h4>
<p>インシデント指揮官が「究極の意思決定者」だと言われるとき、それはなんらかの<em>より優れた</em>決定ができることを期待されているという意味ではありません。
私たちの意味するところは、インシデント関係者の全員が、インシデント指揮官の決定を最終的で拘束力のあるものとして受け止めるということです。
いつも正しい決定をすることにそこまで重きを置くのではなく、あなたが<em>一つの</em>決定を下すことが重要なのです。</p>
<p>インシデント指揮官が決断を下せる状態にあることで、他の人たちはインシデントに要求されるがままに振る舞えるようになります。
果たしてあの対応でよかったんだろうかと後悔したり、メリットデメリットを検討するのに多くの時間を割いたりする代わりに、皆はあなたに重要な決断を託すことができるのです。
情報さえ入手できれば、あなたはどの道に進むのが一番良いかを選ぶことができるでしょう。
そしてあなたの決断は最終的で拘束力を持ちますから、決断そのものによって皆が同じ認識を持つ状態を保てるようになります。</p>
<p>もう一つ、前述の点ほど明確ではないけれども、究極の意思決定者としてのインシデント指揮官の恩恵があります。
皆が本番環境で起きている問題について調べていたり、顧客対応に追われていたりする最中は、各人は絶え間なく他の人たちが把握していないコンテキストを構築しています。
そのような人たちは自分の心理状況を十分に説明し、インシデント指揮官が素直な内容で重要な決定を下せるよう協力しましょう。
これはインシデントが起きている間、情報が十分に行き渡るようにする手段の一つです。</p>
<h4>情報展開をファシリテートせよ</h4>
<p>情報の流れを管理することは、インシデント指揮官にとってただ一つ、最も重要な責務です。</p>
<p>インシデントの最中の情報というと、たいてい私たちは遠隔システムから出てくるデータや、実行するコマンドの出力結果について考えます。
私たちが一番手軽に広めがちなのは、この手の情報です。
しかしインシデント指揮官は、このように具体的で、見つかっている情報だけを気にしていれば良いわけではありません。</p>
<p>インシデントレスポンスでは、関与している人たち全員の頭の中にも情報があります。
誰もが、インシデントに対して異なる視点を持っています。
そして概してこの人たちは、他の人たちが探しているイメージの断片を自分が持っていることに気づいていません。
したがってインシデント指揮官は常に、有用なコンテキストを皆の頭の中から引き出し、共有ナレッジの中に持ってくる機会を窺うべきです。</p>
<p>情報展開をファシリテートする上で鍵となるのは、 <strong>シグナル対ノイズ比</strong> です。
「シグナル」はインシデント解決に向けて利用できる情報を意味し、「ノイズ」はそうではない情報を意味します。
このため、誰かに届ける必要のある情報が存在するときは、インシデント指揮官はシグナルを強化して、正しい所に届くようにしましょう。
逆に、チャンネル内の誰かが関係ないシステムの挙動をアップデートしてきたり、ビデオ会議の中の誰かが重複した状況アップデートを求めてたりしていたら、ノイズを抑制するのがあなたの仕事です。</p>
<p>簡潔にいえば、インシデント指揮官は、全てのインシデント関連のコミュニケーションチャネルを高シグナル・低ノイズな環境に保つ責任を持つのです。</p>
<h3>インシデントレスポンスが横道に逸れるとき</h3>
<p>インシデントは一つ一つ異なるものですが、インシデントレスポンスの方向性が失われてしまう典型例をいくつか知っておくと便利です。
これらのアンチパターンに陥っていると気づいたら、チームが元の道に戻れるよう、以下に示す戦略を適用しましょう。</p>
<h4>主題がブレる</h4>
<p>おそらく最もありがちなインシデントレスポンスのアンチパターンは <strong>主題のブレ (thematic vagabonding)</strong> です。
これは、対応者が一般的な調査領域に対して次から次へと手をつけては他へ移っているような状態です。
以下のようなことに気づいたら、主題のブレが生じているサインです:</p>
<ul>
<li>対応者が、具体的に何が悪そうなのかについて考えを述べることなく、手がかりを求めていろいろなところを探し回る。</li>
<li>問題の性質に対する考えが「たぶんAPIレイヤーが何かおかしい」程度の曖昧さに留まっている。曖昧なアイデアを行動につながる理論へ落とし込めるような推進力に欠けている。</li>
<li>主任SMEの一連の考えについていくのが難しくなっている。</li>
</ul>
<p>主題のブレはノイズの根源です。たくさんの情報を生み出しますが、意味のある情報としてまとめられるものではありません。</p>
<p>もし主題のブレに気づいたら、主任SMEに対して、どのような考えから各々のアクションを取っているのかを聞くのを始めてみると良いでしょう。
たとえば「データーベースのエラーログを調べている」と言われたら、「データベースにエラーがありそうだという考えに至った理由は何かな?」といった返しをしてみます。
調査の中、どのようにしてデータベースの課題から問題が引き起こされうるのかや、なぜデータベースのエラーログによって根本原因を突き止められそうなのかをを説明するよう、主任SMEたちをかき立ててみましょう。</p>
<p>もし主題のブレが主任SMEからではなく他のロールの人たちから生じたのならば、その人たちの注目を主任SMEが調べていることへ向けるのが良いでしょう。
たとえば、主任SMEがロードバランサーの異常を調べているのに、他の誰かが「最近のデプロイで大きな変更がなかったか調べてみようか」と提案してきたら、あなたは「その前に、ロードバランサーの異常へ十分に目を通しておきたい。<code><主任SMEの名前></code>、怪しそうなログの内容を解釈するのに助けがいるんじゃないかな?」と言ってみてもよいでしょう。</p>
<h4>視野狭窄に陥る</h4>
<p>視野狭窄 (tunnel vision) はある意味、主題のブレとは逆の現象です。
対応者が、もはや生産的なアイデアではないにも関わらず、間違っている可能性のある特定の考えにハマってしまった状態です。
視野狭窄は、調査担当者が、調査を次のフェーズへ推し進めるためのシグナルを入手し損ねた時に起こります。</p>
<p>主題のブレとは逆の症状ではありますが、視野狭窄に対しては似たようなアプローチで取り組むことができます。
調査担当者に、どのような動機から調査しているのかを詳しく説明してもらうのです。
ときどき、説明を繰り返しているうちに本人たちがドツボにはまっているのに自分で気づいたりします。</p>
<p>もう一つ視野狭窄を止める上で便利な戦略は、対応者に<em>反証となる</em>エビデンスを探してもらうことです。
たとえば、主任SMEが調査中に特定のコード変更がまずかったのだという考えにハマっているのだけれども、実を結ぶ様子がみられなかったら、こう尋ねてみましょう。
「もし、この変更が問題の原因では<em>ない</em>ことを証明するとしたら、どうやって証明する?」
このように概念的な見方の転換を行うことで、必然的に調査者は狭いトンネルの外のアイデアに目を向けることとなり、しばしば前進を再開することにつながります。</p>
<h4>一貫性のないメンタルモデル</h4>
<p>効果的に協業するために、インシデント対応者たちは、調査中の問題がどのようにして引き起こされうるかについて、一式のアイデアを共有している必要があります。
このようなアイデアのことを <strong>仮説 (hypotheses)</strong> と呼びます。</p>
<p>仮説が不足していたり不十分なコミュニケーション下にあったりすると、インシデント対応は停滞する傾向にあります。
インシデント指揮官にとっては、どの仮説がいま盛り上がっていて、どの仮説がすでに却下されているのか、対応者全員が同じ認識のもとにあるようにすることも仕事の一つです。
さらに、どの仮説を契機に皆が調査のアクションへ向かっているのかの経過を追うのは良い考えでしょう。
もしあなたが、なぜ主任SMEがキューイングのメトリクスについて調べているのかはっきり理解できないのであれば、先に進むより前に、おそらく彼ら彼女らの思考プロセスを説明するようお願いしてみるべきです。</p>
<p>ときに、調査対象となるような明確な仮説がもう残っていない状態になると、インシデント対応の進捗は遅滞するか停止します。
この状態が明言されないと、対応状況は主題のブレや視野狭窄に陥ってしまうことがあります。
あなたが仮説の枯渇に気づいたときは、進行中の調査を一旦すべて止めてもらい、新しい仮説を得るべくブレインストーミングするよう呼びかけることが有用です。
すると、一部のメンバーにはこれが時間の無駄のように感じられ、反発を受けることもあるでしょう。
しかし時折、具体的な復旧作業に進むためには、抽象的なアイデア思考をする必要があるのです。</p>
<h4>インシデント指揮官と主任SME間の分断</h4>
<p>インシデント指揮官と主任SMEの認識がズレると、もっともまずい大惨事につながります。
インシデントレスポンスでの取り組みにおける全メンバー間の関係の中で、この二者間の関係はもっとも重要なものです。
実際、あまりにも大事なので、インシデント指揮官と主任SMEの関係を良好に保つことだけを目的としたプロセスがあります。
これを、 <strong>ハンズオフ状況アップデート (hands-off status update)</strong> と呼びます。</p>
<p>インシデントの最初期、インシデント指揮官と主任SMEがビデオ通話にアサインされて参加したら、インシデント指揮官は速やかにハンズオフ状況アップデートを要請しましょう。
「ハンズオフ」というからには、状況アップデートが終わるまでの間、どちらの側もキーボードを叩いたりクリックしたり、また何かを読んだりしてはいけません。
両者が、完全にお互いとのコミュニケーションだけに集中する必要があるのです。</p>
<p>ハンズオフ状況アップデートは、5つの質問から成り立ちます:</p>
<ul>
<li><p><strong>ハンズオフ状況アップデートをしたいのだが、準備は良いか?</strong>
この質問は、ハンズオフ状況アップデートが始まることを改めて知らせて、インシデント指揮官と主任SMEがそれに集中するよう促します。
もし、主任SMEがまだ準備<em>できていない</em>と言うのであれば、今から60秒後だったらできるか聞いてみましょう。</p></li>
<li><p><strong>想定できる範囲で、どのくらいの影響が出ていると思うか?</strong>
現在進行形で調査中の問題によって、何人の顧客が影響を受けているか、どれくらいカスタマーエクスペリエンスに混乱が生じているかは、常に明確であるとは限りません。
それでも、主任SMEに一考してもらうのは役に立つものです。</p></li>
<li><p><strong>ありうる根本原因は何だと考えているか?</strong>
この質問は、主題のブレや視野狭窄に陥るのを、未然に防ぐのに役立ちます。
主任SMEが思考プロセスを声を出して明言することにより、ビデオ会議の中の全員 (主任SMEたち自身を含む) が、このさき進む道をはっきり意識できるようになります。</p></li>
<li><p><strong>次に取れる一手は?</strong>
根本原因に対する認識が薄れないうちに、問題解決の次のステップを確立する機会を設けましょう。
インシデント指揮官にとっては、主任SMEの言っている次の一手が、前の二つの質問で聞いた想定影響と根本原因からみて妥当であるものかを確認することが責務です。</p></li>
<li><p><strong>協力を要請したい人はいるか?</strong>
最後に、誰かインシデント対応を進める上で有用なスキルを持った個人がいるか、主任SMEに考えてもらう機会を作ります。
誰かの名前が挙がったら、全力でインシデントレスポンスのチャンネルやビデオ会議に参加してもらうよう働きかけ、さらに可能であれば、彼ら彼女らを主任SME直属のSMEに任命しましょう。</p></li>
</ul>
<h3>インシデント指揮官リファレンスシート</h3>
<p>一貫性のある役割分担や情報のハンドリングを確かなものにするために、インシデント指揮官のリファレンスシート内に標準的な手続きを定義しました。
インシデント指揮官に志願する前に、リファレンスシートを見直しましょう。
読みながら、インシデント指揮官の3つの責務を思い出してください。</p>
<ol>
<li>インシデント対応のための階層型組織を浸透させる</li>
<li>究極の意思決定者になる</li>
<li>情報展開をファシリテートする</li>
</ol>
<p><em>※訳注: 現時点では、リファレンスシートそのものは公開がHashiCorp社内に限られているため、当記事上での公開はありません。</em></p>
<h3>おすすめのリソース</h3>
<ul>
<li><p>📄 <a href="http://jeffreymbradshaw.net/publications/Common_Ground_Single.pdf">Common Ground and Coordination in Joint Activity</a>
この論文は認識の集結、すなわち私たちがインシデントの解決に当たるためにやることを、「共通見地 (common ground)」の観点から分析しています。
論文では、最も頻繁に「共通見地」が崩壊してしまうありかたの一つが記述されています。
筆者はこれを <strong>根本的な共通見地の破綻 (Fundamental Common Ground Breakdown)</strong> と呼んでおり、これを理解し認識することで、より効果的なインシデント指揮官になれるでしょう。</p></li>
<li><p>🎬 <a href="https://youtu.be/qKrLPY_8Cyk">How to Create a Differential Diagnosis</a>
インシデントレスポンスで私たちが行うことは、医師が診断を下そうとするときに行うことと多くの共通点があります。
両ケースとも調査者は、非常に複雑なシステムと、容赦ない時間の経過、そしてシステムの挙動を説明するにあたり限られた戦略上の兵器を手に直面することになります。
このビデオはソフトウェアエンジニアではなく医学生を対象にしたものではありますが、インシデント指揮官は差分診断の原則を学び、インシデントレスポンスを体系化する上で大変な恩恵を得ることができるでしょう。</p></li>
</ul>
meiq
https://yakst.com/ja/posts/5564
2019-09-05T08:08:39+09:00
2019-09-05T08:08:39+09:00
「なんにもしない」スクリプトを書く: 段階的な自動化を進めるために
<p>どんな運用チームにも、まだ自動化するところまで手が回っていない手作業があるものです。
<a href="https://landing.google.com/sre/sre-book/chapters/eliminating-toil/">トイル (toil)</a> が完全に無くなることは決してありません。</p>
<p>成長企業のチームに非常にありがちなのが、インフラの変更手続きやユーザーアカウントのプロビジョニングが、最大のトイル源となっているケースです。
後者の例について手順の一部を書き出してみると、たとえば以下のようになるでしょう:</p>
<ol>
<li>ユーザーのSSHキーペアを作成する</li>
<li>公開鍵をGitにコミットしてmasterにプッシュする</li>
<li>ビルドジョブの完了を待つ</li>
<li>従業員のディレクトリからユーザーのメールアドレスを見つける</li>
<li>1Password経由でユーザーに秘密鍵を送信する</li>
</ol>
<p>これは比較的短い例ですが、一連のプロセスが20ステップに達することもあります。
またあるときは作業が分岐するケース、作業を進めるとともに経過を追っていかなければならないような特殊ケースが発生することもあるでしょう。
時が経つにつれ、このような手順は手のつけようのないほど大きく複雑になってしまう可能性があります。</p>
<p>こういった手続きは、考える必要のあることはほとんどないにも関わらずじっと注視していなければならないので、フラストレーションが溜まるものです。
全力で注意を向けていなければらならないのに、私たちは面白い問題や充実した解決策によって報われることはありません。単に、終わったらチェックボックスに作業完了のチェックが入るだけです。
このような手続きのことを、私は <strong>スログ (slog, 長くつらい仕事)</strong> と呼んでいます。</p>
<p>この手の手続きこそ、まさに自動化の対象といえるでしょう。
個々のどのステップも、どうやって自動化したらいいかは容易にわかります。
そしてコンピュータは私たちよりもずっと速く、正確に、かつ<a href="https://risk-engineering.org/concept/Rasmussen-practical-drift">実務上のブレ (practical drift)</a>に至りにくく、忠実に指示を実行してくれることも知っています。</p>
<p>しかしながら、ときにスログの自動化は1か0かの命題のように感じられます。
ええ、ステップ2やステップ5を実行するスクリプトは書けるでしょう。
しかし、それだけでは手続きの煩わしさを<em>本当に</em>減らすことはできません。
単一の目的を持ったスクリプトを別の規約や期待に応えるよう拡張することにつながり、今度はスクリプトを使う上で複数ステップからなる手続きに従う羽目になるかもしれません。</p>
<p>このような無駄の認知こそ、手作業のスログから脱出するために本当に解決しなければならない問題です。
私は、そのようなときにかなりの確度で役立つアプローチを見つけました: 「なんにもしない」スクリプトを書くことです。</p>
<h4>「なんにもしない」スクリプトを書く</h4>
<p>ほぼどのようなスログであっても、<strong>なんにもしないスクリプト</strong> へ落とし込むことができます。
なんにもしないスクリプトとは、スログの手続きをコード化したスクリプトで、各ステップを関数の中にカプセル化したものです。たとえば上記の手順なら以下のように、なんにもしないスクリプトを書けるでしょう:</p>
<pre><code>import sys
def wait_for_enter():
raw_input("Press Enter to continue: ")
class CreateSSHKeypairStep(object):
def run(self, context):
print("Run:")
print(" ssh-keygen -t rsa -f ~/{0}".format(context["username"]))
wait_for_enter()
class GitCommitStep(object):
def run(self, context):
print("Copy ~/new_key.pub into the `user_keys` Git repository, then run:")
print(" git commit {0}".format(context["username"]))
print(" git push")
wait_for_enter()
class WaitForBuildStep(object):
build_url = "http://example.com/builds/user_keys"
def run(self, context):
print("Wait for the build job at {0} to finish".format(self.build_url))
wait_for_enter()
class RetrieveUserEmailStep(object):
dir_url = "http://example.com/directory"
def run(self, context):
print("Go to {0}".format(self.dir_url))
print("Find the email address for user `{0}`".format(context["username"]))
context["email"] = raw_input("Paste the email address and press enter: ")
class SendPrivateKeyStep(object):
def run(self, context):
print("Go to 1Password")
print("Paste the contents of ~/new_key into a new document")
print("Share the document with {0}".format(context["email"]))
wait_for_enter()
if __name__ == "__main__":
context = {"username": sys.argv[1]}
procedure = [
CreateSSHKeypairStep(),
GitCommitStep(),
WaitForBuildStep(),
RetrieveUserEmailStep(),
SendPrivateKeyStep(),
]
for step in procedure:
step.run(context)
print("Done.")
</code></pre>
<p>実際のところ、このスクリプトは手順にあるステップに関して何も<em>しません</em>。
それゆえに、なんにもしないスクリプトと呼んでいます。
1つのタイミングにつき1つのステップをユーザーに見せて、手作業が完了するのを待つだけです。</p>
<p>初めは一見、このようなスクリプトに意味があるとは考えにくいかもしれません。
おそらくは、単に手順を読みづらくしただけなのではないかと。
ですが、なんにもしないスクリプトの効果はてきめんです:</p>
<ul>
<li>今やっていることを見失い、ステップを飛ばしてしまうような失敗を減らせます。その結果、スログに集中して注力することが楽になります。</li>
<li>手続きの各プロセスが関数の中にカプセル化されているので、ステップ内のテキストを、自動化されたアクションをとるコードに置き換えていくことが可能です。</li>
<li>しだいに、あなたは便利なステップのライブラリを開発するようになり、将来的に自動化のタスクの効率が向上するでしょう。</li>
</ul>
<p>なんにもしないスクリプトは、あなたのチームの手作業を減らすことはありません。
しかしタスクを自動化するに至るまでのハードルを下げ、チームが徐々にトイルを削減するのに役立つことでしょう。</p>
meiq