RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

【Ansible】 Role 使用方法 まとめ

はじめに

はじめまして。knng1です。
本記事では、AnsibleのRoleの使用方法についてまとめていきたいと思います。
Ansibleを実務で使用する場合、基本的にはRole化されているところが多いと思いますので、

  • これからAnsibleを触る方
  • 最近Ansibleの勉強を始めた方

の参考になれば幸いです。

1.Ansible とは

AnsibleはRedHat社が開発するOSSの構成管理ツールです。
あらかじめ記述したPlaybookファイル通りにソフトウェアのインストールや設定を自動で行うことができます。
管理対象機器にはSSHプロトコルを使用するため、エージェントレスでの導入が可能です。
新規に構築するシステムはもちろん、すでに数十台、数百台を管理しているようなシステムでも容易に導入ができます。
詳細はAnsibleを説明している公式ドキュメントをご参照ください。


2.Ansible 使用例

今回はapacheのインストール、confファイルの配布、サービスの再起動を行う簡単なPlaybookを作成しました。
※Playbookの詳細についてはこちら

ディレクト

├── ansible.cfg
├── sample.yml
├── templates
│   └── httpd.conf.j2
└── test-hosts


sample.yml

[root@AnsibleServer ansible]# cat sample.yml
---
- hosts: test-server
  gather_facts: false
  tasks: 
    - name: install apache
      yum: 
        name: httpd
        state: installed
    - name: setup apache
      template: 
        src: httpd.conf.j2
        dest: /etc/httpd/conf/httpd.conf
    - name: restart apache
      service: 
        name: httpd
        state: restarted
        enabled: yes


実行ログ

Playbookを実行すると下記のようなログが出力されます。
changedが表示されていれば、taskの実行によってターゲットのサーバに変更が加えられたことを示しています。

[root@AnsibleServer ansible]# ansible-playbook -i test-hosts sample.yml

PLAY [test-server] **************************************************************************************************************************************************************************************************

TASK [install apache] ***********************************************************************************************************************************************************************************************
changed: [test-server]

TASK [setup apache] *************************************************************************************************************************************************************************************************
changed: [test-server]

TASK [restart apache] ***********************************************************************************************************************************************************************************************
changed: [test-server]

PLAY RECAP **********************************************************************************************************************************************************************************************************
test-server                : ok=3    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

3.Roleについて

AnsibleのRoleは処理毎にグループ化して分割する機能です。
rolesアトリビュートで対象のグループ(Role)を呼び出すと「roles/<Role名>/tasks/main.yml」が読み込まれます。
※「main.yml」以外の名前ではincludeやimportをしないと読み込んでもらえないのでご注意ください。
また、rolesを使用している場合、handlersを使用することができます。
handlersは「roles/<role名>/tasks/main.yml」内の対象のタスクがchangedステータスで終了した場合に実行される処理です。
ここで実行したい処理は「roles/<role名>/handlers/main.yml」に記述し、tasks配下のmain.ymlで「notify: <タスク名>」を記述して呼び出します。
コンフィグファイルの配布等、サーバに変更が加わった場合のみサービスを再起動したい場合にとても有用な機能です。
サンプルPlaybookをrole化して分割すると、以下のような感じになります。

ディレクト

├── roles
│   ├── template
│   │   ├── handlers
│   │   │   └── main.yml
│   │   ├── tasks
│   │   │   └── main.yml
│   │   └── templates
│   │       └── httpd.conf.j2
│   └── yum
│       └── tasks
│           └── main.yml
├── sample-role.yml
└── test-hosts


sample-role.yml

- hosts: test-server
  gather_facts: false
  roles: 
    - yum
    - template


roles/yum/tasks/main.yml

---
- name: install apache
  yum: 
    name: httpd
    state: installed


roles/template/tasks/main.yml

---
- name: setup apache
  template: 
    src: httpd.conf.j2
    dest: /etc/httpd/conf/httpd.conf
  notify: restart apache


roles/template/handlers/main.yml

