ども、cloudpack の 全部初心者のかっぱ (@inokara) です。

はじめに

沢山のホストに同じ設定をぶち込みたい時に Ansible が気持ちよかったのでメモ。

インベントリファイルの準備

以下のようなインベントファイルを test-hosts という名前で保存しておく。

[foo-bar]
xxx.xxx.xxx.xxx     ansible_connection=ssh        ansible_ssh_user=ssh-user    ansible_ssh_private_key_file=~/.ssh/key.pem

ansible 編

ohai 的なの

python では fact が ohai 的な動きをして対象ホストの情報を JSON で返却する。

ansible -i test-hosts test-host -m setup

Amazon Linux の場合には以下のように JSON で出力される。

xxx.xxx.xxx.xxx | success >> {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "yyy.yyy.yyy.yyy"
        ],
        "ansible_all_ipv6_addresses": [
            "zzzz::zzz:zzzz:zzzz:zzzz"
        ],
        "ansible_architecture": "x86_64",
        "ansible_bios_date": "12/03/2014",
        "ansible_bios_version": "4.2.amazon",
        "ansible_cmdline": {
            "KEYTABLE": "us",
            "LANG": "en_US.UTF-8",
            "console": "ttyS0",
            "root": "LABEL=/"
        },
        "ansible_date_time": {
            "date": "2015-02-06",
            "day": "06",
            "epoch": "1423184726",

(snip)

              "ansible_swaptotal_mb": 0,
        "ansible_system": "Linux",
        "ansible_system_vendor": "Xen",
        "ansible_user_id": "ec2-user",
        "ansible_userspace_architecture": "x86_64",
        "ansible_userspace_bits": "64",
        "ansible_virtualization_role": "guest",
        "ansible_virtualization_type": "xen",
        "module_setup": true
    },
    "changed": false
}

もちろん、ohaifacter も利用することが出来る。

適当にコマンドを叩く(ファイルの所在を確認)

ansible -i test-hosts foo-bar -a 'ls -l /etc/hosts'
xxx.xxx.xxx.xxx | success | rc=0 >>
-rw-r--r-- 1 root root 44 10月  8 01:25 /etc/hosts

適当にコマンドを叩く(パイプを挟んで複数のコマンドを叩く)

パイプ、リダイレクトを使う場合には shell モジュールを使う。

ansible -i test-hosts foo-bar -m shell -a "ls -l /etc/* | grep hosts"
xxx.xxx.xxx.xxx | success | rc=0 >>
-rw-r--r--  1 root     root      44 10月  8 01:25 /etc/hosts
-rw-r--r--  1 root     root     370  1月 12  2010 /etc/hosts.allow
(snip)

サービスのリロード

サービスの制御は service モジュールを使う。

ansible -i test-hosts foo-bar -m service -a "name=haproxy state=reloaded"

state=reloaded のように過去形で書く必要がある。以下のように --check オプションで動作確認も可能。

ansible -i test-hosts test-host -m service -a "name=haproxy state=reloaded" --check
xxx.xxx.xxx.xxx | success >> {
    "changed": true,
    "msg": "service state changed"
}

ansible-playbook 編

ファイル転送

---
- hosts: foo-bar
  sudo: yes
  gather_facts: no
  tasks:
    - name: access.log.conf upload
      copy: src=./hoge dest=/path/to/hoge owner=root group=root mode=0644

以下のように実行する。

ansible-playbook -i test-hosts test.yml

コマンド実行

---
- hosts: foo-bar
  sudo: yes
  gather_facts: no
  tasks:
    - name: td-agent reload
      command: service td-agent reload

以下のように実行する。

ansible-playbook -i test-hosts test.yml

最後に

SSH を for 文で回すよりは進歩したような気がする。

元記事はこちらです。
俺のシチューエーション別 Ansible チートシート