わすれっぽいきみえ

みらいのじぶんにやさしくしてやる

24日目: ansible使ってみた

追記(2015-02-02)

kimikimi714/ansible_lesson · GitHub

リポジトリにあげ始めた。
もう少し書いたらchefとの比較記事あげたいな。


元祖ゆとりぷろぐらまkimikimiさんは相変わらずドットインストールにお世話になっている。
今日はansibleを触ってみよー。

なお基本的に開発環境はvagrantでやるが、vagrantを用意するための環境は

とする。
またこの記事はドットインストールでやってることをまんまなぞっているだけなので、興味のある人だけが見るといいです。

ansibleのインストール

まず以下のようなVagrantfileを用意する。

$ cat Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.ssh.insert_key = false
  config.vm.define "web_server" do |web|
    web.omnibus.chef_version = :latest
    web.vm.box = "chef/centos-7.0"
    web.vm.network :private_network, ip: "192.168.33.10"
  end

  config.vm.define "db_server" do |db|
    db.omnibus.chef_version = :latest
    db.vm.box = "chef/centos-7.0"
    db.vm.network :private_network, ip: "192.168.33.20"
  end

  config.vm.define "host" do |host|
    host.omnibus.chef_version = :latest
    host.vm.box = "chef/centos-7.0"
    host.vm.network :private_network, ip: "192.168.33.30"
  end

end

おもむろにvagrant upを実行して3台分の仮想マシンを立ち上げる。

$ vagrant status
Current machine states:

web_server                running (virtualbox)
db_server                 running (virtualbox)
host                      running (virtualbox)

This environment represents multiple VMs. The VMs are all listed
above with their current state. For more information about a specific
VM, run `vagrant status NAME`.

以下はvagrant ssh hostに入った仮想マシン上でのコマンド。
これでhostマシンにansibleが入る。

$ sudo yum install epel-release
$ sudo yum install ansible
$ ansible --version
ansible 1.8.1
  configured module search path = None

ansibleを適応するまでの準備

hostマシンからweb_serverdb_serverに入るための環境を整える。
以下のコマンドたちもhostマシン上で実行しており、かつホームディレクトリで実行していることに注意。

$ cat .ssh/config
Host web_server
  HostName 192.168.33.10

Host db_server
  HostName 192.168.33.20

$ chmod 600 .ssh/config
$ ssh-keygen -t rsa
$ ssh-copy-id web_server
$ ssh-copy-id db_server

ssh web_serverssh db_serverを実行してhostマシンからログインできることを確認する。

お試しansible

Inventoryファイルを作って、pingモジュールを実行してみる。

$ cat hosts
[web_server]
192.168.33.10

[db_server]
192.168.33.20

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

192.168.33.10 | success >> {
    "changed": false,
    "ping": "pong"
}

-i hostsでInventoryファイルを指定しなくてもansibleを実行できるようにする。

$ cat ansible.cfg
[defaults]
hostfile = ./hosts

$ ansible all -m ping
192.168.33.20 | success >> {
    "changed": false,
    "ping": "pong"
}

192.168.33.10 | success >> {
    "changed": false,
    "ping": "pong"
}

おk。

Playbookファイルを作って、そこにあるモジュールをansibleで実行させる。
その前にvagrant sandbox onでsandboxモードにしておこう。
ここはmacのVagrantfileがあるディレクトリ上で

$ vagrant sandbox on
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%

$ vagrant sandbox status
[host] Sandbox mode is on
[db_server] Sandbox mode is on
[web_server] Sandbox mode is on

この状態でvagrant ssh hosthostマシンにログインして以下のようにansible-playbookを実行する。

$ cat playbook.yml
---
- hosts: all
  sudo: yes
  tasks:
    - name: add a new user
      user: name=kimikimi714

$ ansible-playbook playbook.yml

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

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

TASK: [add a new user] ********************************************************
changed: [192.168.33.10]
changed: [192.168.33.20]

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

ではちゃんとkimikimi714ユーザが作成されたか確かめてみよう。

$ ssh web_server
$ ls -la /home/
合計 8
drwxr-xr-x.  4 root        root          38 12月 23 14:41 .
drwxr-xr-x. 18 root        root        4096 12月 23 14:01 ..
drwx------.  2 kimikimi714 kimikimi714   59 12月 23 14:41 kimikimi714
drwx------.  4 vagrant     vagrant     4096 12月 23 14:31 vagrant

$ exit
$ ssh db_server
$ ls -la /home/
合計 8
drwxr-xr-x.  4 root        root          38 12月 23 14:41 .
drwxr-xr-x. 18 root        root        4096 12月 23 14:02 ..
drwx------.  2 kimikimi714 kimikimi714   59 12月 23 14:41 kimikimi714
drwx------.  4 vagrant     vagrant     4096 12月 23 14:31 vagrant

ちゃんとユーザが作成されているようだ。
playbook.ymlの変更を行わずにansible-playbookを再実行してみる。

$ ansible-playbook playbook.yml

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

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

TASK: [add a new user] ********************************************************
ok: [192.168.33.10]
ok: [192.168.33.20]

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

確かにchanged=0で冪等性が保たれている。このあとweb_serverdb_serverマシンに入ってユーザが増えたり減ったりしてないか確認したが大丈夫だった。
ではsandboxモードになっている今db_serverだけrollbackしてみる。(もちろんmac上で)

$ vagrant sandbox rollback db_server
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
$ vagrant ssh db_server
$ ls -la /home/
合計 8
drwxr-xr-x.  3 root    root      20  7月 22 03:38 .
drwxr-xr-x. 18 root    root    4096 12月 23 14:02 ..
drwx------.  4 vagrant vagrant 4096 12月 23 14:31 vagrant

よし。db_serverだけがkimikimi714ユーザのない状態が作れた。これでansible-playbookを実行してみよう。

$ ansible-playbook playbook.yml

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

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

TASK: [add a new user] ********************************************************
ok: [192.168.33.10]
changed: [192.168.33.20]

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

192.168.33.20(db_server)だけがchanged=1になった。web_serverにはユーザがいたので実行していない。playbookで指定したマシンの全部に同じコマンドをいきなり実行するわけではなく、マシンごとの条件を見てコマンドを実行している。


次回(ていうか明日の記事?)ではchefでこれまで書いてきた内容をansibleで書くとどうなるのか試してみる。