このブログ記事では、Ansibleにおけるロールと他の関連する機能について紹介します。
前回の記事では、特定のノードやタスクをターゲットにするためのグループ化とタグ、そしてファイル、サービス、 ユーザーを管理するためのいくつかの便利なモジュールについて説明しました。これらの機能を活用し、 より大規模なプロジェクトの構成を管理するにつれて、プレイブックは必然的に長くなります。 そこで、この記事では、タスクを整理し、柔軟な構成を処理することを可能にするロールやその他の機能について説明します。
ロール
Ansibleにおけるロールは異なるタスクやその他の関連コンポーネントを別々のディレクトリにバンドルし、
それらを異なるホストに割り当てることができます。以下は、ルートのmain.yamlファイルでホストにロールを割り当てる方法を示しています。
- host: all
become: true
roles:
- base
- host: web_servers
become: true
roles:
- web_servers
- host: db_servers
become: true
roles:
- db_serversロールのタスクは、rolesディレクトリの<role_name>/tasksサブディレクトリ内のmain.yamlファイルで整理できます。
例えば、以下に示すように、web_serversロール用のApacheとPHPパッケージをインストールするタスクを定義できます。
- name: install apache and php
package:
name:
- "{{ apache_package }}"
- "{{ php_package }}"
state: latest
update_cache: yestasksディレクトリ内のmain.yamlファイルはタスクブックと呼ばれます。これは、タスクのみを定義し、
通常プレイブックで使用されるhosts、become、その他のフィールドを指定しないためです。
ansible-playbook main.yamlを実行すると、ホストに割り当てられたロールのタスクブックで定義されたタスクが、
ルートプレイブックで定義されたかのように実行されます。
ホスト変数 & ハンドラー & テンプレート
上記のweb_serverロールのタスクは、ホスト変数を置き換えることができるテンプレート機能を利用しています。
前回の記事では、インベントリファイルでホスト変数の値を定義しましたが、より良い整理のために、
以下に示すようにhost_varsディレクトリ内の<host>.yamlファイルでホスト変数を定義することもできます。
apache_package: httpd
php_package: phpまた、registerの代わりにnotifyを使用して、notifyを持つ少なくとも1つのタスクで行われた変更が別のタスクを適切にトリガーできるようにすることもできます。
notifyから通知を受けるタスクはハンドラーと呼ばれ、notifyは変数の代わりにハンドラーの名前を使用します。
- name: restart_apache
service:
name: "{{ apache_name }}"
state: restartedハンドラーは、上記に示すように、<role_name>/handlersサブディレクトリ内のmain.yamlファイルで整理できます。
同じロール内で定義されたタスクは、notify: restart_apacheを使用してハンドラーをトリガーできます。
さらに、以下に示すようにtemplateモジュールを使用して、他のファイルでもホスト変数のテンプレートを使用できます。
- name: generate ssh_config file from template
tags: ssh
template:
src: "{{ ssh_template_file }}"
dest: /etc/ssh/sshd_config
owner: root
group: root
mode: 0644
notify: restart_sshssh_template_fileはホスト変数の1つで、その値はroles/base/templatesディレクトリ内のテンプレートファイルの名前です
(テンプレートがロール内で定義されている場合、フルパスは不要です)。ssh_configなどのテンプレートは{{ ssh_users }}のような変数を使用し、
対応するホスト変数の値で置き換えることができます。
boostrap.yaml
host_vars
main.yaml
roles/
├── base/
│ ├── handlers
│ ├── tasks
│ └── templates
...上は、これまで説明してきた機能を活用して、Ansibleを使用して大規模プロジェクトのインフラストラクチャ構成を管理するための1つのファイル構造の例です。 ファイル構造と機能は、プロジェクトの要件に基づいて選択する必要があります。
結論
この記事では、Ansibleの様々なコンポーネントを整理するためのロールとその他の関連機能について説明しました。 Ansibleファイルは、適切なバージョン管理とCI/CDのために、Git/GitHubやTerraformなどの他のDevOpsツールで管理する必要があります。 他にも便利なモジュールや機能が利用可能なので、それらを探索することを強くお勧めします。
リソース
- Ansible. n.d. Ansible Documentation. Ansible Community Documentation.
- Learn Linux TV. 2020. Getting started with Ansible. YouTube.