LoginSignup
20

More than 5 years have passed since last update.

Ansible を試す

Last updated at Posted at 2014-10-26

1. 環境

VagrantとVirtualBoxは事前にインストールしておいてください。

  • Max OS X 10.10
  • Homebrew 0.9.5
  • VirtualBox 4.3.18
  • Vagrant 1.6.5

2. Vagrant 環境の準備

CentOS 6 を使います。

$ mkdir ansible_test
$ cd ansible_test
$ vagrant box add centos/6
$ vagrant init centos/6
$ vi Vagrantfile
$ diff Vagrantfile Vagrantfile.org 
27c27
<   config.vm.network "private_network", ip: "192.168.33.10"
---
>   # config.vm.network "private_network", ip: "192.168.33.10"
$ vagrant up
$ vagrant ssh-config --host 192.168.33.10 >> ~/.ssh/config

3. Ansible をインストール

$ brew install ansible
$ ansible --version
ansible 1.7.2

ゲスト環境への接続確認

$ echo "192.168.33.10" > hosts
$ ansible -i hosts 192.168.33.10 -m ping
192.168.33.10 | success >> {
    "changed": false, 
    "ping": "pong"
}

4. Playbook の作成

簡単な Playbook を作ってみます。
yum update all と httpd をインストールします。

イベントリファイル

先ほどの hosts ファイルを上書きします。[]でグループを定義します。

[web_server]
192.168.33.10
[db_server]
192.168.33.10

Playbook

いわゆるChefのレシピ。

$ vi playbook.yml
playbook.yml
- hosts: all
  user: vagrant
  sudo: yes
  tasks:
    - name: upgrade all packages
      yum: name=* state=latest

- hosts: web_server
  user: vagrant
  sudo: yes
  tasks:
    - name: install httpd package
      yum: name={{ item }} state=present
      with_items:
        - lynx
        - httpd
    - name: Enable httpd server
      service: name=httpd state=running enabled=yes
  • yum の state について

    state 意味
    present まだインストールされていなければインストールする。
    インストール済みなら何もしない。(default)
    latest まだインストールされていなければインストールする。
    インストール済みのバージョンより最新版が見つかればアップデートする。
    absent パッケージをアンインストールする。

    詳細は yum - Manages packages with the yum package manager — Ansible Documentation

5. Playbook のテスト

文法チェック

$ ansible-playbook -i hosts playbook.yml --syntax-check

playbook: playbook.yml

エラーがなければplaybook名が出力されます。

task一覧

指定した Playbook で実行される task の一覧が出力されます。

$ ansible-playbook -i hosts playbook.yml --list-tasks

playbook: playbook.yml

  play #1 (all):
    upgrade all packages

  play #2 (web_server):
    Install httpd package
    Enable httpd server

対象host の確認

指定した Playbook で対象となる host の一覧が出力されます。

$ ansible-playbook -i hosts playbook.yml --list-hosts

playbook: playbook.yml

  play #1 (all): host count=1
    192.168.33.10

  play #2 (web_server): host count=1
    192.168.33.10

6. Playbook の実行

dry-run

まずは dry-run で実行時の動きを確認します。

$ ansible-playbook -i hosts playbook.yml --check

PLAY [all] ******************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [192.168.33.10]

TASK: [upgrade all packages] ************************************************** 
ok: [192.168.33.10]

PLAY [web_server] ************************************************************* 

GATHERING FACTS *************************************************************** 
ok: [192.168.33.10]

TASK: [Install httpd package] ************************************************* 
changed: [192.168.33.10] => (item=lynx,httpd)

TASK: [Enable httpd server] *************************************************** 
failed: [192.168.33.10] => {"failed": true}
msg: cannot find 'service' binary or init script for service,  possible typo in service name?, aborting

FATAL: all hosts have already failed -- aborting

PLAY RECAP ******************************************************************** 
           to retry, use: --limit @/Users/nobuho/playbook.retry

192.168.33.10              : ok=4    changed=1    unreachable=0    failed=1 

dry-run なので init.d スクリプトがインストールされず service の起動に失敗しているようです。

実行

$ ansible-playbook -i hosts playbook.yml

PLAY [all] ******************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [192.168.33.10]

TASK: [upgrade all packages] ************************************************** 
ok: [192.168.33.10]

PLAY [web_server] ************************************************************* 

GATHERING FACTS *************************************************************** 
ok: [192.168.33.10]

TASK: [Install httpd package] ************************************************* 
changed: [192.168.33.10] => (item=lynx,httpd)

TASK: [Enable httpd server] *************************************************** 
changed: [192.168.33.10]

PLAY RECAP ******************************************************************** 
192.168.33.10              : ok=5    changed=2    unreachable=0    failed=0   

上手くいきました。
ちなみにもう一回実行すると……

$ ansible-playbook -i hosts playbook.yml

PLAY [all] ******************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [192.168.33.10]

TASK: [upgrade all packages] ************************************************** 
ok: [192.168.33.10]

PLAY [web_server] ************************************************************* 

GATHERING FACTS *************************************************************** 
ok: [192.168.33.10]

TASK: [Install httpd package] ************************************************* 
ok: [192.168.33.10] => (item=lynx,httpd)

TASK: [Enable httpd server] *************************************************** 
ok: [192.168.33.10]

PLAY RECAP ******************************************************************** 
192.168.33.10              : ok=5    changed=0    unreachable=0    failed=0  

httpd などはすでにインストール済みのため何もしません。(changedが0)

長くなったので今回はここまで。

別で serverspec によるテストとか、今回はパッケージで入れましたけどソースコードからのビルドとか設定ファイルの作成を試します。

github に今回使った一式をcommitしてあります。

参考

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20