Ansible には、Playbook を分割し再利用性を高めるための「Roles」という仕組みがあります。プログラミングで言うところのクラスのようなものですね。Playbook を分割すると可読性が高まることも期待できますので、これを使わない手はありません。そこで今回は、Ansible の Roles の使い方についてまとめてみました。
Ansible Roles ディレクトリの作成
まずはじめにロールを格納するためのディレクトリを作成します。(パッケージから Ansibleをインストールした場合は既に作成されているかもしれません)
Ansibleディレクトリ(この記事では /etc/ansible/ としていますが、場所はどこでも構いません)の下に「roles」という名前のディレクトリを作成します。
さらにその下に、分割する単位ごとにディレクトリを作成します。このディレクトリ名(例の場合は「httpd」)が、ロール名になります。分割する単位に制限はありませんが、ミドルウェア単位で分割することが多いようです。
/etc/ansible roles/ httpd/ ←ロール名
Role を構成するディレクトリとファイルの作成
ロールディレクトリの下に、そのロールを構成するための、ディレクトリやファイルを作成します。Ansibleでは、ディレクトリ構造や名前をしっかり定義してくれていますので、他の人が書いた Playbook やロールでも理解しやすいと思います。
files と templates ディレクトリ以外は、ディレクトリ直下に「main.yml」ファイルを配置することが特徴です。このファイルは、ロールを実行する時に最初に読み込まれるファイルです。(HTMLのindex.htmlようなものです)「main.yml」以外のファイルは、main.yml からインクルードして使うことが多いようです。
また、ロールを構成するのに不要なディレクトリやファイルを作成する必要はありません。事実上必須になるのは「tasks/main.yml」だけです。
httpd/ files/ foo.html templates/ foo.j2 tasks/ main.yml ←これは必須 handlers/ main.yml vars/ main.yml defaults/ main.yml meta/ main.yml
各ディレクトリとファイルの役割
files/
copyモジュールを使って配置するファイルを置きます。ファイルフォーマットはなんでも構いません。
templates/
templateモジュールを使って配置するファイルを置きます。Jinja2形式(拡張子「.j2」)のファイルである必要があります。変数を使えることが特徴です。設定ファイルのテンプレートを置くことが多いようです。
tasks/main.yml
実行するタスクを書いておきます。
handlers/main.yml
タスクの実行で変更があった場合に(例えばhttpdがインストールされた)notify から呼び出されるハンドラを書いておきます。
vars/main.yml
ロールで使う変数を書いておきます。優先度の高い変数です。変数の優先順位については下記をご参照ください。
Variable Precedence: Where Should I Put A Variable? | Ansible Documentation
defaults/main.yml
ロールで使う変数のデフォルト値を書いておきます。優先順位が一番低い変数になります。
meta/main.yml
ロールの依存関係を書いておきます。
Role の呼出し方
Ansibleディレクトリ直下の Playbook に roles ディレクティブ記述することで、ロールが呼び出されます。当然ですが Playbook の名前はなんでも構いません。
vi /etc/ansible/site.yml
--- - hosts: all roles: - httpd
サンプルロールの作成
試しに、pingモジュールを実行するだけの簡単なロール作成してみたいと思います。
ロールディレクトリの作成(ロール名は「ping」になります)
タスクディレクトリの作成
タスクの作成
vi /etc/ansible/roles/ping/tasks/main.yml
--- - name: pingモジュール実行 ping:
---
YAMLフォーマットのファイルは、慣習的に「---」(ハイフン3つ)から始めます。
- name:
タスクの簡単な説明を書きます。(これはどのタスクでも共通です)
ping:
pingモジュールを実行します。このモジュールにオプションはありません。
以上で pingモジュール実行ロールの完成です。続いてこのロールを実行してみましょう。
呼出し元の Playbook の作成
呼出し元の Playbook では、対象ホストとAnsible実行ユーザを指定します。
vi /etc/ansible/site.yml
--- - hosts: 172.16.1.111 remote_user: ansible roles: - ping
- hosts:
処理対象のホストを指定します。ホストのIPアドレスまたはFQDNが、インベントリファイル「/etc/ansible/hosts」に、記載されている必要があります。
remote_user:
Ansible実行ユーザを指定します。ユーザの作成方法は「Ansible でユーザの作成」をご参照ください。
roles:
この下に、処理を実行するロールを書いていきます。ロールの指定方法には色々オプションがあるようです、詳細は公式マニュアルをご参照ください。
Playbook Roles and Include Statements | Ansible Documentation
Playbook(ロール)の実行
構文チェック
Playbook を「--syntax-check」オプションを指定して実行します。なにもエラーが表示されなければOKです。
ansible-playbook site.yml --syntax-check
playbook: site.yml
実行
Playbook(ロール)を実行します。
ansible-playbook site.yml
以下のような表示であれば成功です。
PLAY [172.16.1.111] ************************************************************ TASK [setup] ******************************************************************* Enter passphrase for key '/home/foo/.ssh/id_rsa': ok: [172.16.1.111] TASK [ping : pingモジュール実行] ****************************************************** ok: [172.16.1.111] PLAY RECAP ********************************************************************* 172.16.1.111 : ok=2 changed=0 unreachable=0 failed=0
pingロールに定義したタスク(pingモジュール実行)が実行されていることが確認できると思います。
終わりに
上のように簡単なタスクの場合は、Rolesを使うメリットはあまり感じられませんが、Apache httpd のインストールと設定をするロール、MySQLのインストールと設定をするロール、などを1度作っておけば、再利用が容易に出来るのことは大きな魅力です。Ansibleでは是非Rolesを使いこなしたいですね。
次回は、この Roles の仕組みを使って、SSHのセキュリティ設定を行うロールを作ってみたいと思います。
コメント