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ディレクトリを作成。そして、このディレクトリの下には、以下のようなディレクトリ群を作成します。
このフォルダ構成はお約束として決まっており、(基本的に)変更することはできません。
このような決まったディレクトリ構成にすることには、いくつかのメリットがあります。 その中でも最も大きなメリットは、作成した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
結果は、以下のようになりました。
Webブラウザで"localhost"にアクセスしてみると、このようにコピーしたindex.htmlの内容が表示されました。
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
――――――――――――――――――――――――――――――――――
お問合せはお気軽に
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/