はじめに
メモ
- 『①inventoryで対象ホストと変数を設定し、②playbookでどのロール(各機能のタスク)を実行するかを定義して、③roleでplaybookから呼び出されるロール(各機能のタスク)を定義する』をシンプルに実現するディレクトリ構成とした。
- 変数の格納場所が分散しないよう、host_varsに寄せる(varsディレクティブ、group_vars、defaults等は使わない)
- →本来、group_varsに寄せるべき
├── inventory #
│ ├── prod # 環境ごとに分類する
│ │ ├── hosts #
│ │ └── host_vars #
│ │ ├── <system>-web01.yml # ホストごとに作成する(変数は基本的にここにのみ格納する)
│ ├── stg01 #
│ ├── dev01 #
│
├── playbooks #
│ ├── stable # stable環境とdevelopment環境で分類する
│ │ ├── <system>-web01.yml # ホストごとに作成する
│ └── development #
│
└── role #
├── nginx #
│ ├── tasks #
│ ├── handlers #
│ ├── templates # ファイルを配置する
│ └── files # ファイルを配置する(tar,rpm等の一時配置ファイル)
ファイル例
[mgmt]
mgmt-01 ansible_host=10.1.1.10
[<system>-web-blue]
<system>-web01-blue ansible_host=10.0.0.11
<system>-web02-blue ansible_host=10.0.0.12
[all:vars]
ansible_user=ubuntu
ansible_ssh_private_key_file='~/.ssh/xxx-key.pem'
[all:vars]
ansible_python_interpreter=/usr/bin/python3
- inventory/prod/hosts_vars/-web01-blue
---
nginx_deploy_module_nginx: nginx.zip
- playbooks/stable/-web01-blue.yml(サンプル1)
---
- name: playbook of <system>-web01-blue.yml
vars:
ansible_hostname: <system>-web01-blue
ansible_role_dir: /opt/ansible/roles
hosts: "{{ ansible_hostname}}"
become: true
roles:
- role: "{{ ansible_role_dir }}/hostname"
- role: "{{ ansible_role_dir }}/env"
- role: "{{ ansible_role_dir }}/yum"
- role: "{{ ansible_role_dir }}/user_app-user"
- role: "{{ ansible_role_dir }}/user_ope-user"
- role: "{{ ansible_role_dir }}/user_view-user"
- role: "{{ ansible_role_dir }}/dir_work"
- role: "{{ ansible_role_dir }}/dir_script"
- role: "{{ ansible_role_dir }}/custom_metrics"
- role: "{{ ansible_role_dir }}/awslogs_main"
- role: "{{ ansible_role_dir }}/awslogs_deploy"
- role: "{{ ansible_role_dir }}/backup_log"
- role: "{{ ansible_role_dir }}/ds_agent"
- role: "{{ ansible_role_dir }}/disk_mount"
- role: "{{ ansible_role_dir }}/nginx_main"
- role: "{{ ansible_role_dir }}/nginx_deploy"
- role: "{{ ansible_role_dir }}/java"
- role: "{{ ansible_role_dir }}/tomcat_main"
- role: "{{ ansible_role_dir }}/tomcat_deploy"
- role: "{{ ansible_role_dir }}/oracle_client"
- playbooks/mgmt.yml(サンプル2)
---
- name: Playbook of mgmt
hosts: mgmt
become: true
vars:
_role_dir: roles/
roles:
- role: "{{ _role_dir }}/hostname"
- roles/nginx_main/tasks/mai.yml(サンプル1)
---
- name: create nginx_rpm dir
file:
path={{ nginx_main_dir_module }}
state=directory
owner={{ nginx_main_owner }}
group={{ nginx_main_group }}
mode={{ nginx_main_mode }}
- name: upload nginx_rpm
copy:
src="nginx-{{ nginx_main_rpm_ver }}.rpm"
dest={{ nginx_main_dir_module }}
- name: yum nginx
yum:
name: "{{ nginx_main_dir_module }}/nginx-{{ nginx_main_rpm_ver }}.rpm"
state: present
- name: start nginx and set auto start
service:
name: nginx
state: started
enabled: yes
- roles/hostname/tasks/main.yml(サンプル2)
---
- name: Manage hostname
hostname: name={{ inventory_hostname }}
運用ルール案
- 変数には先頭にロール名をつける
- モジュールの置き場
- 大きい静的モジュール: confサーバの/var/moduleに置いておいて、filesにコピーする
- ホストごとのモジュール(*_deployロール): confサーバの/var/deploy/に置いておいて、filesにコピーする