BFT名古屋 TECH BLOG

日々の業務で得た知識を所属するエンジニアたちがアウトプットしていきます。

【Ansible】Playbookの構造:4つのセクション

 こんにちは!
 BFT名古屋支店の、佐野です。

 この1月半ばから終わりにかけて、AnsibleおよびAnsibleTowerの技術研修の講師を行なわさせて頂きました。
 Ansibleについては知識としてや業務として関わっていましたが、それを誰かに教えるというのは、中々に大変かつ手ごたえを感じるものでありました。
 貴重な経験をさせてもらったということで、関係者各位への感謝の念でいっぱいです。

 さて、そんなこともあってAnsibleについての様々を研修のお題目とするために再検証や知識の入れ直しも行なっていたので、それらのアウトプットを今後記事として仕上げていこうと考えておりまして、今回はその第一回目となります。
 お送りする内容は「Playbookのセクションについて」です。


はじめに

 筆者は当初、Playbookというものの構造を知らないままにPlaybookを書いたり見たりしておりました。
 そのレベルであっても理解でき、何となくで組めてしまうのがPlaybookの良さのひとつです。
 ただ、やはりそれであると「雰囲気でPlaybookを見ている/作っている」という域を脱せず、踏み込んだ作り込みや読解も難しくなります。
 ですので今回は改めて、Playbookというものの構造を少し掘り下げていきたいと思います。


Playbookの構造

 Playbookは構成管理対象となるターゲットノードで実行したい処理の流れを記載するファイルですが、厳密に言えば“Play”と呼ばれる処理の塊を並べたものとなっています。
 ひとつのPlayの中では複数の処理=タスクを定義し、そのタスクを実行したい構成管理対象あるいはグループに関連付けることにより、一連の処理を実行できます。

 またひとつのPlayは、以下の図の通りTargets、Vars、Tasks、Handlersという4つのセクションによって構成されています。

f:id:bftnagoya:20210202124200p:plain

 このように、4つ(最低2つ)のセクションからなるPlayをひとつ、なしい複数持ったものがPlaybookであると言えます。
 なおPlayの中では、ディレクティブと呼ばれるキーを配置し、そのキーに入れた値によって処理を定義することができます。
 上図の場合においては「hosts:」や「vars:」といったものがディレクティブに当たります。

 そしてPlayを構成するそれぞれのセクションは以下のような性質と役割を持ちます。

Targets セクション

 構成管理対象となるターゲットノードを特定するセクションです。
 インベントリで定義したホストやグループ名をここで指定し、Play内の処理を行なう対象として定めます。

 その特性上、Playを構成するために必須となります。

Vars セクション

 Play上で使用する変数を定義できるセクションです。
 Varsセクションで定義できる変数は“Play変数”を呼ばれ、変数を定義するためのディレクティブとしてvars、vars_files、vars_promptの3つが存在します。
 vars、vars_files、vars_promptに関しては、また別の記事にて解説しようと考えております。

 VarsセクションはPlayの中では補助的要素であり、記述しなくても問題なく動作します。

Tasks セクション

 構成管理対象への処理を定義するセクションです。
 Tasks セクションに記述した処理は、定義した順番、つまり上から順に実行されていきます。
 その為、もし後の処理の前提の処理となる様なものがあれば、それらから先に記述するということが必要になります。

 また処理の主となる特性上、Playを構成するために必須となります。

Handlers セクション

 Tasksセクションで行なわれる処理とは別の、追加の処理を定義するセクションです。
 “notifyを配置したタスクの実行結果が更新(changed)だった場合、notifyディレクティブで指定した名前のタスクを行なう”という場合に使用します。
 上図の場合は「put index.php」の実行結果が更新(changed)の場合に、notifyディレクティブで指定されている「put bftlogo.png」の処理が実行される、ということになります。
 もし「put index.php」の実行結果がOKだった場合には、「put bftlogo.png」の処理は実行されません。

 このセクションもPlayの中では補助的要素であり、記述しなくても問題なく動作します。


さいごに

 以上がPlaybookの構造となります。
 必須となるTargetsセクションやTasksセクションは自ずと使うとしても、VarsセクションやHandlersセクションに関しては知らない、という人は結構多いかと思います。
 Varsセクションでは変数を定義できますが、簡単な変数であればHostsセクションで定義することも可能ですし、Handlersセクションを使うような処理をしない、するべき時でも別の方法で何とかしてしまった…といったようなパターンは“あるある”です。

 普段何となしに使っているものだからこそ、細かい仕様に気付けなかったりするものですが、たとえ「使えている」ものでも、それが何者で何ができるかというのを知ることは大切なことです。
 二番三番煎じとなるかもしれませんが、こういった「おさらい」になるような話を、今後していけたらと思います。