Ansible Playbookでタスクを実行する過程で 、本質的に反復的ないくつかのタスクに遭遇する可能性があります。これらは、複数のプレイを作成する必要があるタスクであり、非常に面倒な場合があります。他のプログラミング言語と同様に、Ansibleのループは、プレイブックのより少ないコード行を使用して反復タスクを実行する簡単な方法を提供します。
ループを作成するとき、Ansibleは次の2つのディレクティブを提供します: loop およびwith_ * キーワード。
loopキーワードが最近Ansible2.5に追加されました 。 loopキーワードは通常、複数のアイテムを反復処理する単純で標準的なループを作成するために使用されます。
with_ * キーワードは、値を反復処理するときに多くのルックアッププラグインで使用されます。ルックアッププラグインを使用すると、Ansibleは外部データストアやファイルシステムなどの外部ソースからの情報にアクセスできます。 with _ * ルックアップはまだ非常に使用されており、まだ非推奨ではありません。
それでは、Ansibleでループを実装する方法を見てみましょう。
単純なループの反復
次のように、ユーザーモジュールを使用してターゲットシステムに新しいユーザーを追加するPlaybookについて考えてみます。
----ホスト:ubuntu_webserverタスク:-名前:新しいユーザーを作成するjohnユーザー:名前:john状態:存在する
これは大丈夫そうです。しかし、ターゲットシステムに追加するユーザーが複数いる場合はどうなるでしょうか。どうすればいいですか? 1つの方法は、3人のユーザーを追加する以下の例に示すように、タスクを複製することです。
----ホスト:ubuntu_webserverタスク:-名前:新しいユーザーを作成するjohn user:name:john状態:present-name:新しいユーザーmikeを作成するuser:user:user:user and name:present- :名前:アンドリュー状態:存在
ご覧のとおり、これには多くの重複と繰り返しが必要です。
物事を簡単にするために、同じプレイブックをloopディレクティブを使用して作成できます。 loopディレクティブは、同じタスクを複数回実行します。各アイテムの値をアイテムという変数に格納します したがって、追加するユーザーの名前を指定する代わりに、図のように二重中括弧で囲まれたitemという変数を指定するだけです。
名前:‘{{item}}’
したがって、ループ内の各項目は変数によって参照されます。
ご覧のとおり、私たちのプレイブックは、不要な複製/繰り返しではるかに整理されています。
$ vi create_users.yaml ---- hosts:ubuntu_webserver tasks:-name:Create new users user:name:'{{item}}' state:present loop:-john-and --mike
また、 with_itemsを使用することもできます ループディレクティブの代わりにディレクティブ。どちらも同じ結果になります。
----ホスト:ubuntu_webserverになる:はいタスク:-名前:新しいユーザーを作成するユーザー:名前:'{{item}}'状態:存在するwith_items:-john-rewこれで、プレイブックを実行して、 ansible-playbookを使用してユーザーを作成できます。 以下に示すコマンド:
$ ansible-playbook -i Inventory.txt create_users.yaml
辞書のリストを反復処理する
最初の例では、配列がリモートターゲットに追加されるユーザーを表す文字列値のリストである単純な標準ループを調べました。
しかし、 uidを追加する必要がある場合はどうなりますか 各アイテムが2つの値を持つようにループに追加します:ユーザー名 およびuid 。配列で2つの値をどのように渡しますか?
このシナリオでは、示されているように、それぞれが2つのキーと値のペアを持つ辞書の配列を渡す必要があります。キーは名前とuidになり、値はユーザー名と各ユーザーのIDになります。
「タスク」の下 ‘セクションでは、以前のように変数アイテムを定義できなくなりました。 2つの値があるため、これは2つの変数に変換されます: item.name & item.uid 。
完全なプレイブックを以下に示します:
$ vi create_users.yaml ----ホスト:ubuntu_webserverになる:はいタスク:-名前:新しいユーザーを作成するユーザー:名前:'{{item.name}}' uid:'{{item.uid}}'状態:存在ループ:-名前:john uid:1020 --name:mike uid:1030 --name:andrew uid:1040
辞書の配列は、JSON形式で表すこともできます。
loop:-{name:john、uid:1020}-{name:mike、uid:1030}-{name:andrew、uid:1040}実行すると、次の出力が得られます。
$ ansible-playbook -i Inventory.txt create_users.yaml
インデックス付きのAnsibleループ
場合によっては、アイテムの配列内のインデックス値を追跡したいことがあります。これには、「 with indexed_items」を使用します ' 見上げる。インデックス値は0から始まり、ループインデックスは item.0から始まります。 およびitem.1からの値
以下のプレイブックを検討してください:
$ vi indexs.yaml ----ホスト:ubuntu_webserverタスク:-名前:Ansibleループを使用したインデックスdebug:msg:"{{item.0}}の車は{{item.1}}"with_indexed_items: -「日産」-「メルセデス」-「トヨタ」-「マツダ」-「BMW」
実行されると、プレイブックには配列リスト内の各アイテムのインデックス値が表示されます。
$ ansible-playbook -i Inventory.txt indexs.yaml
Ansibleループの条件
Ansibleループでは、変数の性質またはシステムファクトに基づいてループを制御するときに、条件ステートメントを使用できます。インストールする必要のあるパッケージのリストがある以下のプレイブックを検討してください。
「パッケージ」という配列を指定しました ‘には、インストールする必要のあるパッケージのリストが含まれています。配列の各項目には、インストールするパッケージの名前と「必須」というプロパティが含まれています ‘は‘ True に設定されています 2つのパッケージの場合は‘、‘ False ‘1つのパッケージに対して。
$ vi install-packages.yaml ----名前:インストールソフトウェアbecome:yes hosts:all vars:packages:-name:neofetch required:True --name:cpu-checker required:True --name:screenfetch required:誤ったタスク:-name:Ubuntuに「{{item.name}}」をインストールしますapt:name: "{{item.name}}" state:present when:--item.required ==True] --ansible_facts =="Ubuntu"ループ: "{{packages}}"
「いつ ‘条件文は、プロパティ‘必須を持つソフトウェアパッケージをインストールしようとします ‘を‘ Trueに設定 ’はUbuntuディストリビューションであるターゲットシステム上にあります。以下は、実行時のプレイブックの出力です。
詳細な出力には、インストールされているパッケージと、条件ステートメントに基づいて無視されているパッケージが明確に示されます。
そして、これでこのトピックは終わりです。 Ansibleプレイブックのループについて十分に理解されていることを願っています。ご不明な点がございましたら、お気軽にお問い合わせください。
また読む :AnsiblePlaybookでJinja2テンプレートを使用する方法
Linux