🐈

非コンテナ環境でもOK!AnsibleとAnsistranoで簡単サーバーデプロイ

こんにちは、エンジニアの瑠東です。

エンジニアは誰しもデプロイに困ったことが一度はあるのではないでしょうか。

  • OSやミドルウェアのバージョンアップデート・インストールをしたいが、自動で全て行う方法はないか
  • ローカルに環境構築を行いたいが、npmコマンドなどをひとつひとつ叩かないといけない
  • 追加・修正したコードをサーバーに反映したいが、手動でsymlinkを張りなおさないといけない
  • 誰かがサーバーに一時ファイルを大量につくりディスク容量を圧迫しているため、デプロイ時に消すことはできないか

今回は、そんなデプロイ時に困っていることをすべて自動化してくれる技術を紹介する記事です。

フォルシアで採用している技術

当社のいくつかのサービスでは、ミドルウェアインストールなどサーバ構築にAnsible, アプリのデプロイにAnsistaranoを利用しています。

それぞれ簡単に説明すると、AnsibleはITインフラストラクチャを自動化するためのオープンソースツール、Ansistranoはアプリケーションのデプロイメントをシンプルかつ信頼性高く行うためのAnsibleの1つの機能です。

以下のサーバー構築プロセスの図を見ていただけると、よりイメージがしやすいかと思います。
上部が従来のプロセスで、OSやミドルウェアのインストール、アプリのリリースなどをそれぞれ構築する必要があるのに対し、下部がAnsibleでのプロセスです。
playbookと呼ばれるyml形式のファイルに設定を記述することで、それ以降の構築プロセスをすべて自動で実行してくれます。
また、設計ファイルと設定ファイルが同義となるので、読みやすく、保守もしやすいという利点があります。
さらに、当社では開発環境を構築する上でも利用しており、面倒な作業がほとんど必要ありません。
構築プロセス

導入した経緯は、ぜひこちらの記事を読んでいただけると幸いです。
https://www.forcia.com/blog/001420.html

Ansible/Ansistranoを利用するメリット

上記でもいくつか触れましたが、Ansible/Ansistranoを利用するメリットは他にもあります。

  1. エージェントレス:
    Ansibleはエージェントレスなツールであり、管理対象のサーバーやデバイスに追加のソフトウェアをインストールする必要がありません。SSHやWinRMを使用してリモートホストと通信します。
  2. 簡単な設定:
    Ansibleのプレイブック(Playbook)はYAML形式で記述されるため、設定が直感的で簡単です。読みやすく、保守しやすいです。
  3. 拡張性:
    Ansibleはモジュールベースであり、必要に応じて新しいモジュールを追加することで機能を拡張できます。また、Ansible Galaxyというリポジトリから他のユーザーが作成したロールやモジュールを利用できます。
  4. クロスプラットフォーム対応:
    Linux、Windows、ネットワークデバイスなど、さまざまなプラットフォームで動作します。
  5. 再利用性:
    プレイブックやロールは再利用可能なコードとして保存でき、他のプロジェクトや環境で再利用することができます。これにより、時間と労力を節約できます。
  6. コミュニティサポート:
    Ansibleは広範なコミュニティによって支えられており、豊富なリソースとサポートを利用することができます。公式ドキュメントも充実しています。

playbookを制するものがサーバーデプロイを制する

Ansible/Ansistranoではplaybookと呼ばれるymlファイルが非常に重要な役割を担っており、ここにサーバーデプロイ時の実行内容を記述しておけば、記述した処理が、冪等性が担保された状態で各サーバに対して実行されます。
そのため、当社でも非常に重宝しており、このplaybookの記述がAnsible/Ansistranoのすべてといっても過言ではないかもしれません。

例えば、下記4つの実行したい内容をplaybookに書いてみましょう。(公式ドキュメントから抜粋)
・ディレクトリを作成
・apacheインストール
・シンボリックリンクの作成
・ファイルやディレクトリの権限を変更

書き方はnameに実行内容を記述し、その配下にansibleのmodule(ここではyumやfile)を指定をするだけです。

- name: Create a directory if it does not exist
  file:
    path: /etc/some_directory
    state: directory
    mode: '0755'

- name: install the latest version of Apache
  yum:
    name: httpd
    state: latest

- name: Create a symbolic link
  file:
    src: /file/to/link/to
    dest: /path/to/symlink
    owner: foo
    group: foo
    state: link

- name: Change file ownership, group and permissions
  file:
    path: /etc/foo.conf
    owner: foo
    group: foo
    mode: '0644'

いかがでしょうか?
初めて見る場合も、記述内容をなんとなく読み取ることができませんか?

例えば、ここで指定したfileモジュールは、ファイルとファイルプロパティを管理するansibleのモジュールで、その下に各種パラメータを指定しています。
指定できるパラメータは、ファイルパス(path)や、pathパラメータに指定したファイル操作(state)、権限(mode)など柔軟に指定することが可能です。
こちらには記述しませんでしたが、パラメータの値を変数で指定することももちろん可能です。

サーバーデプロイのマニュアルや設計書を作成し、各操作を手動で毎回実行することを考えると、最初にplaybookに実行したい内容を記述しておくことで、冪等性を担保できることはもちろん、playbookが設計書と同義となるため、保守性もあがっているかと思います。

最後に

この記事では、サーバーデプロイを楽にするAnsibleとAnsistranoの簡単な紹介を行いました。
当社ではさらに拡張を行っており、サーバーデプロイにおいてAnsibleとAnsistranoはなくてはならないものとなっております。

興味がある方は、公式ドキュメントをぜひ読んでみてください。

この記事を書いた人

瑠東 孝佳
2022年中途入社
猫を飼いたいです。

FORCIA Tech Blog

Discussion