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: ALLsite.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]$