はじめに
はじめまして。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
エンジニア中途採用サイト
ラクスでは、エンジニア・デザイナーの中途採用を積極的に行っております!
ご興味ありましたら是非ご確認をお願いします。
https://career-recruit.rakus.co.jp/career_engineer/カジュアル面談お申込みフォーム
どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。
以下フォームよりお申込みください。
rakus.hubspotpagebuilder.comラクスDevelopers登録フォーム
https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/イベント情報
会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください!
◆TECH PLAY
techplay.jp
◆connpass
rakus.connpass.com