Ansible Documentation
Roles機能
play 内のタスクを機能(役割)ごとにまとめてグループにしたもの構造
機能ごとにまとめたタスクは roles ディレクトリ内に配置します。Ansible Documentation に記載されているディレクトリ構造の例です。site.yml
webservers.yml
fooservers.yml
roles/
common/
tasks/
handlers/
files/
templates/
vars/
defaults/
meta/
webservers/
tasks/
defaults/
meta/
roles ディレクトリ内に common と webservers の 2 つのロールが定義されています。ロールの中は用途ごとに複数のディレクトリに分けて管理します。tasks / handlers / vars / meta の各ディレクトリに main.yml ファイルが含まれている必要があります。
- tasks
- ロールで実行するタスクを main.yml ファイルに記述する
- handlers
- ロールの tasks 内から使用される handlers セクションのタスクを main.yml ファイルに記述する
- vars
- ロールで使用する変数を main.yml に記述する
- files
- copy モジュールなどで使用するファイルを配置する
- templates
- template モジュールで使用するテンプレートファイル( jinja2 形式)を配置する
- meta
- ロール間の依存関係を main.yml ファイルに記述する
具体例
「handlers セクション」で使用した play を role を使用して分割します。分割前の各ファイルの配置と内容です。■ ファイルの配置
.
├── accounts.yml
├── hosts.yml
├── host_vars
│ └── node-c0706.yml
├── packages.yml
├── site.yml
└── sudoers.j2
■ site.yml
---
- hosts: all
gather_facts: no
vars_files:
- accounts.yml
- packages.yml
handlers:
- name: 再起動
reboot:
listen: "Managed Node Reboot"
tasks:
- name: グループを作成
group:
name: "{{ item.gname }}"
gid: "{{ item.gid }}"
state: present
loop:
"{{ accounts }}"
- name: ユーザーの作成
user:
name: "{{ item.uname }}"
uid: "{{ item.uid }}"
group: "{{ item.gname }}"
password: "{{ item.password | password_hash('sha512') }}"
state: present
loop:
"{{ accounts }}"
- name: sudoers の設定
template:
src: ./sudoers.j2
dest: /etc/sudoers.d/{{ item.uname }}
mode: 0440
owner: root
group: root
validate: '/usr/sbin/visudo -cf %s'
loop:
"{{ accounts }}"
- name: 追加パッケージのインストール
yum:
name: "{{ item }}"
state: latest
loop:
"{{ packages }}"
notify: "Managed Node Reboot"
- name: 既存パッケージの更新
yum:
name: '*'
state: latest
notify: "Managed Node Reboot"
■ hosts.yml
all:
hosts:
node-c0706:
■ host_vars/node-c0706.yml
ansible_host: 192.168.101.21 ansible_user: root ansible_password: root@node-c0706■ account.yml
accounts:
- uname: workman
uid: 1001
password: workman@node_c0706
gname: staff
gid: 1000
■ packages.yml
packages: - open-vm-tools■ sudoers.j2
{{ item.uname }} ALL=(ALL:ALL) NOPASSWD: ALL
site.yml の tasks セクションと handlers セクションを次の 2 つのロールに書き換えます。
- ユーザーを作成するロール : create_users
- tasks
- グループを作成
- ユーザーの作成
- sudoers の設定
- vars
- account.yml
- packates.yml
- templates
- sudoers.j2
- パッケージをインストールするロール : install_packages
- tasks
- 追加パッケージのインストール
- 既存パッケージの更新
- handlers
- 再起動
ファイルの配置です。
.
├── hosts.yml
├── host_vars
│ └── node-c0706.yml
├── roles
│ ├── creat_users
│ │ ├── tasks
│ │ │ └── main.yml
│ │ ├── templates
│ │ │ └── sudoers.j2
│ │ └── vars
│ │ └── main.yml
│ └── install_packages
│ ├── handlers
│ │ └── main.yml
│ └── tasks
│ └── main.yml
└── site.yml
■ site.yml
2 つのロールを順に呼び出します
---
- hosts: all
gather_facts: no
roles:
- creat_users
- install_packages
■ hosts.yml
all:
hosts:
node-c0706:
■ host_vars/node-c0706.yml
ansible_host: 192.168.101.21 ansible_user: root ansible_password: root@node-c0706■ roles/creat_users/tasks/main.yml
---
- name: グループを作成
group:
name: "{{ item.gname }}"
gid: "{{ item.gid }}"
state: present
loop:
"{{ accounts }}"
- name: ユーザーの作成
user:
name: "{{ item.uname }}"
uid: "{{ item.uid }}"
group: "{{ item.gname }}"
password: "{{ item.password | password_hash('sha512') }}"
state: present
loop:
"{{ accounts }}"
- name: sudoers の設定
template:
src: sudoers.j2
dest: /etc/sudoers.d/{{ item.uname }}
mode: 0440
owner: root
group: root
validate: '/usr/sbin/visudo -cf %s'
loop:
"{{ accounts }}"
■ roles/creat_users/vars/main.yml
---
accounts:
- uname: workman
uid: 1001
password: workman@node_c0706
gname: staff
gid: 1000
packages:
- open-vm-tools
■ roles/creat_users/templates/sudoers.j2
{{ item.uname }} ALL=(ALL:ALL) NOPASSWD: ALL
■ roles/install_packages/tasks/main.yml
---
- name: 追加パッケージのインストール
yum:
name: "{{ item }}"
state: latest
loop:
"{{ packages }}"
notify: "Managed Node Reboot"
- name: 既存パッケージの更新
yum:
name: '*'
state: latest
notify: "Managed Node Reboot"
■ roles/install_packages/handlers/main.yml
--- - name: 再起動 reboot: listen: "Managed Node Reboot"■ 実行結果
[ansibleman@ansiblesv ansible]$ ansible-playbook -i hosts.yml site.yml
PLAY [all] *********************************************************************
TASK [creat_users : グループを作成] ***************************************************
changed: [node-c0706] => (item={u'uname': u'workman', u'password': u'workman@node_c0706', u'gname': u'staff', u'uid': 1001, u'gid': 1000})
TASK [creat_users : ユーザーの作成] ***************************************************
changed: [node-c0706] => (item={u'uname': u'workman', u'password': u'workman@node_c0706', u'gname': u'staff', u'uid': 1001, u'gid': 1000})
TASK [creat_users : sudoers の設定] ***********************************************
changed: [node-c0706] => (item={u'uname': u'workman', u'password': u'workman@node_c0706', u'gname': u'staff', u'uid': 1001, u'gid': 1000})
TASK [install_packages : 追加パッケージのインストール] ***************************************
changed: [node-c0706] => (item=open-vm-tools)
TASK [install_packages : 既存パッケージの更新] *******************************************
changed: [node-c0706]
RUNNING HANDLER [install_packages : 再起動] ***************************************
changed: [node-c0706]
PLAY RECAP *********************************************************************
node-c0706 : ok=6 changed=6 unreachable=0 failed=0
[ansibleman@ansiblesv ansible]$