Help us understand the problem. What is going on with this article?

Ansibleチートシート(実行周り)

More than 3 years have passed since last update.

Playbookの書き方はググればいくらでもサンプルがでてくるんですが、実行の仕方とかまとまってない気がしたので。

Ansibleのセットアップ

ドキュメント読もう。Ubuntu系ならPPAあります。
http://docs.ansible.com/intro_installation.html

Inventory

http://docs.ansible.com/intro_inventory.html

シンプルな例

192.168.0.1
192.168.0.2:12345

/etc/ansible/hostsに置くか、適当なとこにおいて-i(--inventory)オプションないしANSIBLE_HOSTS環境変数でパスを指定。

なおInventoryファイルに実行権限(+x)があるとDynamicInventoryと勘違いされ、実行できないよ!!みたいなエラーが出るので注意。Windowsの共有フォルダをマウントしたら全ファイルに+xついてて嵌りました。

http://docs.ansible.com/intro_dynamic_inventory.html

これ作るの面倒

カンマで区切れば引数で直接指定できるようです。カンマで区切れば、なので、一つだけ指定したい時も先頭か末尾にカンマをつける必要があります。

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ファイルに記述がなければエラーになります。

http://docs.ansible.com/intro_patterns.html

実行

# モジュールの実行
# 適当に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)があります。ansibleansible-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を一切使わずに実行することができます。

http://docs.ansible.com/playbooks_delegation.html#local-playbooks

この指定は接続方法を切り替えることしかしません。なのでInventoryは必要ですし、対象がlocalhostでなくても(勿論ローカルで)実行されますし、条件に該当するホストが複数あればローカルで複数回実行されます。

またマニュアルには書かれていませんが、現時点(1.6.2)ではlocalhost127.0.0.1に限り、Inventoryに記述がなくてもhost-patternとして使うことができるようです。この場合、--connection localが自動的に指定されます。

但し、Inventoryにlocalhost127.0.0.1の記述があればそちらが優先されます。この場合は自動localが働かないので、Inventoryにansible_connection=localと書くか、--connectionオプションが必要です。

https://github.com/ansible/ansible/blob/release1.6.2/lib/ansible/inventory/__init__.py#L315

# 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も書いておきましょう。
  • 時々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
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away