Ansibleで試しにRoleを作ってみた
Ansibleによりnginxを設定してみます。
ansible-garaxyにあるRoleを引っ張ってくる方が早いのでしょうが、Ansibleの勉強も兼ねて、自分でRoleを作ってみます。
環境情報
実行したいこと
nginxをインストールして、単純なWEBサーバを作成する作業となっています。
roleディレクトリの初期化
ansible-galaxyのinitコマンドにて、基本となるroleディレクトリを作成します。
$ 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
に書いていきます。
- 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からインストール
- name: Nginxのインストール yum: name: nginx state: present
ngixnの起動/自動起動設定
- name: Nginxの自動起動設定 service: name: nginx state: started enabled: true
nginx.confの編集(行の挿入)
デフォルトの /etc/nginx/nginx.conf
に server_tokens off
を設定。
- 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
で指定して文字列を挿入。
デフォルトコンフィグの削除
- name: デフォルトコンフィグファイルの削除 file: path: /etc/nginx/conf.d/default.conf state: absent
serverコンテキスト用のファイルを配置
- 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ファイル用ディレクトリを作成
- 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
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