Ansible Roles の使い方(Playbookの分割と再利用)

Linux
Linux
スポンサーリンク

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」になります)

mkdir -p /etc/ansible/roles/ping

タスクディレクトリの作成

mkdir /etc/ansible/roles/ping/tasks

タスクの作成
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です。

cd /etc/ansible/
ansible-playbook site.yml --syntax-check
 
playbook: site.yml

実行

Playbook(ロール)を実行します。

cd /etc/ansible/
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のセキュリティ設定を行うロールを作ってみたいと思います。

コメント

タイトルとURLをコピーしました