アクトインディ開発者ブログ

子供とお出かけ情報「いこーよ」を運営する、アクトインディ株式会社の開発者ブログです

私のAnsibleベストプラクティス

こんにちは!!こんにちは!!
複製インフラエンジニア(SRE)のyamamotoです。
f:id:yamamoto-kazuyasu:20180827194409j:plain

みなさんはAnsible使ってますか?
Ansibleはファイルやディレクトリの構成に非常に自由度があり、ymlファイル一つ読ませて実行することも、モジュール化を意識した複雑なディレクトリ構成でも利用することができます。
そうなってくると悩むのがディレクトリ構成。一応ベストプラクティスも公開されていますが、なんとなく使いづらかったので、私なりにまとめなおして使っています。

私のAnsibleディレクトリ構成

私はプロジェクトフォルダーの中身をこのようにしています。

ansible/
├── includes/
│   ├── file_shunt.yml
│   └── useradd.yml
├── roles/
│   └── stretch/
│       ├── actindi_finalize/
│       ├── actindi_initialize/
│       ├── actindi_www_watch/
│       ├── chronyd/
・       ・
・       ・
│       └── mariadb/
└── targets/
    ├── dev/
    │   ├── ansible.cfg
    │   ├── files/
    │   ├── hosts
    │   ├── main.yml
    │   ├── play.sh
    │   └── vars/
    │       ├── site-dev.yml
    │       └── site-dev_credentials.yml
    └── prd/
        ├── ansible.cfg
        ├── files/
        ├── hosts
        ├── main.retry
        ├── main.yml
        ├── play.sh
        └── vars/
            ├── site-prd.yml
            └── site-prd_credentials.yml

最上位に「includes」「roles」「targets」というディレクトリを作っていて、それぞれ

  • includes:全体的に使うことができるインクルードタスク
  • roles :ロール。ロールはディストリビューションのバージョンごとにサブディレクトリあり
  • targets:各サーバー(群)用の設定

のような構成にしています。
また、上記のような構成で動くように、ansible.cfgを別途用意しています。

解説

ロール

ロールについては、各バージョンの汎用性を色々考えるとキリが無いので、いっそOSのバージョンごとで切っています。
普段はOSの特定バージョンのミドルウェアを使うことが多いと思うので、その単位で設定ファイル等も含めて用意しています。
個人的には、元の設定ファイルを残しつつ必要なところだけ書き換えたいので、ファイルをまるっと上書きします。

もし違うバージョンが使いたい、などがあったら、ミドルウェアのバージョン番号を付けたロールを作成しています。
また、ミドルウェアに限らず、定型の設定があればどんどん抜き出してロールにしています。

targets

targetsは、ターゲットとなる各サーバー(群)ごとに設定をまとめています。
上記の例では開発サーバーと本番サーバーが各1台しかないので単純な構成になっていますが、これがWebサーバー群・アプリサーバー群・キャッシュサーバー群・ステージング・開発のようになると、この構成がものを言います。
様々なサーバーが多数配置された環境では、ベストプラクティスの構成ではまぜこぜになってしまい構成がスッキリしないのではないかと思います。 いっそバッサリ切り離した方が、オペミスも減りますしまとめやすくなる、というわけです。

また、変数ファイルですが、targetsのそれぞれの環境のディレクトリ内にvarsというフォルダーを用意しています。
main.ymlのvars_filesでこの中のファイルを読み込むようにしてあって、二つのファイルを読み込んでいます。
_credentials、と付いたファイルは、パスワードなどを保管しておくファイルで、バラバラに分散しないように全てこのファイルに記載します。秘密鍵などもこのファイルに書き入れています。
一か所にまとまっていた方が保管しやすいですし、.gitignoreにも書きやすいです。

実行するときは

では実際どのように動作するのかというと、targetsの中のそれぞれの環境のディレクトリに入り、play.shというシェルスクリプトを実行します。
このスクリプトはansible-playbookを呼び出し、同じディレクトリのansible.cfgやhostsファイル、main.ymlを読み込んでこのディレクトリ構成で実行するようになっています。 ディレクトリを移動することで作業対象を誤ることも減りますし、他のターゲットには影響を及ぼしません。

最後に

いかがでしょうか?あくまでオレオレルールですが、何かの参考になれば幸いです。

アクトインディでは、Ansibりたいインフラエンジニアをお待ちしています! actindi.net