Ansibleで試しにRoleを作ってみた

Ansibleによりnginxを設定してみます。

ansible-garaxyにあるRoleを引っ張ってくる方が早いのでしょうが、Ansibleの勉強も兼ねて、自分でRoleを作ってみます。

環境情報

  • cat /etc/redhat-release
  • ansible --version
    • ansible 2.7.6

実行したいこと

nginxをインストールして、単純なWEBサーバを作成する作業となっています。


roleディレクトリの初期化

ansible-galaxyのinitコマンドにて、基本となるroleディレクトリを作成します。

ansible-galaxy - init

$ ansible-galaxy init --init-path="roles" nginx
- nginx was created successfully
$
$ tree
.
└── roles
    └── nginx
        ├── README.md
        ├── defaults
        │   └── main.yml
        ├── files
        ├── handlers
        │   └── main.yml
        ├── meta
        │   └── main.yml
        ├── tasks
        │   └── main.yml
        ├── templates
        ├── tests
        │   ├── inventory
        │   └── test.yml
        └── vars
            └── main.yml

10 directories, 8 files

ディレクトリの説明。

  • defaults
    • 変数のデフォルト値を定義するところ
  • files
    • 配布するファイルを置くところ
  • handlers
    • Handler(遅延実行専用のタスク)を定義するところ
  • meta
    • roleの依存関係を定義するところ
  • tasks
    • 実行される処理のplay bookを置くところ
    • master play book(いわゆる site.yml 等のファイル)を置く
  • templates
    • templateファイルを置くところ
  • tests
    • テスト用play bookを置くところ
  • vars
    • 変数定義ファイルを置くところ

Ansible - Role Directory Structure


必要定義を記述

実行される処理を ./tasks/main.yml に書いていきます。

nginx用yumリポジトリのダウンロード

ansible yum-repository

- name: nginx用yumリポジトリの用意
  yum_repository:
    name: nginx
    description: nginx repo
    baseurl: http://nginx.org/packages/mainline/centos/7/$basearch/
    owner: root
    gpgcheck: no
    enabled: yes
    state: present

nginxをyumからインストール

ansible yum

- name: Nginxのインストール
  yum:
    name: nginx
    state: present

ngixnの起動/自動起動設定

ansible service

- name: Nginxの自動起動設定
  service:
    name: nginx
    state: started
    enabled: true

nginx.confの編集(行の挿入)

デフォルトの /etc/nginx/nginx.confserver_tokens off を設定。

nginx server_tokens

ansible lineinfile

- name: nginx.confの編集 - server_tokensの無効
  lineinfile:
    path: /etc/nginx/nginx.conf
    state: present
    insertbefore: 'include /etc/nginx/conf.d/\*.conf;'
    line: '    server_tokens off;'

insertbefore で指定した前に、 line で指定して文字列を挿入。

デフォルトコンフィグの削除

ansible file

- name: デフォルトコンフィグファイルの削除
  file:
    path: /etc/nginx/conf.d/default.conf
    state: absent

serverコンテキスト用のファイルを配置

ansible copy

- name: serverコンテキスト用コンフィグファイルを配置
  copy:
    src: zunchan.conf
    dest: /etc/nginx/conf.d/zunchan.conf
    owner: root
    group: root

./files/ 配下に、以下の zunchan.conf を配置。copyコマンドで、リモート上の対象サーバにファイルを配布してくれます。

server {
    listen 80;
    server_name zunchan.com;

    access_log /var/log/nginx/access_zunchan.log main;
    error_log /var/log/nginx/error_zunchan.log;

    location / {
        root /www/zunchan;
        index index.html;
    }
}

htmlファイル用ディレクトリを作成

ansible file

- name: index用ディレクトリを作成
  file:
    dest: /www/zunchan
    state: directory
    owner: nginx
    group: nginx
    mode: 0755

index.htmlファイルを配置

- name: indexファイルを配置
  copy:
    src: index.html
    dest: /www/zunchan/index.html
    owner: nginx
    group: nginx
    mode: 0644
  notify:
    - nginxのリロード

./handlers/ 配下の main.yml に、以下の処理を記述。 notify ディレクティブを指定すると、定義されているHandlerを処理実行後に呼び出しくれます。

- name: nginxのリロード
  service:
    name: nginx
    state: reloaded

ansible handler

Handlerの処理が実行されるのは、 notify を設定したタスクが変更(実行)された時、最後に1回だけになります。なので、すでにindexファイルが配置されている場合、その前の処理で変更があったとしても、nginxのリロードは実行されない事になります。

処理実行のためのファイルを用意

roleを実行するための site.yml を作成して、role実行用のカレントディレクトリを配置します。

---
- name: nginx設定
  hosts: all
  become: true
  roles:
    - role: nginx

その他、必要となるInventoryファイルや、ansible.cfg等を用意します。


最終的なディレクトリ・ファイル構造になります。

.
├── ansible.cfg
├── hosts
├── roles
│   └── nginx
│       ├── README.md
│       ├── defaults
│       │   └── main.yml
│       ├── files
│       │   ├── index.html
│       │   └── zunchan.conf
│       ├── handlers
│       │   └── main.yml
│       ├── meta
│       │   └── main.yml
│       ├── tasks
│       │   └── main.yml
│       ├── templates
│       ├── tests
│       │   ├── inventory
│       │   └── test.yml
│       └── vars
│           └── main.yml
├── site.yml
└── ssh_config

playbookの実行

ansibleのルートディレクトリで以下の通り実行することで、roleが処理されます。

$ ansible-playbook -i hosts site.yml