2024.12.10
“放置系”なのにサイバー攻撃を監視・検知、「統合ログ管理ツール」とは 最先端のログ管理体制を実現する方法
やらかしlineinfine 〜冪等性が失われた日、そしてreplaceへ〜(全1記事)
リンクをコピー
記事をブックマーク
林如弥氏:私の大いなる力で、lineinfileを責任を持って行使してしまって、やらかしましたという発表です。お願いします。
みなさん、ansible.builtin.lineinfileモジュールを使っていると思います。とても便利ですよね。ドキュメントの一角を切り取ってきたのですが「Manage lines in text files」ということで、テキストファイルの中の文字列を管理できるモジュールで、とても便利です。
私たちのユースケースでいうと、主にアプリや、OSの設定を一部変えることをやっています。
詳細は割愛しますが、こういうことをゴチャゴチャとlineinfileで、ありがたいことに使わせてもらっています。
copyやtemplatesという便利なモジュールもありますが、ファイルを丸ごと置き換えられないようなケースで使うのがlineinfileかなと思っていますし、特定の行を、シュパッと狙い撃って修正できる、これもまたいいところです。
ちょっとうちのつらみなんですけれども、けっこう手作業で作られた不揃いの環境があって(笑)、同じファイルでぜんぜん中身が違うけど、特定のパラメーターだけを変えたり、追加できたりするのがlineinfileで、だからみんな大好きですよね。
そんなlineinfileのやらかしを、2つほど持ってきたので、紹介します。
1個目、やらかし1ということで「実行するたびに重複が発生する/etc/hosts」というタイトルです。
これはサンプルですが、172.18.9.32みたいなIPに、今ショートネームみたいな、s1 sv1みたいなのがついています。ここに、ちょっと見直しをしてserver1みたいなものを追加したくなったわけです。
ここでやはりlineinfileですよと。regexpで先頭の正規表現かけて、後半はグループ化でbackrefsであとで再利用する。それで、最後の末尾にserver1を足すと。
これ、一見すごくよさそうに見えるんです。1回なら動くんです。
しかし、これは打つたびにserver1がこのように増えていく、増えていく、増えていく。しかも、これってhostsファイルとしては、どうも問題がないらしくて、気づくまでに時間がかかってしまいます。いろいろなケースで再利用したせいで、どんどん増えていったという問題が起きました。
こうして、Ansibleの代名詞と言ってもいいぐらいの冪等性を、lineinfileを使って(笑)失ってしまったというやらかしが1個目です。
そして、やらかし2です。「変換対象が複数回出るなら、replaceモジュールを使いましょう」というやらかし。
もう、この時点でピーンときた方もいると思うのですが、とあるミドルウェアの設定ファイルに、DB01みたいな宛先が書いてあったんです。そのDBをバージョンアップして、その向き先だけアプリでは書くことがあったんです。
「テキストの中の特定文字列を変えるならlineinfileだろう!」と思って、こんな感じのことを書きました。
先ほどとあまり変わらないのですが、regexpでDestの文字列を拾って、変えたい部分だけNewDB01みたいなかたちで書いたんです。すると、こうなりました。
どういう動きをしたかというと、後半のDB01だけNewDB01というかたちになるんです。つまり、1個目に出たDB01は変換されなかったんです。もう1回同じPlaybookをそのまま打つと、きちんと変換されます。
つまり、1回の実行だけだと1箇所しか変換されないんです。これに気づかなかった私が、アプリチームに「どうぞ、もう変えておきましたので」と言って、正常確認をお願いしたのですが、特定のコネクションプールだけ古いほうにつながり、新しいところには1箇所だけつながっている。そういう状況を作ってしまって、混乱を生んでしまいました。当時の同僚のみなさんにお詫びをしたいと思います。
これは、しっかりとドキュメントに書いてあります。Synopsisという、概要とでも訳すんですかね、そこに「See the ansible.builtin.replace module if you want to change multiple, similar lines」。「似たような、複数の場所を変更するなら、きちんとreplaceモジュールを見てね」ときっちりと書いてあるのに、僕はlineinfileを好きすぎて、1回で失敗したというやらかしの話でした(笑)。
まとめです。lineinfileは、やはりとても便利ですが、書き方次第では冪等性が失われます(笑)。きちんと複数回実行しても、同じ箇所が同じだけきちんとOKになるか、2回目やったら増えないかというところを確認しましょう。
あとは、複数箇所を同時に1回のplaybookの実行で変えたいのであれば、ここはreplaceモジュールの出番なので、lineinfileはまた別の機会で使ってくださいという話で、私の発表を終わります。ご清聴ありがとうございました。
2024.12.10
メールのラリー回数でわかる「評価されない人」の特徴 職場での評価を下げる行動5選
2024.12.09
10点満点中7点の部下に言うべきこと 部下を育成できない上司の特徴トップ5
2024.12.09
国内の有名ホテルでは、マグロ丼がなんと1杯「24,000円」 「良いものをより安く」を追いすぎた日本にとって値上げが重要な理由
2024.12.12
会議で発言しやすくなる「心理的安全性」を高めるには ファシリテーションがうまい人の3つの条件
2023.03.21
民間宇宙開発で高まる「飛行機とロケットの衝突」の危機...どうやって回避する?
2024.12.10
職場であえて「不機嫌」を出したほうがいいタイプ NOと言えない人のための人間関係をラクにするヒント
2024.12.12
今までとこれからで、エンジニアに求められる「スキル」の違い AI時代のエンジニアの未来と生存戦略のカギとは
PR | 2024.11.26
なぜ電話営業はなくならない?その要因は「属人化」 通話内容をデータ化するZoomのクラウドサービス活用術
PR | 2024.11.22
「闇雲なAI導入」から脱却せよ Zoom・パーソル・THE GUILD幹部が語る、従業員と顧客体験を高めるAI戦略の要諦
2024.12.11
大企業への転職前に感じた、「なんか違うかも」の違和感の正体 「親が喜ぶ」「モテそう」ではない、自分の判断基準を持つカギ