Pocket

こんにちは、nodaです。

最近、ちょくちょくセキュリティインシデントが騒がれます。
OpenSSLやApacheなどが脆弱性の対象となるケースも多く、対応に追われたサーバ管理者も多いのでは?

複数サーバを管理している構成では各サーバへの対応が必要となり、長時間作業やオペレーションミスといった二次被害も発生します。
これらを回避するために「Ansible」が活用でき、導入も容易なので注目されています。

ansible_logo_black_square

■Ansibleとは

Ansibleとは、「構成管理ツール」です。

構成管理ツールといえば「Chef」を真っ先に思い浮かべるのでは?
では、AnsibleとChefの違いは何でしょうか。

Ansibleの特徴を一言で表すと…
管理されるサーバに特別な設定がいらないこと
(正確にはSSHでログインできて、Pythonが入っていればよい。)

つまり、構成管理を行うサーバにAnsibleがあれば、手軽にツールを使って複数サーバを管理できるということです。

■環境構築

今回はVagrantで複数サーバ構成を再現し、Ansibleの簡単な活用手段(OSのバージョン確認)を試してみます。
Vagrantについては、こちらの記事を参照してください。

さて、まずは下図のような構成をVagrantで用意しましょう。

ansible構成

構成図の説明
  • Ansibleをインストールして、管理するサーバの「host」があります。(※インストールは後述します。)
  • 管理されるサーバ(管理対象サーバ)の「client1」と「client2」があります。
構築ポイント
  • hostから各clientへは、SSHでログインできること
  • hostとclientのOSは、CentOSであること(Pythonが入っていればなんでもいいですが…)
  • 動作確認のため各clientのOSは異なるバージョンにしておくこと

これだけです!

■Ansibleインストール

hostサーバにAnsibleをインストールしていきます。

インストール方法は複数ありますが、今回はEPELリポジトリからyumインストールします。
ネットから最新リポジトリのダウンロードURLを拾ってきましょう。

次にhostサーバにログインして、リポジトリのダウンロードと適用を行います。

akiba:ansible y-noda$ vagrant ssh host
[vagrant@host ~]$ wget "https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm"
[vagrant@host ~]$ sudo rpm -Uvh epel-release-6-8.noarch.rpm

最後にyumコマンドを叩いたら、インストール完了です。

[vagrant@host ~]$ sudo yum install ansible

■Inventoryをつくる

Ansibleを使うには最低限、「Inventory」が必要です。

Inventoryとは、Ansibleが管理する先のサーバ情報のことです。
ここではIPアドレスやホスト名などを定義し、接続できるようにしてあげます。

とりあえず、適当な場所に適当なファイル名でInventoryをつくりましょう。

[vagrant@host ~]$ vi hosts.ini

hosts.iniファイルには以下が書かれています。

[client]
192.168.33.11
192.168.33.12

clientというグループに、IPアドレスを2つ(client1サーバとclient2サーバ)登録しました。

これでAnsibleの最低要件がそろったので、実行してみましょう。

■Ansibleコマンド

今回、実行するAnsibleコマンドは以下です。

[vagrant@host ~]$ ansible client -i hosts.ini -a "cat /etc/redhat-release"

引数について詳しくみていきます。

 client 管理対象とするサーバを指定します。
「all」を指定すると、Inventoryに記載したすべてのサーバが対象となります。
ブラケットで囲んだグループごとに指定が可能です。
-i hosts.ini Inventoryのパスを指定します。
今回はファイルがあるカレントディレクトリで実行したので、ファイル名のみの指定です。
 -a “cat /etc/redhat-release” 管理対象サーバで実行するコマンドを指定します。
今回はCentOSのバージョンを確認するコマンドを指定しています。

実行結果をみてみましょう。

192.168.33.11 | success | rc=0 >>
CentOS release 6.5 (Final)

192.168.33.12 | success | rc=0 >>
CentOS release 6.6 (Final)

192.168.33.11(client1サーバ)と、192.168.33.12(client2サーバ)でCentOSのバージョンが異なることが確認できると思います。

■さいごに

たかだかOSのバージョン確認ですが、数十台あるサーバに対して手作業は時間の無駄ですし、間違いの元でもあります。
実際に現場では、これらのコマンドを使ってサーバ構成についてまとめることができました。

また「Playbook」を使うことで、複雑な処理を管理対象サーバに行うこともできます。
次回以降、試していこうと思いますのでお楽しみに!

ではでは。