Ansible: Playbookの繰り返し制御の色々 (6)

今回もAnsiblePlaybookにおける繰り返し制御について、学んでいきます。

引き続き題材は本家のドキュメントから。

シリーズはこちら。

Ansible: Loops
タスクの繰り返し実行に関する内容です。 参照元 ドキュメント 記事一覧
スポンサーリンク

Looping over the inventory

インベントリを使ったループ、ということでこれを実現する方法は複数あるそうです。
一つは、 with_itemsplay_hosts または groups 変数を利用した方法、
もう一つは with_inventory_hostnames を使った方法、と紹介されています。

実際に動かしてみるとわかりやすいので、やってみましょう。

まずは、インベントリファイルとして下記を用意します。

これを利用するようにして、Playbookを実行してみます。

まずは、一つ目の with_items を使う方法です。

tasksの中は、例文通りです。
こちらを実行すると、下記のようになります。

一つ目のタスクで「全てのグループのホスト」、二つ目のタスクで「Playbookで指定しているホスト(グループ)」が表示されました。

今度は、二つ目の with_inventory_hostnames を使う方法です。

これも、tasksの中は例文通りですね。
こちらを実行すると、下記のようになります。

結果は同じ形(実行順がやや違いますが)となっています。
指定した意味としては、一つ目のタスクで「全てのホスト」、二つ目のタスクで「wwwグループ以外で絞り込んだホスト」、ということになります。

このように、自分の必要に応じた形でホストを使ったループ処理が実現できます。
ちなみに、 with_inventory_hostnames で利用している絞り込みのパターンは、こちらの Patterns(本家) に詳細があります。

Loop Control

ここでは、ループの制御のバージョンによる進化が書かれています。

バージョン2.0では、with_loops とタスクのインクルードが使えました。
これにより、一連のタスクを一度にループするできます。
そして Ansible では標準で、ループに item という名前の変数を使います。そして、このために「外側」のループの item の値は上書きされてしまいます。
バージョン2.1では、 loop_control オプションにより、ループに使用する変数名を指定できます。
下記の例を見てみます。

inner.yml 以下が内側のループに相当するところですね。
ここで、外側である main.ymlloop_control で設定した outer_item 変数が利用されています。

また、注意書きとして記載されていますが、 Ansible がすでに定義されている変数名をループ変数として利用しようとしているのを検知したら、エラーとしてタスク失敗としてしまう、という動作となるようです。

次に、バージョン2.2です。
複雑なデータ構造でループを行なった場合、実行時の表示結果が少しうるさい(busy)ものとなります。
これにラベル(label)ディレクティブをつけることで抑制できます。

上記の例だと、サーバ名を表示させることになるので、何を操作しているかもわかりますし、すっきりとした表示になります。

他のループ制御オプションとして、pauseがあります。
こちらは、繰り返し実行ごとに指定した秒を待たせる、というものになります。

こちらは name にある説明の通り、次のサーバを作る前に3秒待つ、という動作になります。

Loops and Includes in 2.0

Ansible のバージョン2.0では loop_control を使えません。
そのため、先ほど紹介した「外側」のループの変数名を変更したい場合には、 set_fact を利用して実現することができます。

古いバージョンしか使えない環境であれば、このような回避方法があるようです。

Writing Your Own Iterators

最後に、自分でループの記述をしたい場合、 Developing Plugins (本家) にプラグイン開発開始のための情報があります。
今まで見てきたように多くの機能が存在しているので、参照する実装は豊富に存在しています。

まとめ

ということで、ループについて一通り確認してきました。
やり始めてからだいぶ時間かけてしまいましたが、何とかやりきれてよかったです。

もう少し参照しやすい形に整理もしたいですね。 

スポンサーリンク
スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする