2016-03-03 14 views
5

私は立ち往生しています。ウェブからグーグルを奪い、答えを見つけることができませんでした。ダイナミックインベントリを使用してステージング/プロダクションを区別する方法は?

私は数年間Anabledを使用してきましたが、常に静的なインベントリを使用しています。ステージングとプロダクションのような異なる環境を区別するために、私はそれぞれ異なる静的インベントリファイルstagingproductionを使用しました。私は準備ステージングサーバに必要な場合は、私がやるだろう:

ansible-playbook site.yml -i staging 

私は生産のために同じことをやってみたかったときに、私がしたい:

ansible-playbook site.yml -i production 

を両方ステージングと生産が異なると、変数を必要とします値なので、私はgroup_vars/staginggroup_vars/productionです。すべての良いとベストプラクティスに従って。

ここで、AWSでEC2インスタンスをプロビジョニングする必要があります。私はthis AWS guideを使用しています。私は2つの演劇とのプレイブックを持っています。最初はlocalhostに対して実行され、AWSに必要なEC2インスタンスが作成/検索され、グループにはadd_hostが設定されます。第2のプレイは、そのグループを使用して、第1のプレイで発見されたEC2インスタンスに対して実行される。すべてそのガイドに従ってください。

1つのこと以外はすべて素晴らしい作品です。どの環境をプロビジョニングするかを指定する方法がわからないので、必要な変数がgroup_vars/(staging|production)からロードされていません。基本的には、私が欲しいのは、-i (staging|production)と似ています。これらの年を静的な在庫とともに使っていましたが、-iを使用しているのは、在庫が動的なので意味をなさないと思われます。私はそれを実行するとansible-playbookに渡す引数に基づいてgroup_vars/stagingまたはgroup_vars/productionから変数をロードできるようにしたい。

どうすればよいですか?ベストプラクティスは何ですか?

+0

別のプレイブックで何かできますか? production.ymlとstaging.ymlのようなもの。これらのプレイブックにはsite.ymlが含まれていますが、env固有のヴァールも含まれます。 –

答えて

3

可能なレベルのボックスを構築するためにEC2モジュールを使用しない方法はわかりませんが、ec2 external inventory scriptと簡単な設定で簡単な方法が得られます。inventories/main。あなたがする必要があるのはinventoriesの中にec2.pyec2.iniを設定してインスタンスのソースとして使用することです。 ec2.iniの内のgroup_by_tag_keys = Trueのコメントを解除してください。

次のステップは、どのインスタンスがどこに行くのかを区別することです。 ec2.pyには多くの選択方法が用意されていますが、それに合わせて各インスタンスに具体的にタグを付けることをお勧めします。したがって、すべてのインスタンスにはenvironmentという名前のタグがあります(あなたの場合は、ステージングまたはプロダクションのいずれかになります)。それから、すべてがあなたのinventories/mainの中でそれを処理することです、そしてここにそれを行う小さな例があります。

まず、あなたが使用したいタグの空のグループを定義する必要があります。

[tag_environment_staging] 

[tag_environment_production] 

ので、我々はそれらを後で参照することができます。その後、適切な段階の子供としてグループを指定するだけです。それ以降は、最小限のファイルは次のようになります。

[tag_environment_staging] 

[tag_environment_production] 

[staging:children] 
tag_environment_staging 

[production:children] 
tag_environment_production 

あなたはそこに行きます。これからec2から取り出されたすべてのインスタンスは、環境タグ付きの動的インベントリスクリプトを使ってgroup_varsの適切な設定にマッチします。動的インベントリを扱うときには、-iinventoriesというディレクトリを特定のファイルではなく正しいものにすることを覚えておく必要があります。

+0

'[tag_environment_staging]'のようなセクションでは、すでにタグ付きインスタンスがあると想定しています。もし私が実際に*これらのタグと*タグ*インスタンスを作成するためにAnsibleを使用したいのであれば?これを正しく行うには、 'env'変数を' staging' *に設定する必要があります。*私はAWSから事実を取得し始めます。プレイグランドを実行する前に、私たちのAWSアカウントはきれいで、そこには何もありません。 –

+0

自分自身にタグを付けるのは簡単です(ドキュメントにきれいに記載されています)(http://docs.ansible.com/ansible/guide_aws.html#provisioning)。もちろん、あなたはあなたが展開しているステージをプレイブックに渡す必要があります。これはextra_varsやenvのかなり簡単な使い方です。 –

+0

私は、環境ごとに1組の変数(12個以上の変数)を持っています。各環境にプロビジョニング/デプロイする必要があるたびに、それらのそれぞれに '-e'を渡しますか?それはまさに疑問です。つまり、 'group_vars /(ステージング|プロダクション)'を静的なインベントリを使うときのやり方に魔法のように含めるにはどうすればいいですか? –

2

私は動的インベントリでもOpenstackで同様の問題があります。ここまでの解決策は、環境変数を使用して、ステージング環境と本番環境のどちらをターゲットにするかを指定することです。あなたのケースにも適用されるはずです。私たちの設定では$OS_PROJECT_NAMEstageまたはprodです。 ansible.cfg

inventory = ./inventories/${OS_PROJECT_NAME}/openstack.py 

を設定その後、我々は

inventories/(stage|prod)/group_vars/ 

下環境特定のグループ変数を持っている欠点は、あなたが2つの場所での在庫スクリプトを持っている必要がありますまたはそれがシンボリックリンクされているです。また、playbookディレクトリに関連するgroup_varsがインベントリgroup_varsを上書きすることに注意してください。

+1

これは、私がインターネットを見て本を読む日の後に最高のものを見つけたアプローチです...奇妙なことは、Ansibleのこの非常に重要な側面は十分に文書化されていないということです。 – DejanLekic

関連する問題