現在地

第6回「現状を活かしながら環境構築自動化をするならAnsibleがお勧め!」

本コラムは、今まで菅原・岡本の共著で執筆を行っていました。今回からは私岡本が執筆していきます。どうぞ、引き続きよろしくお願いいたします。

本コラムでは、運用構築の自動化技術として、Puppet/Chef/Ansibleの使い方を横並びで紹介してきました。動向としては、Ansibleは、Chef/Puppetに比べ新しいプロダクトで、知名度も一般にはそれほど高くないようです。そこで今回は、Ansibleについて少し掘り下げてみたいと思います。

今のやり方を活かせるAnsible

仕事あるいは趣味で多数のシステムを構築している方であれば、自前のスクリプトでインストールを自動化している方も多いと思います。そのような方に自動環境構築のことを紹介しても、

 「現状、自作スクリプトで簡単にインストールできて困っていない。」
 「新しいツールを勉強して、使い方を覚える必要性を感じない」

と感じている方も少なくありません。確かにChefやPuppetを導入するには、いろいろと覚えることが多いです。

しかし、Puppet、Chef、 Ansibleの3つは、同じように見えていて、その思想は共通ではありません。PuppetとChefは環境を自動構築するために開発されたツールであるのに対して、Ansibleは、開発者が現在行っているやり方を簡単にできるようにしようとしていると私は考えています。
たとえば、複数のサーバーにインストールを行いたい場合、ChefやPuppetはターゲットとなるサーバーにChef/Puppet(もしくはそれらのエージェント)のインストールをしておかなければなりません。言ってみれば準備が必要ですが、AnsibleであればSSHがインストールされていればすぐに利用できます。

また、すでに自作のスクリプトで自動行っているような場合、Ansibleであればそのスタイルを維持しながら、「スクリプトをサーバーに送り込んで実行するツール」としても利用することができます。このように、いまのやり方を活かしながら導入するところからはじめ、テンプレートの利用やAnsibleのリソースの利用など、少しずつ高度な自動化へ移行することができるのが、Ansibleの強みだと感じています。

リモートスクリプト実行フレームワークとしてのAnsibleの利用

簡単にAnsibleの使い方を紹介していきましょう。インストール処理の全てをAnsibleで書いてしまうのもそう大変ではありませんが、たとえばbashで作成した自動インストールのスクリプトをAnsibleを使って、各サーバー上で実行する例を紹介します。

Ansibleのインストール

自動構築を行うために、Ansibleをインストールしたサーバーを用意します。RHEL/CentOSでは、EPELのリポジトリを設定し、ansibleパッケージをインストールすればOKです。下記の手順となります。

# rpm -Uvh http://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
# yum install ansible

Ubuntuでは、デフォルトのリポジトリに含まれるので

# apt-get install ansible

とするだけです。

ターゲットサーバーの設定

自動構築するターゲットサーバーにSSHの公開鍵認証でログインできるように設定します。

まず、Ansibleを実行するホスト上で、キーペアを作成します。

[root@ansiblehost ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 【Enterを入力】
Enter passphrase (empty for no passphrase):【Enterを入力】
Enter same passphrase again:【Enterを入力】
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.

/root/.ssh/id_rsa.pubに作成された公開鍵をターゲットサーバーにコピーし、ターゲットサーバー上に/root/.ssh/authorized_keys という名前で保存します。

# scp ~/.ssh/id_rsa.pub root@targethost:~/.ssh/authorized_keys

sshでターゲットホストにパスワードなしでログインできることを確認します。

[root@ansiblehost ~]# ssh root@targethost
[root@targethost ~]#

無事ログインできれば、準備は完了です。

Ansible利用の流れ

Ansibleはインベントリと呼ばれる自動構築の対象となるターゲットホストを記述したファイルと、プレイブックと呼ばれる構築手順を記述した2つのファイルから構成されます。複雑なシステムになってくると、プレイブックは複数のファイルでモジュール化することも可能ですが、本稿では、簡単な例として、イベントリとプレイブックの2つのファイルを作成します。

ターゲットサーバーを登録したインベントリの作成

サーバーを定義するインベントリと呼ばれるファイルを作成します。たとえば、myserversという名前で自動構築のターゲットとなるサーバーを定義していきます。

リスト1: hosts
-----------------------------
[myservers]
192.168.10.1
192.168.10.3
192.168.10.4
192.168.10.5
-----------------------------

インストールの実行手順、プレイブックの作成

次に、Chefのクックブックに相当するプレイブックと呼ばれるファイルを作成します。

リスト2: playbook.yml
-----------------------------
- hosts: myservers
  tasks:
  -  name: Run Install Script
      script: install.sh
-----------------------------

このプレイブックは、install.shをターゲットのサーバーに送信し実行します。

実行

下記のように実行すれば、インベントリに登録したサーバー群にスクリプトを送信、実行することができます。

[root@ansiblehost ~]# ansible-playbook -i hosts playbook.yml

スモールスタートで使えるAnsible

Ansibleは上記に紹介したように、スモールスタートで簡単に使えるというメリットがあります。今回の例では、スクリプトのリモート実行に利用しましたが、徐々にAnsibleのリソースを学習し、よりAnsibleっぽい使い方をしていくと面白いと思います。