Help us understand the problem. What is going on with this article?

Ansibleの環境分けをやってみた

More than 5 years have passed since last update.

なりゆき

ここしばらくChefを使っていたけど、台数が増えてくると実行がだんだん面倒になってきたのでpull型のツールだけじゃなくてpush型のツールも使ってみなきゃなあ、と思っていたところ、Ansibleが目に入ったので使ってみることにした。

Ansibleを触っての最初の目標は、chefのenvironmentに当たるもの、つまり環境によって設定内容の切り替えを行う方法を見つけることとした。
Ansibleでenvironmentは環境変数を示す予約語のようなのでgoogleに聞くのはちょっと難易度が高かったのだが、なんとか以下のようなページを見つけることができた。

もっとも、これらはAnsibleをある程度触るまでは内容を理解できなかったのだが、内容を理解した時、以下のような考えに至った。

  • インベントリファイルを環境ごとに分ける、というのは素晴らしいので即採用。
  • しかしインベントリファイルに配列型の変数を作ることはできなさそうに見える(し、できたとしてもそういうのはインベントリファイルでなくyamlに外出しした方がきれいだよね)。
  • ダイナミックインベントリにすれば配列型の変数も作れそうだが、ダイナミックインベントリ書くのめんどいし、実行しないと内容がわからないのがちょっと。リポジトリは見えるけど実行できない、しても意味ない、という状況はままある。
  • 環境名を実行時に入力する、というのは入力ミスが怖いな。2つの環境を誤って同じ設定内容にしてしまったらIPアドレスかぶり(特にありそうなのが負荷分散する時のVirtual IP address)とかでこれまで動いていたのがどっちも動かない、とかなるからね。
  • インベントリファイルに環境名を与えた変数だけ書いておく、という案も考えたがインベントリファイルをコピーして環境名だけ後回しにしていて結局直し忘れた、はありそうなシナリオでやっぱり怖い。

で、考えた結果。
インベントリファイル名をそのまま(か、ちょっと加工して)環境名にするのがいいよね、という結論に。

そしてこうなった

site.ymlの最初に以下を追加する。

site.yml
- hosts: all
  gather_facts: no
  tasks:
    - group_by: key={{ inventory_file | basename | regex_replace('^hosts-', '') }}
      changed_when: False

インベントリファイル名がhosts-env1, hosts-env2, hosts-env3, ...だったらgroup_varsディレクトリ以下にenv1.yml, env2.yml, env3.yml, ...を作ってここに環境ごとの設定値を変数に書いていく。

2014-07-23追記: 実際に何かが変更されるわけではないのにchanged判定されるのは良くないので「changed_when: False」を追加。

2014-07-30追記: ソースを読んだところ、group_varsの中の各ファイルの変数の優先順位は、(group_byで追加されたグループ).ymlはすべてのホストに適用されるall.ymlより高く、(インベントリで定義されたグループ).ymlより低いようだ。

さいごに

まあしかし、何やってもコピーした後の書き直し忘れには対応できないよね。
ゆめゆめチェックを怠るなかれ。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした