こんにちは。構築担当の下地です。
いつの間にかAnsible2.5 Kashmir(カシミール)がリリースされていたので、とりあえずアップデートしてみました。
色々新機能が追加された反面、非推奨や将来削除される機能/モジュールも多数あるみたいです。
逐次チェックが必要ですね。
さて今回は、Ansibleの基本機能である「Roles」について書こうと思います。
宜しくお願いします。
目次
Rolesとは
Ansibleでplaybookを書く際、簡単なものだと以下のように1つのファイルにまとめて書くことができます。
- hosts: all
user: root
tasks:
- name: httpdをインストールする
yum:
name=httpd
state=installed
- name: httpdを起動して自動起動ONにする
service:
name=httpd
state=started
enabled=yes
- name: httpdを再起動する
service:
name=httpd
state=restarted
httpdの処理だけが書かれた短いplaybookです。
これだと問題はありません。
しかし、もっと複雑で膨大な処理を書きたい場合、1つのplaybookに全て書くのは効率的ではありません。
そこでRolesという仕組みを使います。
Rolesとは
Rolesは特定のvars_fileやtasks、handlersをあらかじめ決められたファイル構造で置くと、自動的にロードされる仕組みです。
この仕組みを使うことで、playbookをグループごとに分割し、別々に管理することができます。
例えば以下のような構成でファイルやディレクトリを配置します。
site.yml
webservers.yml
fooservers.yml
roles/
common/
tasks/
handlers/
files/
templates/
vars/
defaults/
meta/
webservers/
tasks/
defaults/
meta/
Rolesでは上記のようにファイルを配置するディレクトリ名が決まっており、他の名前を使うことはできません。
またRolesには、以下のうち少なくとも一つ以上のディレクトリが含まれる必要があります。
・tasks
・handlers
・defaults
・vars
・files
・templates
・meta
Rolesの使い方
基本的なやり方は「roles:」を使います。
例えば、
---
- hosts: webservers
roles:
- common
- webservers
のように記載します。
すると、rolesディレクトリ内に配置されたcommon及びwebserversの処理が実行されます。
各Rolesごとにテンプレートファイルや変数ファイルを配置することで、更に細やかな処理が可能になります。
また、各Rolesを1つの単位として読み込むため、1つの処理を実施したくない場合はその部分だけコメントアウトなり条件分岐なりでSKIPすればOKです。
例えば以下のようにすると、webserversの処理は定義されていますが、メインのplaybookでSKIPされます。
---
- hosts: webservers
roles:
- common
# - webservers
一般的にはミドルウェアごとにRolesを分けて書くことが多いかと思います。
例えば私が書いたコードだとこのような構成になりました。
# tree
.
├── host_vars
│ └── 192.168.0.173.yml
├── inventory
│ └── target.ini
├── roles
│ ├── change-hosts-file
│ │ └── tasks
│ │ └── main.yml
│ ├── epel-remi-install
│ │ └── tasks
│ │ └── main.yml
│ ├── hostname
│ │ └── tasks
│ │ └── main.yml
│ ├── httpd_setup
│ │ ├── tasks
│ │ │ └── main.yml
│ │ └── template
│ │ └── httpdlog-rotate.sh
│ ├── httpd_virtualhost
│ │ ├── tasks
│ │ │ ├── main.yml
│ │ │ └── virtualhost.yml
│ │ └── templates
│ │ ├── index.html
│ │ └── virtual.conf.j2
│ ├── mysql56
│ │ └── tasks
│ │ └── main.yml
│ ├── mysql57
│ │ └── tasks
│ │ └── main.yml
│ ├── password
│ │ └── tasks
│ │ └── main.yml
│ ├── php
│ │ └── tasks
│ │ └── main.yml
│ ├── selinux
│ │ └── tasks
│ │ └── main.yml
│ ├── time-zone-change
│ │ ├── handlers
│ │ │ └── main.yml
│ │ └── tasks
│ │ └── main.yml
│ ├── vsftpd_setup
│ │ └── tasks
│ │ └── main.yml
│ ├── wordpress
│ │ ├── tasks
│ │ │ └── main.yml
│ │ └── templates
│ │ └── wordpress.config.j2
│ └── yum-update
│ └── tasks
│ └── main.yml
└── site.yml
このようにRolesディレクトリの中に、構築したいミドルウェアもしくはグループごとに分けてplaybookを配置します。
またこの例では、使用する変数を各role内ではなく、host_varsにてまとめて定義しています。
メインのplaybookはsite.ymlで、この中に各Rolesで定義した部分を読み込んで実行します。
中身は以下のような感じです。
# cat site.yml
---
- hosts: target_server
roles:
- selinux
- hostname
- password
- yum-update
- change-hosts-file
- time-zone-change
- epel-remi-install
- php
- role: mysql56
when: mysql_version == 56
- { role: mysql57, when: mysql_version == 57 }
- { role: httpd_setup, when: httpd == True }
- role: httpd_setup
when: httpd == True
- role: httpd_virtualhost
when: httpd == True
- role: vsftpd_setup
- wordpress
このようにroles部分に各Roles名を列記するだけで、自動的に読み込んで実行されます。
whenなどを使うと変数の値から条件分岐でSKIPもできます(色々試しているので書き方が汚いですね笑)。
まとめ
今回はRolesを使った処理の分割を紹介しました。
Ansibleを使い始めたころは、このRolesの仕組みが良く分からずにハマってばかりいました。
まだまだ構文やモジュールなども知識が足りないので、引き続きドキュメントを見つつコードを書いていこうと思います。
お読みいただきありがとうございました。