Ansible メリット・デメリット

Ansibleは、オープンソースのオーケストレーションおよびコンフィギュレーションツールです。シンプルなYMLファイルを書くことにより、ネットワーク、サーバー、クラウドなどさまざまなインフラストラクチャを自動化できます。 今回は、YMLファイルの基本を学び、Ansibleを使用してインフラストラクチャのインフラフレームを自動化する方法をご紹介します。Ansibleのメリットデメリットを考えました。

クラウドの推進により自動化をするべき

まず、クラウド利用が進んでいますが、クラウドは従量課金です。
コストは高いため、必要なときにインフラを用意し、不要なときには環境を削除する運用が向いています。
クラウドは高いので、ケースにあった場合に使えると思います。
自身は検証環境を一時的に利用したいケースが多いので、自動構築ができると使いたい時だけサクッと検証環境を作れてメリットがあります。
Ansibleを使いこなして、自動化してクラウドを使い倒しましょう。
一方で、永年無料で利用できるサーバを提供している太っ腹なOracle Cloud Infrastructureもあります。
興味がある方はこの記事も併せてお読みください。

Infrastructure as Code

Infrastructure as Codeは手作業で行っていたインフラの構築や変更作業をコードで定義して自動化することです。アプリケーションで実施してきたことを、インフラレイヤでも、コードでインフラリソースを操作することに応用していくことができます。コードでインフラを管理することで、運用コストの削減、品質向上、作業を標準化することによるガバナンスを効かせるメリットがあると思います。
一方で、設計書等がいらなくなるかもしれませんが、バージョン管理やCIツールによりコード自体を管理していくことが必要になります。インフラエンジニアがアプリケーションよりの運用方法を理解することには時間を要しそうですね。

Infrastructure as Codeの適用範囲

Infrastructure as Codeで自動化することのできる範囲は、Orchestration, Configuration Managemetn , BootStrappingの3つの範囲があります。簡単に、アプリケーション、OS、BIOSというイメージです。各レイヤで自動化をできるツールは、Capistrano/Fabric、CFEngine/Puppet/Chef、AWS/VMware/Dockerなどがあります。複数ツールで守備範囲が異なると複雑化してしまいますので、全部カバーできるツールがいいですよね。
そこで、マルチレイヤーのオーケストレーションが可能なツールとしてAnsibleがあります。Ansibleは3つの全ての範囲を網羅しています。さらに、クライアント側にAgentをインストールする必要があるツールが多いですが、AnsibleはAgentをクライアント側にも入れずに使うことができます。ssh接続できれば自動化を進められるのです。
今回はこのAnsibleについて、ご紹介します。

Ansibleとは

Ansibleは、インフラストラクチャの自動化用に開発されたオープンソースのオーケストレーションツールおよびコンフィギュレーションツールです。インフラストラクチャを簡単に設定および構成することができるのが特徴です。YML(YAML Markup Language)でplaybookを書くことによって、複数のシステム構成を自動で構築できます。YMLファイルは、インフラストラクチャを自動化するための命令セットです。

 YMLの基本

YML(YAML Markup Language)は、インフラストラクチャの設定を自動化するための簡潔なマークアップ言語です。YMLファイルを書くための3つの規則に沿って、Ansible playbookを作成することが多いです。
– スペース2つでインデントを作成します。
– コロン(:)を使用してキーワードと値を関連付けます。
– ハイフン(-)を使用して、リストの項目をインデントします。

YAML形式はシンプルであるため、読みやすくて書きやすいため、学習コストが低く、属人化しずらい特徴があります。

具体的な例は以下で、「—」から始まります。

---
- hosts: webservers
  remote_user: root
  sudo: yes
  tasks:
  - name: Install software
    apt: name={{item}} state=installed

Ansibleのメリット・デメリット

YAMLはシンプルであるため、Ansibleを使うことでシンプルなことによるメリットがあります。
一方で、条件分岐を含む複雑な処理には工夫がいり、複雑化させすぎるとメリットが弱くなると思います。
如何にシンプルな業務に落として、自動化できるかが重要そうですね。

メリット・デメリットは以下があります。

<メリット>
1. 簡単に構成管理を行えます。Ansibleはプログラミングスキルを必要とせず、YAML言語を使用して、Playbooks(プレイブック)を使用してホストやサービスの構成を定義することができます。
2. 複数のプラットフォームのサポートがあります。Ansibleは多くのOS(Linux、UNIX、Windows)とサービス(MySQL、Apache、nginx)をサポートしています。詳細はモジュールのindexを確認すると把握できます。
3. 軽量でスケーラブルです。Ansibleが取り入れるアーキテクチャは、サーバーをすべて管理する必要がなく、かつ高速に動作します。
4. インフラストラクチャをコードで管理できます。Ansibleを使用すると、インフラストラクチャの設定がコードファイルとしてコードになります。これにより、アプリケーションやサーバーをどのように設定させるかが簡単に追跡できます。また、サーバーの構成を統一したり、変更を簡素化したりすることができます。

<デメリット>
1. Ansibleはカスタマイズして柔軟なインフラストラクチャを構築することは向いていないです。シンプルな構成を立てるべきです。
2. 複雑な処理に向いていなく、Ansibleのループ処理は非常に煩雑な構文となるようです。
3. Ansibleを仮想マシンで使用する場合、変数で仮想マシンの環境を定義する必要があります。

AnsibleではInventoryとPlaybookを定義して自動化

シンプルな構成として、Inventoryを定義してPlayboookで何をするかを記述して動かします。
何をどうするかを定義するだけと考えますと、簡単な構想でいいですね。
Inventoryとして、IPアドレスなどのパラメータを記載します。inventory.iniとして定義します。
[web_servers]、[db_servers]など、任意のグループ名にグループ化することができます。
allグループは暗黙で定義され、inventoryファイルに記載のもの全てを指します。

[web_servers]
web-1 ansible_host=192.168.10.1
web-2 ansible_host=192.168.10.2
[db_servers]
db-1 ansible_host=192.168.11.[1:2]

playbookとして、上記インベントリーに対して何をするかを定義します。site.ymlを定義します。
下記の例は、ymlで定義した192.168.10.1/192.168.1.2にyumでhttpdをstartする例です。

- hosts: web_servers
  tasks:
   - name: Install Apache
      yum:
       name: httpd
              state: started
       enabled: yes

何に対して、何をするかを設定しているシンプルなイメージです。
実行はinventoryとymlを指定して実行できます。

ansible-playbook -i invent.ini site.yml

二度同じことを実行するとどうなるのか?

Ansibleではべきとう性が保証されており、複数回実行してもエラーにならずに次のタスクに移ります。
そのため、エラー処理の条件分岐を記載する必要がなく、playbookがシンプルになる特徴があります。
ただし、commandモジュール等、自由度の高いモジュールを使う場合は、べきとう性が保証されず、複数回実行した場合に何度も実施されてしまい、ansibleの利点を1つ使えなくなってしまいます。commandモジュールは便利だとは思いますが、最終手段だと思った方が良さそうですね。

終わりに

Ansibleの入門として、メリットデメリットをご紹介させていただきました。
Ansibleはシンプルで広範囲に対して利用することができます。
コミュニティ版は無料で使えますので、CLI/GUI版の両方を試していきたいと思います。