ども、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 }
もちろん、ohai や facter も利用することが出来る。
適当にコマンドを叩く(ファイルの所在を確認)
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 チートシート」