---
- name: restart apache
  service: 
    name: httpd
    state: restarted
    enabled: yes


実行ログ

[root@AnsibleServer ansible]# ansible-playbook -i test-hosts sample-role.yml

PLAY [test-server] **************************************************************************************************************************************************************************************************

TASK [yum : install apache] *****************************************************************************************************************************************************************************************
changed: [test-server]

TASK [template : setup apache] **************************************************************************************************************************************************************************************
changed: [test-server]

RUNNING HANDLER [template : restart apache] *************************************************************************************************************************************************************************
changed: [test-server]

PLAY RECAP **********************************************************************************************************************************************************************************************************
test-server                : ok=3    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 



4.その他の機能について

AnsibleのRoleには前述した「tasks」、「handlers」、「templates」以外にもいろいろな機能があります。
便利に使用できるものが多いので、簡単に説明させていただきます。

defaults (roles/<Role名>/defaults/main.yml)

対象のAnsibleのRoleは、デフォルト変数を定義する機能です。
その他の変数ファイルで定義された場合、ここで定義された変数は上書きされます。
記述方法はその他変数ファイルと同様です。

サンプル

---
ansible_user: root
package: 
  - { state: installed , name: httpd }
  - { state: installed , name: tomcat }


vars (roles/<Role名>/vars/main.yml)

その名の通り、変数を定義する機能です。
ここで定義する変数は最後に読み込まれるため、「defaults」はもちろん「group_vars」や「host_vars」の変数も上書きます。
デフォルト変数はともかく、変数ファイルが複数個所にまたがって配置されると管理が煩雑になるため、
個人的には特別な理由がない限りは「group_vars」や「host_vars」を使用した方が管理しやすいと思います。

files (roles/<Role名>/files/main.yml)

Copyモジュールを使用する際にファイルを格納するディレクトリです。
ここに格納されたファイルはファイル名のみで呼び出し可能です。

meta (roles/<Role名>/meta/main.yml)

Ansibleの各Roleの依存関係を定義するファイルです。
yum」のmeta/main.ymlで「template」を指定した場合、下記のように「template」⇒「yum」の順に実行されてしまいますので注意が必要です。

[root@AnsibleServer ansible]# ansible-playbook -i test-hosts sample-role.yml

PLAY [test-server] **************************************************************************************************************************************************************************************************

TASK [template : setup apache] **************************************************************************************************************************************************************************************
changed: [test-server]

TASK [yum : install apache] *****************************************************************************************************************************************************************************************
changed: [test-server]

RUNNING HANDLER [template : restart apache] *************************************************************************************************************************************************************************
changed: [test-server]

PLAY RECAP **********************************************************************************************************************************************************************************************************
test-server                : ok=3    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0



5.Ansible Role おまけ

ansible-galaxy init

AnsibleのRoleの各ディレクトリは「ansible-galaxy init <Role名>」で簡単に生成できます。
新規でAnsibleのRoleを作成する際に利用してみてください。

[root@AnsibleServer ansible]# ansible-galaxy init roles/test
- Role roles/test was created successfully
[root@AnsibleServer ansible]# 
[root@AnsibleServer ansible]# ll roles/test
total 4
drwxr-xr-x 1 root root  512 May 29 11:42 defaults
drwxr-xr-x 1 root root  512 May 29 11:42 files
drwxr-xr-x 1 root root  512 May 29 11:42 handlers
drwxr-xr-x 1 root root  512 May 29 11:42 meta
-rw-r--r-- 1 root root 1328 May 29 11:42 README.md
drwxr-xr-x 1 root root  512 May 29 11:42 tasks
drwxr-xr-x 1 root root  512 May 29 11:42 templates
drwxr-xr-x 1 root root  512 May 29 11:42 tests
drwxr-xr-x 1 root root  512 May 29 11:42 vars



◆TECH PLAY
techplay.jp

◆connpass
rakus.connpass.com

Copyright © RAKUS Co., Ltd. All rights reserved.