はじめに
初めまして。マイクロアド21年卒サーバーサイドエンジニアの陶山(id:suyama_naoki)と申します!普段はUNIVERSE Adsの開発を行なっています。
今回の記事では、マイクロアドで使用している構成管理ツール「Ansible」について共有させていただきます。
Ansibleとは
Ansibleとは、Red Hat社が開発するオープンソースの構成管理ツールです。あらかじめ用意したYAML形式の設定ファイルに従って、ソフトウェアのプロビジョニング、構成管理、アプリケーションのデプロイなどを自動的に実行します。特に大規模なコンピュータ・クラスターを構築する際の、時間の短縮やミスの削減に有用です。
Ansibleでできること
継続的インテグレーション
継続的インテグレーションとは、コード変更を定期的にマスターブランチにマージすることであり、マージする度に自動化されたビルドとテストを実行することでバグの早期発見によるソフトウェアの品質維持や、リリースまでの時間短縮の効果があります。
継続的デリバリー
継続的デリバリーとはコード変更を定期的にマスターブランチにマージしていつでも本番環境へのリリースができるようにしておくことです。これにより、開発とリリースの境目を曖昧にし、ソフトウェアリリースをより迅速に安全に行うことができます。
マイクロアドではAnsibleを使用して、リリースするサーバやバージョンなど設定しPlaybookを実行するだけでリリースができるようにしています。
Ansibleを使うメリット
冪等性
冪等性とは、ある操作を何回繰り返しても同じ結果になるという概念です。
例えば、f(x) = x * 1
のように元の数に1だけ掛ける関数は、1回行なっても複数回行っても結果が同じになることから、冪等であると言えます。
f(x) = f(f(x))
command
モジュールなどの一部のモジュールを除き、Ansibleモジュールは冪等です。例えば
、ディレクトリ作成タスクを実行する際、ディレクトリが存在しない場合のみに実行します。既にディレクトリがある場合にエラーを表示したり、同じディレクトリを作成することはありません。これにより、必要な環境確認処理や条件分岐が減りますし、Playbookを変更しない限り、Playbookを何回実行してもサーバの状態が保たれます。
注意点
Anislbeにはcommand
モジュールやshell
モジュールなど、冪等性が保証されていないモジュールがあります。やむを得ずこれらのモジュールを使用する際は、冪等性が保たれているコマンドを使用するか、条件分岐を使うなどして処理全体の冪等性を保てるようにするのが良いでしょう。
エージェントレス
ChefやPuppetなどの構成管理ツールは管理対象のサーバにエージェントと呼ばれる専用のソフトウェアをインストールしておく必要があります。一方でAnsibleはPythonとSSH接続さえ可能であれば各種操作を行えます。このためメンテナンス時の処理時間が少なく、パフォーマンスが大幅に改善されます。
Ansibleを使う際に気をつけること
分岐や反復の処理を記述する際は複雑化しやすい
プログラミング言語を用いずYAML形式で記述することから分岐や反復といった処理を記述する際は複雑化しやすいです。
私もYAML形式でループ処理を構築する際に、ループしたい処理部分切り出したファイルと、条件分岐をしてその処理を呼び出すファイルを作成することとなり、もう少しシンプルに処理を記述したいと思いました(私の力不足かもしれませんが...😓)。
マイクロアドでのAnsibleの活用
Ansibleの役割
マイクロアドのアプリケーション開発では以下のような開発フローでサービスを運用しています。
設計 -> 開発・単体テスト -> 結合テスト -> 試験導入 -> リリース -> 運用・保守
この運用フローの中でAnsibleを用いて以下を自動化しています。
- 結合テスト時のテスト用サーバへのデプロイ
- 試験導入時の試験導入用サーバへのデプロイ
- 本番サーバへのリリース
- サービスの自動再起動(運用・保守: メモリの使用量が増えすぎるのを防ぐため)
リリースの度に手順を作るのではく、開発段階で都度システムが正しく動作するようにPlaybookを書き換えていくことになるため、より短いサイクルで柔軟なリリースができるようになります。
Ansibleプロジェクトの主な構成
ansible-project/ ├─ group_vars/ # 各グループごとの変数設定用ディレクトリ ├─ host_vars/ # 各ホストごとの変数設定用ディレクトリ ├─ inventories/ # インベントリファイル ├─ roles/ │ ├─ build_rtb/ # RTBアプリをビルドするrole │ │ ├─ defaults/ │ │ │ └─ main.yml # tasksで使用する変数を定義 │ │ └─ tasks/ # task用ディレクトリ │ │ └─ main.yml │ │ │ ├─ deploy_rtb/ # RTBアプリをデプロイするrole │ │ ├─ defaults/ │ │ │ └─ main.yml # tasksで使用する変数を定義 │ │ ├─ resources/ │ │ │ ├─ production/ │ │ │ │ └─ credentials.env # 暗号化した本番環境用秘匿情報 │ │ │ └─ test/ │ │ │ └─ credentials.env # 暗号化したテスト環境用秘匿情報 │ │ └─ tasks/ # task用ディレクトリ │ │ └─ main.yml │ │ │ └─ <各roleディレクトリ> │ ├─ rtb.yml # RTBアプリ用Playbookファイル └─ <各Playbookファイル>
※RTB...Real-Time Bidding
マイクロアドではAWXを使ってPlaybookを実行します。そして、Playbookの実行時にroleのタスクが呼び出され、処理が行われます。
上記のプロジェクト構成を例とすると、AWXでRTBアプリのデプロイにrtb.yml
を使用するように設定します。rtb.yml
にはbuild_rtb
とdeploy_rtb
を実行するように記述されています。AWXからPlaybookを実行すると、RTBアプリのビルドとデプロイが行われます。
AWXの使い方については以下の記事をぜひご覧ください。
Slack通知
マイクロアドではAnsibleで設定できる通知機能を用いて、アプリのデプロイの開始時、終了時にその内容をSlackに通知しています。他のチームメンバーが行なっているデプロイの状況を認知することや、デプロイの終了に気付くのに役立っています。
まとめ
今回の記事では、Ansibleについて、その特徴やマイクロアドでの活用法を共有させていただきました。マイクロアドではDevOpsにおいて重要とされている継続的デリバリーを行うためにAnsibleが非常に役立っています。Ansibleをこれから使用する方や知識として学びたい方の参考になれば嬉しいです!