Playbookを再利用しやすくするRoleの基本と共有サービスAnsible Galaxyの使い方:Ansibleで始めるサーバ作業自動化入門(4)(2/4 ページ)
本連載では、「マニュアルやシェルスクリプトを使ったサーバ管理に課題を持つ方」を対象に、Ansibleの基本的な使い方を紹介。今回は、プレイブックを再利用しやすくするための機能と、「ロール」と呼ばれる推奨ディレクトリ構成、共有サービスAnsible Galaxyの使い方を紹介します。
プレイブック分割のベストプラクティス「Role」とは
ここまで変数とタスクの分割方法を見てみました。変数、タスクを適切に分割することで、プレイブックが読みやすく、再利用しやすくなりますが、Ansibleの推奨ディレクトリ構成である「ロール(Role)」を使うと、さらに再利用がしやすくなります。
ロールに従ったディレクトリ構成にすることで、自動で変数をファイルから読み込んでくれたり、転送するファイルの相対パス指定が楽になったりといった恩恵を受けられます。また、後述するAnsible Galaxyというコミュニティではロールに従った形式でプレイブックが共有されています。
そのため、ロールの構成を知っておけば他の人が作ったプレイブックを使うことが容易になります。小規模なプレイブックであればロールを使わなくてもよいのですが、他の人が作ったプレイブックを再利用するときのためにロールについて知っておいた方がいいでしょう。
ロールのディレクトリ構成
それでは、まずロールのディレクトリ構成を示します。ロールは以下のようなディレクトリ構成となります。
roles/ - {ロール名}/ - tasks/ - main.yml - vars/ - main.yml - defaults/ - main.yml - files/
各ディレクトリ、ファイルの役割は以下の通りです。
- roles
ロールは「roles」というディレクトリ以下に格納することになっています。このディレクトリ名は変更できません。roles以下にはディレクトリを分けて複数のロールを配置できます。このディレクトリ名がそのままロール名となり、プレイブックでロールを実行する際の指定に使われます。
- tasks
ロール実行時に呼び出されるタスクを配置します。このディレクトリの「main.yml」というファイルがロール実行時に呼び出されます。このファイル名は変更できません。
main.ymlにはincludeモジュールを使ってプレイブックを分割した時と同じようにタスクのみを直接記述します。
- vars、defaults
vars、defaults以下の「main.yml」には変数定義を記述します。このファイル名についても変更できません。記述する内容はvars_filesでファイルを分割した場合と同様です。このファイルに記載した変数は自動でプレイブックに読み込まれるようになります。
なお、defaultsとvarsの違いは読み込まれる変数の優先度です。defaultsはその名前の通り、変数のデフォルト値を意味し、優先度が最も低い変数になり、varsはvars_filesでのファイル読み込みと同じ優先度となります。
そのため、ユーザー名やパスワードのようなロールの利用者によって書き換えられることが望ましい変数はdefaults/main.ymlで定義し、設定ファイルのファイル名のようにロールの利用者が変更するべきではない変数はvars/main.ymlで定義するといいでしょう。
- files
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}
Roleの共有サービス「Ansible Galaxy」とは
Ansibleには、先ほど説明したロールを共有するAnsible Galaxyというコミュニティがあります。Ansible GalaxyはAnsibleユーザーが作成したロールを自由に登録、利用できるようになっています。
Ansibleで行いたい処理が汎用的なものであれば、それを実現するためのロールがすでにAnsible Galaxyに存在しないか探してみるとよいでしょう。
Ansible GalaxyのRoleを使うには
ロールを探す
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.
関連記事
- インフラ自動化ツール「Ansible 2.0」が正式版がリリース
インフラ自動化ツール「Ansible」がメジャーバージョンアップ。リファクタリングによるアーキテクチャの整理に加え、Block文や動的なIncludeなどの新機能が含まれています。 - 「Puppet Enterprise」と「Red Hat Satellite」の連携が実現。一方、レッドハットは「Ansible」を買収へ
Puppet EnterpriseとRed Hat Satelliteが連携可能に。一方、米レッドハットはPuppetの競合とされるAnsibleの買収を発表し、自社ソリューションへの取り込みを表明した。 - レッドハットのホワイトハーストCEOに、OpenStack、Ceph、Ansibleについて聞いた
レッドハットは11月4日、東京都内でRed Hat forum 2015を開催した。来日した米レッドハットのCEO、ジム・ホワイトハースト氏は、プレス向けの説明会で同社の戦略を説明するとともに質問を受け付けた。筆者は、同社にとってのOpenStackの戦略的な意味、およびCephのInktank、Ansibleを買収した狙いについて聞いた。