144
136

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-05-22

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)があります。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を一切使わずに実行することができます。

この指定は接続方法を切り替えることしかしません。なので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オプションが必要です。

# 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
144
136
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
144
136

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?