MicroAd Developers Blog

マイクロアドのエンジニアブログです。インフラ、開発、分析について発信していきます。

マイクロアドでのAnsibleの活用方法

f:id:suyama_naoki:20211015121227p:plain

はじめに

初めまして。マイクロアド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_rtbdeploy_rtbを実行するように記述されています。AWXからPlaybookを実行すると、RTBアプリのビルドとデプロイが行われます。

AWXの使い方については以下の記事をぜひご覧ください。

developers.microad.co.jp

Slack通知

マイクロアドではAnsibleで設定できる通知機能を用いて、アプリのデプロイの開始時、終了時にその内容をSlackに通知しています。他のチームメンバーが行なっているデプロイの状況を認知することや、デプロイの終了に気付くのに役立っています。

f:id:suyama_naoki:20211014155135p:plain

まとめ

今回の記事では、Ansibleについて、その特徴やマイクロアドでの活用法を共有させていただきました。マイクロアドではDevOpsにおいて重要とされている継続的デリバリーを行うためにAnsibleが非常に役立っています。Ansibleをこれから使用する方や知識として学びたい方の参考になれば嬉しいです!