2024.12.19
システムの穴を運用でカバーしようとしてミス多発… バグが大量発生、決算が合わない状態から業務効率化を実現するまで
whenはいつも見ているぞというお話(全1記事)
リンクをコピー
記事をブックマーク
市田友宏氏(以下、市田):私、市田と申します。よろしくお願いします。今日は、whenです。みなさんたぶんAnsible使うと、まず一番最初に使うのではないかという構文です。whenについてのやらかし話を紹介したいと思います。
仕事は、某通信キャリアでパケットゲートウェイという、ちょっとマニアックなシステムの開発をやっています。サーバーでもないネットワーク機器でもない装置を、なんとかがんばって自動化をしようという業務をしつつ、開発もしつつ、Ansibleはもう3年ぐらい触っています。
今回のお話ですが、whenです。whenについて、ifとは微妙に違うぞというお話をしたいと思います。
まず私がやりたかったことです。そのうちの1つですが、自分が管理しているサーバーで、障害や作業でメンテナンスするためによく切り離しをします。これをAnsible使って自動で切り離しましょうと。
今までは手でポチポチやっていたのですが、Ansibleで自動で切り離して、手動オぺレーションをなくしていきましょうというのを仕事の1つとしてやっていました。
ここの処理ですが、ちょっとフローで簡単に表しています。ユーザーが使っているので、 最初にそのユーザーを追い出さないといけなくて、ユーザーを切断するというPlaybookを書きました。このサーバーは携帯などで使っているサーバーで、100万ぐらいセッションがあるので、けっこう待っていなければいけないんです。
数十分待つのですが、セッションが0になるまで数十分待っていましょうとループ処理を入れて、めでたくセッションがなくなって追い出せたら、最後にサーバーを落としましょうというPlaybookをRoleで作っていました。
やらかしは、このループのところです。ループのところでやらかしてしまいました。このループの処理は、このwith_sequenceというところで、for文みたいな感じで100回やるというループ文を書いています。
私もちょっと知識がないので、これをwhile的に書けるテクニックを持っている方がいらっしゃったら、ぜひ教えてほしいです。
今のところ、for文で100回繰り返して、セッションがなくなったら空回り処理するという動作にしています。このようなループ文を書いてみました。
これに、wait.ymlという名前をつけてみました。実際、このwait.ymlの中はどうしてるかというと、実際数十分待たなければいけないので、1分に区切って、それをひたすらループしています。途中でそのお客さんのセッション数を初期化して、 そのあとにもう1回今いくつぐらいユーザーがいるのかをincludeで取りにいくコマンドを打って、それをblockでつなげて、そのblockに対してwhen文を書いて、セッションが0でなければこのBlock文を実行して、1分待つというのをグルグルやりますと書きました。
数値で比較する時は、取り方が悪いと文字列で取ったりします。このint型でたまにハマるので注意をしましょうというところもあります。
このwhenでBlock文を書いてループして、グルグル待っていましょうというのをRoleとして作って動かしてみました。実際動かしたところ、このループで30分ぐらい待っているはずが、いきなりループ処理が終わってしまって、サーバーが落ちてしまいました。
私はもう顔面蒼白でした(笑)。なんでこのループ処理が動かなかったのかを考えました。
これも、数日かかりましたかね。けっこう時間がかかって、このset_factのところがきちんと数値で入っていないかとか、そもそもset_factされていないのではないかとか。そもそもこのwhen文の書き方が悪いのではないかとか、いろいろ考えたのですが、ちょっとわからなくて、シェルスクリプトをif文やfor文で書くとこんな感じなのかなと思い描いていました。
最初にこのBlock文でwhenの条件文を通過してしまえば、あとのタスクのpauseとかset_factとか、このincludeタスクとかが実行されると思っていたのですが、結果的に、Block文の中のwhenというのが、もうif文ではないよというところに気づきました。
ちょっと具体的に、どういう動作をしているのかなというところで、普通書かないのですが、こんな感じで動くのではないかというのをちょっと図解しています。
Block文をwhen文で仕掛けた場合に、上からすべてのタスクに対してwhenがかかるようなイメージです。途中でこのset_factで初期化した段階で、もう0になったので、あとはひたすらwhenが効いてしまって、後続の処理がまったく動かなかったというやらかしです。
私はこのwhenは最初に判断されて、あとはもうBlockの中のタスクは全部動いてくれると思っていたのですが、そうではなくて、Blockに対するタスクというのは、すべてのタスクに対してwhenが効いてしまうという動作だということを、やっと数日かけて気づきました。
ここで原因がわかったので、あとは楽です。途中ですべてが判定されるのであれば、そのBlockのwhenについては、最初は判断させずに、set_factで最後に判定文を入れることで、最初の動作は空回りせずに動くという処理をすることで、無事解決できました。
ちょうど今、このサーバーを落とすというやつを今日の夜やってきたばかりなのですが、きちんと無事動いてくれました。
まとめですが、Blockでwhenを使う時は、この条件文定義はかなり要注意です。私も、whenはifだろうと思ってずっと書いていたのですが、書き慣れた人ほどAnsibleはハマるネタがいっぱいあるのではないのかなと思ったりもしました。
あとは、whenはifだろうという勝手な思い込みですね(笑)。これでかなりハマってしまったというお話なので、やはり思い込みは厳禁だなあというのを、今振り返って反省しています。
以上です。ご清聴ありがとうございます。
2024.12.20
日本の約10倍がん患者が殺到し、病院はキャパオーバー ジャパンハートが描く医療の未来と、カンボジアに新病院を作る理由
2024.12.19
12万通りの「資格の組み合わせ」の中で厳選された60の項目 532の資格を持つ林雄次氏の新刊『資格のかけ算』の見所
2024.12.16
32歳で成績最下位から1年でトップ営業になれた理由 売るテクニックよりも大事な「あり方」
2023.03.21
民間宇宙開発で高まる「飛行機とロケットの衝突」の危機...どうやって回避する?
PR | 2024.12.20
モンスター化したExcelが、ある日突然崩壊 昭和のガス工事会社を生まれ変わらせた、起死回生のノーコード活用術
2024.12.12
会議で発言しやすくなる「心理的安全性」を高めるには ファシリテーションがうまい人の3つの条件
2024.12.18
「社長以外みんな儲かる給与設計」にした理由 経営者たちが語る、優秀な人材集め・会社を発展させるためのヒント
2024.12.17
面接で「後輩を指導できなさそう」と思われる人の伝え方 歳を重ねるほど重視される経験の「ノウハウ化」
2024.12.13
ファシリテーターは「しゃべらないほうがいい」理由 入山章栄氏が語る、心理的安全性の高い場を作るポイント
2024.12.10
メールのラリー回数でわかる「評価されない人」の特徴 職場での評価を下げる行動5選
Climbers Startup JAPAN EXPO 2024 - 秋 -
2024.11.20 - 2024.11.21
『主体的なキャリア形成』を考える~資格のかけ算について〜
2024.12.07 - 2024.12.07
Startup CTO of the year 2024
2024.11.19 - 2024.11.19
社員の力を引き出す経営戦略〜ひとり一人が自ら成長する組織づくり〜
2024.11.20 - 2024.11.20
「確率思考」で未来を見通す 事業を成功に導く意思決定 ~エビデンス・ベースド・マーケティング思考の調査分析で事業に有効な予測手法とは~
2024.11.05 - 2024.11.05