24時間365日フルマネージドホスティングサービスのデイーネット

AnsibleでRolesを使う

こんにちは。構築担当の下地です。

いつの間にか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の仕組みが良く分からずにハマってばかりいました。

まだまだ構文やモジュールなども知識が足りないので、引き続きドキュメントを見つつコードを書いていこうと思います。

お読みいただきありがとうございました。

  • このページの先頭へ

  • 東京本社
    〒105-0001東京都港区虎ノ門2-3-22 第一秋山ビル5F
    TEL:03-3591-8887 FAX:03-3591-8886
  • 大阪本社
    〒541-0041 大阪市中央区北浜2-6-11北浜エクセルビル5F
    TEL:06-6231-8887 FAX:06-6231-8897

  • 認証範囲はこちらをご覧ください。

Denet logo

クラウドサービス・データセンタ・高機能専有サーバ・共有サーバホスティングサービス 株式会社ディーネット
dot_bar