話題の記事

構成管理ツール Ansibleを使ってみる

2014.06.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

構成管理ツールといえばChefですが

弊社ブログでも構成管理ツールに関する記事はけっこうありますが、ほとんどがChefに関する記事です。
私もChefについてを書いてたりしますが、Rubyが苦手な自分としては、Chefのレシピを書いたりするのは難しいわけです。
こういう記事もありますが)
で、Chefのかわりに使えそうな構成管理ツールを探して、これならいけるんじゃないかと思ったのが、今回紹介するAnsibleです。

Ansibleとは

Ansibleとは、Pythonで記述された構成管理ツールです。
まずはAnsibleの基本用語について解説します。

・モジュール クライアント内での動きは「モジュール」として定義されます。
ソフトウェアをインストールしたり、サービスの起動をしたりするモジュールはあらかじめ用意されてます。
自分でモジュールを作成することも可能です。
このモジュールは何で作成してもいいので、Pythonの知識は必要ないです。
決められた出力形式(key-value形式かJSON)を守ればOKみたいです。

・Play book Chefでいうところのレシピ。モジュール処理をまとめたものが「Play book」と呼ばれます。
Play bookはYAML形式で記述します。

基本的にChefは、クライアントとサーバで構成され、ChefクライアントからChefサーバーに対して設定を
問い合わせながら自身を変更していき、定義した状態にしていきます。
Ansibleでは、サーバからクライアント(複数の可能性もある)に対して直接命令し、結果を取得します。
したがって、各クライアントではAnsibleをインストールする必要はありません。

環境構築方法

今回使用した動作環境は以下のとおりです。
Virtual boxとVagrantは使用できる状態にしておいてください。

  • OS : MacOS X 10.9.3
  • Virtual box: 4.3.6
  • Vagrant: 1.6.3

今回は結局Vagrant使ってるので、rubyで設定ファイルを書いてるのですが・・・

Ansibleを使ってみる

ここを参考に、Ansibleをセットアップして使ってみましょう。
VagrantでCentOSマシンを2台用意し、片方に向けてAnsibleでいろいろしてみます。

1.Vagrantで仮想マシン作成

まずはCentOSマシンを2台用意します。下記コマンドを実行し、仮想マシンを2台起動しましょう。
node1からnode2にAnsibleを実行するため、鍵ファイルのコピーも行います。

% vagrant box add CentOS65 https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box
% vagrant init CentOS65

Vagrantfileを下記のように編集します。

・
・
  config.vm.define :node1 do |node|
    node.vm.box = "CentOS65"
    node.vm.network :forwarded_port, guest: 22, host: 2001, id: "ssh"
    node.vm.network :private_network, ip: "192.168.33.11"
  end

  config.vm.define :node2 do |node|
    node.vm.box = "CentOS65"
    node.vm.network :forwarded_port, guest: 22, host: 2002, id: "ssh"
    node.vm.network :forwarded_port, guest: 80, host: 8000, id: "http"
    node.vm.network :private_network, ip: "192.168.33.12"
  end
・
・

Vagrantfileを編集したら、仮想マシンを起動します。
vagrant sshでログインできることも確認しておいてください。

% vagrant up
% vagrant ssh node1                                                                          Last login: Mon Jun 30 06:23:19 2014 from 10.0.2.2
[vagrant@vagrant-centos65 ~]$

マシンが起動したら、node1からnode2へsshできるように下記コマンドを実行しておきます。

% vagrant ssh-config node1 > ssh_config
% vagrant ssh-config node2 >> ssh_config
% scp -F ssh_config ~/.vagrant.d/insecure_private_key node1:.ssh/id_rsa

2.CentOSにAnsibleをインストール

セットアップしたCentOSにはすでにpythonがインストールされているので、
yumでAnsibleをインストールするだけで使用できます。
node1マシンにsshログインし、yumでAnsibleをインストールします。

% vagrant ssh node1                                                                          
[vagrant@vagrant-centos65 ~]$ sudo yum install ansible -y

Ansibleを実行するには、inventory fileに対象サーバのアドレスを登録しなければいけません。
hostsという名前で、下記内容のファイルを記述します。

[test-server]
192.168.33.12

3.Ansibleでコマンド実行

では、node2サーバに対してAnsibleでコマンドを実行してみましょう。
test-serverグループに対して、pingコマンド(モジュール)を実行しており、結果を受け取っています。

[vagrant@vagrant-centos65 ~]$ ansible test-server -i hosts -m ping
192.168.33.12 | success >> {
    "changed": false,
    "ping": "pong"
}

4.任意のコマンドを実行

Ansibleで任意のLinuxコマンドを実行したい場合もあります。その場合には、「-a」オプションを使って
コマンドを文字列で指定します。

[vagrant@vagrant-centos65 ~]$  ansible test-server -i hosts -a "cat /etc/redhat-release"
192.168.33.12 | success | rc=0 >>
CentOS release 6.5 (Final)

今回は実行するサーバは1台だけですが、サーバの台数が多い場合にはコマンドをまとめて実行できるので便利ですね。

5.Play bookを使う

複数のモジュールをまとめたものをPlay bookといいます。
Apache httpdをインストールしてサービスを実行するPlay bookを記述して、実行してみましょう。
simple.ymlという名前で、下記ファイルを作成します。

---
- hosts: test-server
  sudo: yes
  tasks:
    - name: be sure httpd is installed
      yum: name=httpd state=installed

    - name: be sure httpd is running and enabled
      service: name=httpd state=running enabled=yes

tasks以下に実行したい処理を記述します。ここではyumとserviceモジュールを実行しています。

play bookを実行するには、ansible-playbookコマンドを実行します。
下記のように--list-tasksオプションを指定すると、ymlで実行される内容を確認することができます。

[vagrant@vagrant-centos65 ~]$ ansible-playbook -i hosts simple.yml --list-tasks
playbook: simple.yml

  play #1 (test-servers):
    be sure httpd is installed
    be sure httpd is running and enabled

では実際にPlay bookを実行します。ansible-playbookコマンドを実行すると、node2に対して Apacheのインストールとサービス起動が実行されます。

[vagrant@vagrant-centos65 ~]$ ansible-playbook -i hosts simple.yml

PLAY [test-server] ************************************************************

GATHERING FACTS ***************************************************************
ok: [192.168.33.12]

TASK: [be sure httpd is installed] ********************************************
changed: [192.168.33.12]

TASK: [be sure httpd is running and enabled] **********************************
changed: [192.168.33.12]

PLAY RECAP ********************************************************************
192.168.33.12              : ok=3    changed=2    unreachable=0    failed=0

node2にログインし、Apacheがインストールされているのを確認してみてください。

% vagrant ssh node2
[vagrant@vagrant-centos65 ~]$ sudo service httpd status
httpd (pid  8552) is running...

まとめ

ymlで簡単にマシンに対する処理が記述できますし、言語を問わずモジュールが記述できるのも便利ですね。
構成管理ツールとして、Ansibleの採用も検討してみてください。

参考サイトなど