このエントリーをはてなブックマークに追加

概要

 AnsibleのPlaybookを作成する際に、1つのPlaybookにあまりにも多くの処理を記述してしまうと 可読性が落ち、Playbookの再利用性も悪くなってしまいます。 この問題に対し、Playbookのメンテナンス性を向上させることを目的に、 Playbook内の関連のある処理をロールという単位でPlaybookを分割することができます。 例えば、1台のLinuxサーバを構築するPlaybookがあるとして、その中で、 Linuxの初期設定、Apache HTTP Serverの導入、PostgreSQLの導入という処理をやっている場合、 「Linuxの初期設定」や「Apache HTTP Serverの導入」などがそれぞれ1つのロールとなります。 何を1つのロールとするかは自由なので、もっと細かくても良いですし、もっと大ざっぱでも構いません。 メンテナンス性や再利用性を考えて自分なりの単位でロールを決めれば良いです。

 前置きが長くなりましたが、Playbookをロールで分割しようとした場合、 Ansibleには決められたディレクトリ構成があります。 その決められたディレクトリ構成をコマンド一発で作成することができるので、その方法を紹介します。

構成

検証環境

 サーバにはAmazonのEC2インスタンスを利用しました。 AmazonマシンイメージはAWS標準のものではなく、AWS Marketplaceから取得しています。 サーバのスペックは以下のとおりです。

■サーバスペック
項目内容
AmazonマシンイメージCentOS 7 (x86_64) - with Updates HVM
インスタンスタイプt2.micro
vCPU1
メモリ1GiB
ディスクSSD 8GiB
リージョンアジアパシフィック (東京)

サーバ構成

OSバージョン

CentOS 7.5.1804 x86_64

ソフトウェア・パッケージ一覧

  • epel-release-7-11.noarch.rpm
  • ansible-2.7.4-1.el7.noarch.rpm

環境構築

(1) Playbook用ディレクトリ作成

 Ansible操作用のユーザ ansible にスイッチした後、 AnsibleのPlaybook用のディレクトリを作成し、 その中にロール用のディレクトリを作成するものとします。 Playbook用のディレクトリは今回は主役ではないので、 適当に test という名前にしておきます。

$ sudo su -
Last login: Wed Jan 23 14:25:53 UTC 2019 on pts/0
# su - ansible ←Ansible操作用ユーザにスイッチ
Last login: Mon Feb 18 15:48:16 UTC 2019 on pts/0
$ cd /data/ansible/
$ mkdir test ←Playbook用ディレクトリを作成
$ cd test/

(2) ロール用ディレクトリを一括作成

 ロール用ディレクトリを一括作成するには、ansible-galaxy init コマンドを使用します。 コマンドに続けて作成したいロール名を指定します。今回は common という名前のロールを作成します。

$ ansible-galaxy init common
- common was created successfully

(3) 作成したロール用ディレクトリの確認

 ロール用ディレクトリ作成コマンド実行後に、何が作成されたか確認します。 なお、ディレクトリ作成と書きましたが、実際にはディレクトリ内に ロールを定義するためのYAMLファイルも一緒に作成されます。 確認には find コマンドを使用します。

$ find ./ -exec ls -ld {} \;
drwxrwxr-x. 3 ansible ansible 20 Feb 18 15:51 ./
drwxrwxr-x. 10 ansible ansible 135 Feb 18 15:51 ./common
-rw-rw-r--. 1 ansible ansible 1328 Feb 18 15:51 ./common/README.md
drwxrwxr-x. 2 ansible ansible 22 Feb 18 15:51 ./common/defaults
-rw-rw-r--. 1 ansible ansible 30 Feb 18 15:51 ./common/defaults/main.yml
drwxrwxr-x. 2 ansible ansible 6 Feb 18 15:51 ./common/files
drwxrwxr-x. 2 ansible ansible 22 Feb 18 15:51 ./common/handlers
-rw-rw-r--. 1 ansible ansible 30 Feb 18 15:51 ./common/handlers/main.yml
drwxrwxr-x. 2 ansible ansible 22 Feb 18 15:51 ./common/meta
-rw-rw-r--. 1 ansible ansible 1973 Feb 18 15:51 ./common/meta/main.yml
drwxrwxr-x. 2 ansible ansible 22 Feb 18 15:51 ./common/tasks
-rw-rw-r--. 1 ansible ansible 27 Feb 18 15:51 ./common/tasks/main.yml
drwxrwxr-x. 2 ansible ansible 6 Feb 18 15:51 ./common/templates
drwxrwxr-x. 2 ansible ansible 39 Feb 18 15:51 ./common/tests
-rw-rw-r--. 1 ansible ansible 11 Feb 18 15:51 ./common/tests/inventory
-rw-rw-r--. 1 ansible ansible 64 Feb 18 15:51 ./common/tests/test.yml
drwxrwxr-x. 2 ansible ansible 22 Feb 18 15:51 ./common/vars
-rw-rw-r--. 1 ansible ansible 26 Feb 18 15:51 ./common/vars/main.yml

 作成されたディレクトリについて簡単に説明します。

■ロール用ディレクトリ
ディレクトリ名内容
defaultsデフォルトで優先順位の低い変数を定義するファイルを格納
filescopyリソースで使用するファイルを格納
scriptリソースで使用するスクリプトファイルを格納
handlershandlersを定義するファイルを格納
metaロールの依存関係を定義するファイルを格納
taskstasksを定義するファイルを格納
templatestemplateリソースで使用するファイルを格納
ファイルの拡張子は.j2を指定
testsロールをテストするためのインベントリファイルとPlaybookを格納
varsロールに関連する変数を定義するファイルを格納

参考にしたサイト

Ansible 2.7 - Docs - Best Practices