ここまで変数とタスクの分割方法を見てみました。変数、タスクを適切に分割することで、プレイブックが読みやすく、再利用しやすくなりますが、Ansibleの推奨ディレクトリ構成である「ロール(Role)」を使うと、さらに再利用がしやすくなります。
ロールに従ったディレクトリ構成にすることで、自動で変数をファイルから読み込んでくれたり、転送するファイルの相対パス指定が楽になったりといった恩恵を受けられます。また、後述するAnsible Galaxyというコミュニティではロールに従った形式でプレイブックが共有されています。
そのため、ロールの構成を知っておけば他の人が作ったプレイブックを使うことが容易になります。小規模なプレイブックであればロールを使わなくてもよいのですが、他の人が作ったプレイブックを再利用するときのためにロールについて知っておいた方がいいでしょう。
それでは、まずロールのディレクトリ構成を示します。ロールは以下のようなディレクトリ構成となります。
roles/ - {ロール名}/ - tasks/ - main.yml - vars/ - main.yml - defaults/ - main.yml - files/
各ディレクトリ、ファイルの役割は以下の通りです。
ロールは「roles」というディレクトリ以下に格納することになっています。このディレクトリ名は変更できません。roles以下にはディレクトリを分けて複数のロールを配置できます。このディレクトリ名がそのままロール名となり、プレイブックでロールを実行する際の指定に使われます。
ロール実行時に呼び出されるタスクを配置します。このディレクトリの「main.yml」というファイルがロール実行時に呼び出されます。このファイル名は変更できません。
main.ymlにはincludeモジュールを使ってプレイブックを分割した時と同じようにタスクのみを直接記述します。
vars、defaults以下の「main.yml」には変数定義を記述します。このファイル名についても変更できません。記述する内容はvars_filesでファイルを分割した場合と同様です。このファイルに記載した変数は自動でプレイブックに読み込まれるようになります。
なお、defaultsとvarsの違いは読み込まれる変数の優先度です。defaultsはその名前の通り、変数のデフォルト値を意味し、優先度が最も低い変数になり、varsはvars_filesでのファイル読み込みと同じ優先度となります。
そのため、ユーザー名やパスワードのようなロールの利用者によって書き換えられることが望ましい変数はdefaults/main.ymlで定義し、設定ファイルのファイル名のようにロールの利用者が変更するべきではない変数はvars/main.ymlで定義するといいでしょう。
copyモジュールでファイルパスを指定する際、files以下に置いたファイルはパスを指定せずファイル名だけで指定可能です。
ロールが完成したら、ロールを実行するためのプレイブックを作成します。ロールを実行するにはtasksの代わりに「roles」要素を使い、実行するロール名を指定します。
setupというロールを実行するためのプレイブックの例は以下の通りです。
- hosts: all become: yes become_user: root roles: - setup
このプレイブックもtasksを使った通常のプレイブックと同様にansible-playbookコマンドで実行可能です。
ロールを実行する際は、プレイブックと同じディレクトリのrolesディレクトリ以下のロールがまず探索され、その後、Ansibleの設定ファイル(/etc/ansible/ansible.cfg)のroles_pathで指定されたディレクトリ以下から探索されます。これはデフォルトでは「/etc/ansible/roles」です。
また、ロールで利用する変数の値を上書きしたい場合、タスクのincludeでもできたように、ロールを実行するプレイブックから値を設定可能です。defaults/main.ymlを書き換えることでも変数の値は変更できますが、ロールを実行するプレイブックで変数の値を指定する方が一般的です。
ロールのuser_nameという変数の値を上書きするには以下のように指定します。
- hosts: all become: yes become_user: root roles: - {role: setup, user_name: hoge}
Ansibleには、先ほど説明したロールを共有するAnsible Galaxyというコミュニティがあります。Ansible GalaxyはAnsibleユーザーが作成したロールを自由に登録、利用できるようになっています。
Ansibleで行いたい処理が汎用的なものであれば、それを実現するためのロールがすでにAnsible Galaxyに存在しないか探してみるとよいでしょう。
Ansible Galaxyのロールを利用するに当たって、まずは自分が必要とする処理を行うロールを探さなければいけません。
Ansible Galaxyで公開されているロールは公式サイトから検索可能です。このページ上部にある「BROWSE ROLES」を選択すると、ロールの検索画面に遷移します。ページ上部の検索窓にインストールしたいパッケージ名などを入力して検索してみてください。
検索結果にはロール名や作成者や作成日、対象OSの情報が表示されるので、それらしい名称のロールを見つけたら被管理ホストのOSが対象OSに含まれているかどうかを確認し、クリックしてロールの個別ページに飛んでください。なおCentOSは、「EL」(Enterprise Linux)と表記されます。
個別ページでは、ロールの概要やロールの実行に必要なAnsibleのバージョン、ロールを利用するためのプレイブックの例などを確認できます。また、後述しますが、Ansible Galaxyではロールの公開にGitHubを利用しているため、GitHubの該当ページに飛んでロールの中身を確認可能です。
ロールの内容が問題なさそうであれば、「Details」タブの「Installation」に記述されているコマンドを実行し、ロールをインストールしてください。
ロールをインストールするコマンドは以下の形式となっています。
# ansible-galaxy install {ユーザー名}.{ロール名}
上記コマンドを実行すると、Ansibleの設定ファイルの「roles_path」で指定されたディレクトリにロールがダウンロードされます。その後、個別ページの「プレイブック実行例」の通りにプレイプックを作成すれば、ロールを実行可能です。
Copyright © ITmedia, Inc. All Rights Reserved.