こんにちは!
BFT名古屋支店の、佐野です。
前回に続いて、今回もAnsible関連の記事です。
AnsibleはPlaybookに管理対象で行なう処理を記述し、Playbookを実行する事によりその処理が管理対象で実施されるわけですが、例えば管理対象に対して一連の流れとして行いたい処理がある時、いくつものPlaybookを用意して、ひとつのPlaybookの実行が完了してから次のPlaybookを実行……というのは少々面倒かと思います。
だからと言って全部の処理をひとつのPlaybookに書いたのでは、そのPlaybookでエラーが起きた時に切り分けが大変となりますし、後に変更を加えるようなことがあれば、その変更を差し込む場所を探したり決めたりが煩わしくなります。
Ansibleの機能拡張ソフトウェアであるAnsibleTowerやAWXでは、ワークフローを組んでPlaybookの順次実行を行なうことが可能ですが、単に順次実行を行なわせるためだけにそれらを用意するのは大袈裟であると言わざるを得ません。
ではどうすればよいかということで、Ansibleの機能のひとつである【Role】を利用する方法を今回は紹介いたします。
【Role】を利用することで、Playbookを肥大化させることなく、かつ分割したPlaybookの順次実行が可能となります。
はじめに:Roleとは
Roleとは、Playbookを分割するコンポーネントであり、加えて以前の記事にて解説したTasksセクションやVarsセクションを別のファイルに分けて管理する仕組みです。
Roleを活用すれば、ひとつの処理を担当するPlaybookを入れたディレクトリを複数個と、これらの処理を呼び出すためのPlaybookを用意することで、一連の流れで複数のPlaybookを順次実行することが可能になります。
例として、弊社にて開催したAnsible研修にて使用したRoleの活用図を示します。
ApacheとPHPのインストールを行なう「pkg-install」、インストールしたApacheを起動する「service-start」、管理対象にphpやpngといった資材を配置する「file-put」を、順番にBftRole.ymlを用いて実行していく流れとなっています。
またBftRole.ymlの内容は以下の通りです。
「roles:」で指定したディレクトリのPlaybookを、順次実行するという処理内容になっています。
- hosts: all roles: - pkg-install - service-start - file-put
Roleの構造
では実際にRoleを利用する場合、どういったディレクトリ構造にすればよいのか。
それを、上述の図にあった「pkg-install」を例に取って解説します。
詳細なディレクトリ構造を表わすと、以下の図にようになります。
Roleを利用する場合には、まずrolesディレクトリ配下に各処理を担当するディレクトリを作成する必要があります。
この場合においてはpkg-installディレクトリとなります。
さらにそのpkg-installディレクトリの配下に、以前の記事にて紹介したPlaybookのセクションに相当するディレクトリを作成して、そのセクションの処理に相当する内容を記述した“main.yml”を配置します。
このように各セクションに対応するディレクトリに配置した“main.yml”は、そのセクションにあるものとして動作します。
図だけを見ると、一見多くのディレクトリを用意しなければならない面倒なものという認識を受けるかもしれませんが、実際は各セクションをディレクトリで分けて定義しているだけでありますので、そこさえ分かってしまえば単純に感じるかと思います。
(実際に筆者はディレクトリ構成が複雑だなというのが第一印象でしたが、噛み砕いた時に印象ががらりと変わりました)
なおtargetセクションに相当するディレクトリは存在しません。
targetセクションはroles配下にあるPlaybookの順次実行するPlaybook(今回の場合はBftRole.yml)で定義されるものであり、ターゲットノードを定めない状態でPlaybookを実行することはできない故となります。
ちなみに、Roleを利用する場合はこの図のディレクトリのように「Ansibleが認識できるディレクトリ構造を作り、ファイルを配置する」ことが必要になります。
各セクションを担当するディレクトリ配下のPlaybookが全て“main.yml”となっているのは、Roleの仕組みを用いてPlaybookを実行する際に読み取られるものが“main.yml”に固定されており、それ以外の名称のPlaybookは個別にincludeで読み込まなければ実行することができないためです。
さいごに
以上がRoleを用いたPlaybookの実行概要と、Roleの概要となります。
Roleを利用する場合、ディレクトリが各セクションを表わすようになることと、各セクション配下のPlaybookの名称を“main.yml”固定としなければならないことに注意すれば、Roleについては使いこなすことは容易かと思います。
(includeを使う場合は名称固定ではなくなりますが、main.ymlは必ず必要になります)
もしも一連の流れとして実行しているPlaybookがあり、手動で順次実行するのが煩わしいとなった時は、本記事を参考にRole化することを一考して頂ければ幸いです。
※冒頭でAnsibleTowerやAWXのワークフローについて触れましたが、それについては別記事で一本書こうと考えております。