はじめに
私たちの環境にはサーバーがたくさんあります。1、2台ではなく、100台を超えるサーバーが存在しています。そして、それらのサーバーには共通してNexusが導入されています。外部ライブラリやパッケージを取得する際、毎回インターネットから直接取得する代わりに、近くのNexusが一度取得してキャッシュし、高速に配布してくれる「中間倉庫」の役割を果たします。外部ネットワークが不安定な環境では、これはかなり重要な仕組みでした。
問題は、これらのNexusごとにproxy設定を同じように行う必要があり、さらにRepositoryを追加したり、複数の設定を追加したりすることも多い点でした。どの外部リポジトリを参照するか、どのリポジトリをまとめて表示するかを、サーバーが数十台もある場合は何十回も設定しなければなりませんでした。1台に入って設定し、そこから出て次の1台に入り、また同じ設定をするという作業の繰り返しでした。
最初の数台は何とかなりました。しかし、サーバーが徐々に増えるにつれて、あるサーバーでは設定を忘れ、別のサーバーでは入力ミスがあり、また別のサーバーでは自分でも気づかないうちに微妙に異なる設定になっていました。確かに「すべて同じように設定した」と思っていたのに、実際にはばらばらでした。
そんなある日、ふと思いました。これらのサーバーの設定は、結局すべて同じでなければなりません。それなら、「このように設定されるべきだ」という正解を一度だけ書いておき、あとは機械がすべてのサーバーに同じように適用してくれればよいのではないか。それが、私がAnsibleを探し始めたきっかけでした。
そこで、Ansibleとは何か
Ansibleは一言で言えば、「複数のサーバーに同じ作業を代わりに行ってくれる自動化ツール」です。私が「これらのサーバーはこの状態になっていなければならない」と書いておくと、Ansibleがそれらのサーバーに1台ずつ接続し、そのとおりの状態にしてくれます。数十台でも数百台でも、コマンド1回で済みます。
私がAnsibleに惹かれた理由はいくつかありました。調べてみると、このツールの性質が私たちの状況に本当によく合っていました。
1つ目は、サーバーに何かをあらかじめインストールする必要がなかったことです。自動化ツールの中には、管理対象のサーバーごとに「エージェント」というプログラムをあらかじめインストールしておかなければならないものもあります。しかし、AnsibleはSSHで接続できれば十分です。私たちのように数十台のサーバーが分散している状況で、それらすべてのサーバーにさらに何かをインストールして管理すること自体が作業でした。その負担がないという点は大きなメリットでした。
2つ目は、何度実行しても安全だったことです。この点は最初はあまり実感できませんでしたが、使ってみると本当に重要な性質でした。Ansibleは「すでにこの状態になっていれば変更しません」。たとえば、ある設定がすでに正しくなっているサーバーに対して再度実行しても、同じものをもう一度作るのではなく、「すでに正しい」と判断してそのまま処理を飛ばします。そのため、「このサーバーにはすでに適用したかどうか」をいちいち覚えておく必要がありませんでした。全体に一度実行すれば、未適用のものだけが自動的に補われました。
3つ目は、設定を文章のように記述できたことです。Ansibleの設定ファイルは人間が読みやすい形式なので、プログラミングを深く知らなくても「何をしようとしているのか」が理解できました。大げさなコードではなく、「このリポジトリをこのように作成せよ」と順を追って書いた説明書に近いものでした。後から見直しても、同僚が見ても理解できるという点がよかったです。
Ansibleの基本構造
Ansibleがどのように動作するのかを図で見ると、より理解しやすくなります。全体の構造は意外と単純です。中央に「自動化エンジン」があり、左側から「何をするか」に関する情報が入ると、右側にある複数のサーバー(または機器)へその作業が広がっていく形です。
画像の出典:https://spacelift.io/blog/ansible-architecture
図の各要素を1つずつ見ていくと、次のようになります。難しそうな用語に見えますが、役割が分かれば単純です。
• 自動化エンジン(Automation Engine):図の中央にある中核です。指示された作業を実際に処理する「頭脳」の役割を担い、通常は作業用PCや専用の管理サーバー1台に配置します。これを制御ノード(Control Node)と呼び、ここからすべてが始まります。
• Playbook(プレイブック):「何をどのように行うか」を記述した作業指示書です。人間が読みやすい形式(YAML)で、「このリポジトリをこのように作成せよ」といった作業を順を追って記述します。正解を一度書いておく場所が、まさにここです。
• Inventory(インベントリ):「どのサーバーに適用するか」の一覧です。私たちの場合で言えば、数十台あるNexusサーバーのアドレス帳に相当します。新しいサーバーが追加されたら、ここに1行追加すれば済みます。私の場合は、作業が完了したサーバーのアドレスを自動的にコメントアウトし、繰り返し実行されないようにして作業していました。
• Modules(モジュール):実際の作業を実行する小さなツールです。「ファイルをコピーせよ」「設定を変更せよ」といった処理を行う部品で、Ansibleが必要なときに対象サーバーへ一時的に送って実行し、完了すると片付けます。
• Plugins(プラグイン)/ API:Ansibleの機能を拡張したり、他のシステムと接続したりするときに使う部分です。最初は深く知らなくても問題なく、「このように拡張できる」という程度を知っておけば十分です。
• Hosts / Networking(対象):図の右側にある、実際に作業が適用されるサーバーやネットワーク機器です。私たちの場合は、Nexusが導入された数十台のサーバーが該当します。重要なのは、これらの対象に何もあらかじめインストールする必要がないという点です。
この図で最も注目すべきなのは、流れの方向です。左側(作成した指示書)から→中央(エンジン)を経由して→右側(数十台のサーバー)へ作業が一度に広がっていきます。私がすることは、左側に「正解」を書くところまでで、その正解をすべてのサーバーに同じように配る作業は、エンジンが自動的に処理してくれます。手作業で1台ずつ入っていたあの繰り返しが、この1枚の図にまとめられたのです。
何が変わったのか
自動化を適用して最初に実感したのは、時間の短縮でした。以前は数十台のサーバーを回って丸1日かけていた作業が、今ではコマンド1回で終わります。新しいサーバーが追加されても、一覧に1行追加して再度実行するだけで済みました。
しかし、より本質的な変化は「一貫性」でした。今では、すべてのサーバーが同じように設定されると信頼できるようになりました。人が手作業で行うと生じていた微妙な違いがなくなったのです。
そして、気持ちもずいぶん楽になりました。以前は「もしかしたら適用漏れのサーバーがあるのではないか」という漠然とした不安が常にありましたが、今では全体に一度実行すれば済みます。すでに正しいサーバーはそのままにして、ずれているサーバーだけが自動的に正しい状態に合わせられるからです。この「未完了のものだけを補ってくれる」という安心感が、数十台を担当する負担を大きく軽減してくれました。
もちろん、自動化が万能というわけではありません。むしろ、「一度にすべてへ適用される」というその強力さが、そのまま危険になることもありました。
手作業のときは、1台でミスをしてもその1台だけが問題になりました。しかし、自動化は違います。正解を間違って記述すると、その誤った設定が「すべての」サーバーに同じように、瞬く間に広がります。1か所のミスが数十台の事故になるのです。そのため、全体に適用する前に、まず1、2台だけで試してみる習慣が必ず必要でした。
そして、すべての作業は可能な限り保守的に制限して設定するのがよいでしょう。結局、自分でも把握できていない問題が発生すると、全体の問題になり得るからです。
セキュリティの面でも学んだことがあります。このツールは結局、複数のサーバーに「接続」して作業します。つまり、接続に必要なアカウント情報やNexus管理者のパスワードといった機密情報を、どこかに記述しなければならないということです。最初は、設定ファイルにそのまま書いてしまいたい誘惑がありました。しかし、それはそのファイルを見る人全員にパスワードを丸ごと渡すのと同じことでした。
幸い、このようなツールには機密情報を別途暗号化して保管する方法が用意されていました。パスワードは設定本文から分離して保護し、リポジトリに登録されないようにしました。「気軽に書いておきたい」という気持ちを一度抑えることが、後の大きな事故を防ぐ道でした。自動化するということは、それだけ機密情報を1か所で扱うことになるという意味でもあります。
おわりに
振り返ってみると、私がAnsibleを導入したのは、技術的な学びを得るためではありませんでした。ただ「同じ作業を何十回も繰り返すのが面倒だったから」、そして「人の手で行うと何度も間違えてしまうから」でした。
ところが、その過程で思いがけないものを得ました。単に時間を節約できただけではなく、仕事の進め方そのものが変わったのです。「手順を覚えている人」から「望む状態を書き留めておく人」へと。頭の中にしかなかったノウハウが、誰でも読んで修正できる文章になりました。そして「私たちのサーバーはすべて同じである」ということを、漠然とした期待ではなく、事実として確認できるようになりました。
もし何十台ものサーバーを前に、同じような悩みを抱えている方がいらっしゃるなら、一度考えてみることをお勧めします。その繰り返し作業を、必ず人の手で行う必要があるのでしょうか。「正解を一度書き、残りは機械に任せる」という発想は、思った以上に多くのことを変えてくれます。少なくとも、私にとってはそうでした。拙い文章をお読みいただき、ありがとうございました。
Bang