Playbookの書き方はググればいくらでもサンプルがでてくるんですが、実行の仕方とかまとまってない気がしたので。
Ansibleのセットアップ
ドキュメント読もう。Ubuntu系ならPPAあります。
http://docs.ansible.com/intro_installation.html
Inventory
シンプルな例
192.168.0.1
192.168.0.2:12345
/etc/ansible/hosts
に置くか、適当なとこにおいて-i
(--inventory
)オプションないしANSIBLE_HOSTS
環境変数でパスを指定。
なおInventoryファイルに実行権限(+x)があるとDynamicInventoryと勘違いされ、実行できないよ!!みたいなエラーが出るので注意。Windowsの共有フォルダをマウントしたら全ファイルに+xついてて嵌りました。
これ作るの面倒
カンマで区切れば引数で直接指定できるようです。カンマで区切れば、なので、一つだけ指定したい時も先頭か末尾にカンマをつける必要があります。
http://stackoverflow.com/questions/17188147/how-to-run-ansible-without-specifying-the-inventory-but-the-host-directly
https://github.com/ansible/ansible/blob/release1.6.2/lib/ansible/inventory/__init__.py#L70
host-pattern
ansibleコマンドやplaybookのhosts:節で指定するのはhost-patternと呼ばれるもので、Inventoryに記述されたホストを絞り込むパターン文字列です。このため、例えIPアドレスであってもInventoryファイルに記述がなければエラーになります。
実行
# モジュールの実行
# 適当にsshコマンドを走らせて、known_hostsに入れておく
# 公開鍵認証とかでパスワード不要なら-k(--ask-pass)はいらない
ansible -k -m apt -a "pkg=vim state=present"
# Playbookの実行
# オプションはansibleコマンドとだいたい同じ
ansible-playbook -k main.yml
その他のオプション
Playbookでsudo使いたい
http://docs.ansible.com/playbooks_intro.html の中ほどにある話。
playbookでsudo:yes
と書く他に、-s
(--sudo
)オプションでも指定できます。
NOPASSWDにしてないなら-K
(--ask-sudo-pass
)使いましょう。
テストしたい
-C
(--check
)があります。ansible
とansible-playbook
どちらでも使えます。
ただし、changedになる処理を行わなずに続行するだけなので
-
apt: update_cache=true
とかするとローカルキャッシュが更新されます
(aptモジュールのchange処理ってパッケージの追加・削除なので) - 前のタスクに依存してるとこけたりします。例えば
tasks:
- name: インストールしておく
apt: pkg=hoge state=present
- name: 上でインストールされたファイルをごにょごにょ
lineinfile: path=/etc/hoge/foo.cfg ... # ファイルがない!
ローカルでの実行
--connection
オプションで接続方法を指定できますが、ここでlocalを指定するとsshを一切使わずに実行することができます。
この指定は接続方法を切り替えることしかしません。なのでInventoryは必要ですし、対象がlocalhostでなくても(勿論ローカルで)実行されますし、条件に該当するホストが複数あればローカルで複数回実行されます。
またマニュアルには書かれていませんが、現時点(1.6.2)ではlocalhost
と127.0.0.1
に限り、Inventoryに記述がなくてもhost-patternとして使うことができるようです。この場合、--connection local
が自動的に指定されます。
但し、Inventoryにlocalhost
や127.0.0.1
の記述があればそちらが優先されます。この場合は自動localが働かないので、Inventoryにansible_connection=local
と書くか、--connection
オプションが必要です。
# local実行. localhostはInventoryにあってもなくても指定できる.
ansible localhost -c local
# Inventoryにlocalhostが"なければ"local実行
# Inventoryに記述があればそれが使われる
ansible localhost
# localhost/127.0.0.1なら空のファイルを指定してもok
# それ以外のhost-patternだと"No hosts matched"
ansible localhost [-c local] -i /dev/null
# -c localを指定した場合、ホストに関わらずローカルで実行される
ansible all -c local -i example.com,
playbookをこのように実行したい場合・・・
- いつもlocalで実行したい
- playbookに
hosts: localhost
と記述する - Inventoryは適当に1ホスト分用意すればいいですが、localhostを書いてしまうと自動local働かないので注意。心配ならplaybookに
connection: local
も書いておきましょう。
- playbookに
- 時々localで実行したい
- グループを使わず
hosts: all
と書いているなら、実行時に-c local -i hoge,
を付ける(hogeの部分は適当なホスト名) - でなければ、グループごとに
localhost ansible_connection=local
が書かれただけのinventoryファイルを用意
- グループを使わず
Inventoryファイルを作成する方法が汎用性高くてよさそうですね。
なおansible
コマンドと違い、hosts: localhost
と指定しても、Inventoryは何か指定しないといけないようです。
ansible-playbook -c local -i /dev/null
# ERROR: provided hosts list is empty
ansible-playbook -c local -i ,
# ERROR: provided hosts list is empty