見出し画像

Ansible PlaybookのRole分割


こんにちは。株式会社SHIFT、自動化エンジニアの水谷です。

Ansibleでサーバーマシンの構成などの自動化を行う際、簡単な設定の自動化であれば、1つのYAMLファイルにすべてのタスクを記述してしまうことができます。しかし、多くのタスクで構成される複雑な作業の自動化の場合、1つのYAMLファイルに記述すると、デバッグも大変になりますし、メンテナンス性が悪くなりまってしまいます。

このような場合は、一般的なプログラミング言語でプログラムを開発するときのように、機能ごとにファイルを分割して記述していきたいと思うことでしょう。

もちろん、Ansibleでもファイルを分割することもできます。しかし、Ansibleの場合は、よりパーツとして再利用できるような便利な分割方法として、Roleという仕組みが用意されていますので、これを積極的に使っていくことが推奨されています。

Roleは、基本的に機能単位で作成し、作成したRoleは簡単に別のプロジェクトで再利用したり、共有することができます。逆に他の方や社内の他チームが作ったRoleを取り込んで使用することもできます。

さらに、Ansible GalaxyというRoleを公開して共有するシステムもあって、公開されているRoleを取り込んで使用することもできて、とても便利なのですが、これについてはまた別の記事で書いてみたいと思っています。

Roleのディレクトリ構成

AnsibleのRoleは"Roles"というディレクトリを作成し、その下に作成します。例えば、Webサーバの1つである"Apache"をインストールするロールの場合、Rolesディレクトリの下に"InstallApache"のようなRoleディレクトリを作成。そして、このディレクトリの下には、以下のようなディレクトリ群を作成します。

defaults:上書き可能な変数のデフォルト値を定義する
files:Role内のタスクから参照されるファイルを配置する
handlers:Role内で利用するハンドラを記述する
meta:このRoleに関する情報や依存関係を記述する
tasks:タスクを記述する
templates:Role内で利用するテンプレートを記述する
tests:Roleのテストを記述する
vars:Role内の変数を定義する

このフォルダ構成はお約束として決まっており、(基本的に)変更することはできません。

このような決まったディレクトリ構成にすることには、いくつかのメリットがあります。 その中でも最も大きなメリットは、作成したRoleを共有する場合に、そのRoleを見た人がRoleの内容を容易に理解できることです。逆もまた然りで、他のチームが作成したRoleや後述するAnsible Galaxyで公開されているRoleを自分のPlaybookで使用する場合に、ディレクトリ構成が統一されていると、そのRoleの内容を理解することが容易にできるのです。

なお、必ずすべてのディレクトリを作成する必要はなく、例えばテンプレートを一切使用しないのであれば、templateディレクトリは作成不要です。

Roleの作成例

では、Roleの超簡単な例として、UbuntuにWebサーバの1つ"Apache2.4"をインストールするRoleを作ってみましょう。

まず、"roles/installapache"というディレクトリを作成し、そこに"tasks"ディレクトリと"files"ディレクトリを作成します。そして、tasksディレクトリに、以下のような内容の"main.yml"を作成します。

---
- name: install apache
  apt: 
    name: apache2
    state: present
- name: copy default page
  copy:
    src: index.html
    dest: /var/www/html/index.html
- name: start service
  service: 
    name: apache2
    state: started
    enabled: yes

内容としては、aptモジュールでapache2をインストールし、トップページ(index.html)を上書きコピーし、apacheを起動するだけです。

1ファイルだけのPlaybookを書くときは、タスクはすべてtasks:の下に記述していましたが、Roleの場合は、tasks:は不要ですので、ご注意ください。

また、filesディレクトリの下に以下のような内容の"index.html"を作成します。

<html>
 <body>
   <h1>My Page hosted by Apache2.4</h1>
 </body>
</html>

そして、これを呼び出すPlaybookとして、以下のようなYAMLファイル(ファイル名はinstallapache.yml)を用意しました。

---
- hosts: localhost
  gather_facts: false
  roles:
    - installapache

hostsにlocalhostを指定していますので、Ansibleを実行しているマシン自体にApacheをインストールすることになります。他のUbuntuマシンにインストールする場合は、inventoryファイルを用意してください。

さて、このPlaybookを以下のコマンドで実行します。

> ansible-playbook installapache.yml

結果は、以下のようになりました。

画像1

Webブラウザで"localhost"にアクセスしてみると、このようにコピーしたindex.htmlの内容が表示されました。

画像2

Apache2のアンインストールRole

念のため、Apache2をアンインストールするRoleも作っておきます。適当な(uninstallapacheなどの)Roleディレクトリを作成し、以下のような内容のtasks/main.ymlを作成して、これを呼び出せばOKです。

---
- name: stop service
  service: 
    name: apache2
    state: stopped
    enabled: no
- name: uninstall apache2
  apt: 
    name: apache2
    state: absent

――――――――――――――――――――――――――――――――――

執筆者プロフィール:水谷裕一
大手外資系IT企業で15年間テストエンジニアとして、多数のプロジェクトでテストの自動化作業を経験。その後画像処理系ベンチャーを経てSHIFTに入社。
SHIFTでは、テストの自動化案件を2件こなした後、株式会社リアルグローブ・オートメーティッド(RGA)にPMとして出向中。RGAでは主にAnsibleに関する案件をプレーイングマネジャーとして担当している。

お問合せはお気軽に
https://service.shiftinc.jp/contact/

SHIFTについて(コーポレートサイト)
https://www.shiftinc.jp/

SHIFTのサービスについて(サービスサイト)
https://service.shiftinc.jp/

SHIFTの導入事例
https://service.shiftinc.jp/case/

お役立ち資料はこちら
https://service.shiftinc.jp/resources/

SHIFTの採用情報はこちら 
https://recruit.shiftinc.jp/career/