roles - タスクのグループ化

2019/05/05

Ansible

 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]$ 

カテゴリー

目次

QooQ