Tech memo

日々学んだ技術のびぼうろく

Ansible ディレクトリ構成のベストプラクティスを考えてみた

概要

Ansible でサーバ構成を管理する場合、公式が推奨しているベストプラクティス では、管理するサーバが多くなるに連れてコードの管理が大変になってくる。

そこで、あらゆるサイトを参考に、個人的なディレクトリ構成ベストプラクティスを作成した。

Github はこちら。

ディレクトリ構成

最終的に、こんな感じに落ち着いた。

ansible
├── ansible.cfg  ----------> ansible 設定ファイル
│
├── apps  -----------------> 各アプリケーション構成用のディレクトリ
│   ├── app-A
│   │   ├── group_vars
│   │   │   ├── prod.yml
│   │   │   ├── dev.yml
│   │   │   └── local.yml
│   │   │
│   │   ├── roles  --------> アプリケーション固有の role
│   │   │   └── nginx-config
│   │   │
│   │   ├── prod
│   │   ├── dev
│   │   ├── local
│   │   └── site.yml
│   │
│   ├── app-B
│   └── app-C
│
├── common-roles  ----------> 汎用的な role
│   ├── awscmd
│   ├── capistrano
│   ├── common
│   ├── grunt
│   ├── gulp
│   ├── laravel
│   ├── memcached
│   ├── mysql
│   ├── newrelic
│   ├── nginx
│   ├── nodejs
│   ├── php
│   ├── redis
│   ├── ruby
│   ├── wordpress
│   └── yo
│
└── vars  
    ├── common.yml  ----------> 汎用的な変数
    └── private.yml ----------> vault する汎用的な変数

実行方法

[local]$ cd ansible/apps/app-A
[local]$ ansible-playbook -i local site.yml

特徴 その① インベントリファイルで stage 変数を定義!

site.yml にて環境毎に読み込むvarsファイルを切り替えるため、
インベントリファイル(例えば ansible/apps/app-A/local.yml )で stage変数 を定義する。

例えば、インベントリファイルで

[all:vars]
stage=local

と定義しておいて、site.yml にて

vars_files:
    - group_vars/{{stage}}.yml

とすると、group_vars/local.yml が読み込まれる。

特徴 その② アプリケーション毎の group_vars は一つのファイルにまとめる!

ansible/apps/app-A/local/web.ymlansible/apps/app-A/local/db.yml のように、
webサーバ用変数、dbサーバ用変数とファイルを分けるのが一般的なやりかた。

ただ、別に変数がめちゃくちゃ多い訳でもないので、環境毎にそれぞれ一つのファイルにまとめた方が管理しやすい。

まとめ

とりあえずここしばらくはこの構成で運用している。
特に不具合や使いづらさも感じないので、しばらくはこの構成でいけそう。

参考

初めてのAnsible

初めてのAnsible