2016-11-15 13 views
1

在庫を分離するAnsibleのベストプラクティスのドキュメントrecommendsAnsibleで異なるインベントリ間でgroup_varsを共有するにはどうすればよいですか?

 
inventories/ 
    production/ 
     hosts.ini   # inventory file for production servers 
     group_vars/ 
     group1   # here we assign variables to particular groups 
     group2   # "" 
     host_vars/ 
     hostname1  # if systems need specific variables, put them here 
     hostname2  # "" 

    staging/ 
     hosts.ini   # inventory file for staging environment 
     group_vars/ 
     group1   # here we assign variables to particular groups 
     group2   # "" 
     host_vars/ 
     stagehost1  # if systems need specific variables, put them here 
     stagehost2  # "" 

マイステージング環境と本番環境は同じように構成されています。私は両方の環境で同じグループを持っています。そして、私は同じグループに対しても同じgroup_varsを持っていることが分かりました。これは私が払拭したい冗長性を意味します。

異なるインベントリ間でいくつかのgroup_varsを共有する方法はありますか?

回避策として、私は役割に共有group_varsを入れ始めました。

my_var: 
    my_group: 
    - { var1: 1, var2: 2 } 

これは、定義されたVARとホストのグループを交差することにより、いくつかのVARSを反復処理することが可能になる:

with_items: "{{group_names | intersect(my_var.keys())}}" 

しかし、これは理解するビット複雑であると私は役割が知っているべきではないと思いますグループについて何か

ほとんどのインベントリを分けていますが、分かりやすい方法でgroup_varsを共有したいと思います。グローバルなgroup_varsとインベントリ固有のgroup_varsをマージすることは可能ですか?

答えて

0

私はAnsibleの推薦に従うというアイデアを拝見しました。今一年後、私はAnabilitiesの勧告が私の要求には役に立たないと確信しています。代わりに、私はできるだけ多くの段階で共有することが重要だと思います。

は、今私は、同じディレクトリ内のすべての在庫を置く:

production.ini 
reference.ini 

そして私は、それぞれの在庫は、ステージの名前を持つすべてのホストを含​​むグループを定義して世話をします。

ファイルproduction.iniはグループproductionあります

[production:children] 
all_production_hosts 

をして、ファイルreference.iniはグループreferenceがあります

[reference:children] 
all_reference_hosts 

私はすべてのステージングのためのファイルを定義するだけで1 group_varsのディレクトリを持っていますグループ:

group_vars/production.yml 
group_vars/reference.yml 

各ファイルにはstageという変数が定義されています。ファイルproduction.ymlは、この定義:

--- 
stage: production 

をして、ファイルreference.ymlがいることを定義しています

--- 
stage: reference 

これは、生産と参照間の他のすべてを共有することが可能となります。しかし、ホストは完全に異なっています。

site.ymlや役割が生産や参照の環境で若干異なる振る舞いをすることが必要な場合
ansible-playbook -i production.ini site.yml 
ansible-playbook -i reference.ini site.yml 

、彼らが使用して条件を使用することができます右の在庫を使用することにより脚本は、製造上または参照ホスト上のいずれかで実行さstage変数。しかし、私もそれを避けようとしています。ステージングファイルproduction.ymlreference.ymlでは、すべての差分を同等の定義に移動する方がよいためです。例えば

group_vars/all.ymlは、一部のユーザーを定義した場合、:

users: 
    - alice 
    - bob 
    - mallory 

を私は両方の環境でユーザーを作成したいが、私は本番環境からmalloryを除外したい、私はと呼ばれる新しいグループを定義することができますeffective_users

effective_users: >- 
    {{ users }} 

しかしproduction.ymlに、私はmalloryを除外することができます:reference.ymlではusersリストと同じです

effective_users: >- 
    {{ users | difference(['mallory']) }} 

脚本や役割は二つの段階を区別する必要はありません、彼らは単純にグループeffective_usersを使用できます。このグループには、在庫を選択するだけで自動的にユーザーのリストが自動的に表示されます。

2

group_varsをプレイブックディレクトリに配置することもできます。 More info

アシスタントは、すべてのインベントリについてそれらを拾います。

+0

ただし、これはプレイブックでのみ有効です。アドホックコマンドは失敗します。アドホックコマンドの実行をカスタマイズしてグローバルなgroup_varsを読み込む方法はありますか? – ceving

+0

別の問題は、別のグループから変数を収集したい場合、 'hash_behaviour = merge'を設定する必要があると思われます。そして、ハッシュの配列値はどうですか? – ceving

+0

これはアドホックでは機能しません。リストを自動マージすることはできません。手動タスクを使用する必要があります。 –

2

ここでのシンプルなオプション(とは何か)は、シンボリックリンクのgeneric group vars files aroundです。

例えば、私たちはNGINXのようなもののための一般的な役割を持っているかもしれませんし、その役割のいくつかの具体的なユースケースを持っているかもしれません。この場合、具体的なユースケースごとにNGINXロールを使用するグループvarsファイルを作成し、それらのグループvarsファイルを適切なフォルダに単純にシンボリックリンクします。

. 
├── inventories 
│   ├── bar-dev 
│   │   ├── group_vars 
│   │   │   ├── bar.yml -> ../../shared/bar.yml 
│   │   │   └── dev.yml -> ../../shared/dev.yml 
│   │   └── inventory 
│   ├── bar-prod 
│   │   ├── group_vars 
│   │   │   ├── bar.yml -> ../../shared/bar.yml 
│   │   │   └── prod.yml -> ../../shared/prod.yml 
│   │   └── inventory 
│   ├── bar-test 
│   │   ├── group_vars 
│   │   │   ├── bar.yml -> ../../shared/bar.yml 
│   │   │   └── test.yml -> ../../shared/test.yml 
│   │   └── inventory 
│   ├── foo-dev 
│   │   ├── group_vars 
│   │   │   ├── dev.yml -> ../../shared/dev.yml 
│   │   │   └── foo.yml -> ../../shared/foo.yml 
│   │   └── inventory 
│   ├── foo-prod 
│   │   ├── group_vars 
│   │   │   ├── foo.yml -> ../../shared/foo.yml 
│   │   │   └── prod.yml -> ../../shared/prod.yml 
│   │   └── inventory 
│   ├── foo-test 
│   │   ├── group_vars 
│   │   │   ├── foo.yml -> ../../shared/foo.yml 
│   │   │   └── test.yml -> ../../shared/test.yml 
│   │   └── inventory 
│   └── shared 
│    ├── bar.yml 
│    ├── dev.yml 
│    ├── foo.yml 
│    ├── prod.yml 
│    └── test.yml 
└── roles 
    └── nginx 
     ├── defaults 
     │   └── main.yml 
     ├── meta 
     │   └── main.yml 
     ├── tasks 
     │   └── main.yml 
     └── templates 
      └── main.yml 

今私達のインベントリファイルは、ホストがこれらの共有グループが正しいグループ内のホストを置くことによって、単にvarsは使用することができ:

私たちのプロジェクトのフォルダ構造は、この(大幅に簡略化)のようになります。

+1

この問題を抱える唯一の人ではないことをよく知っています。 – ceving

+0

ところで:私はFossil SCMを使用する必要があり、Fossilのデフォルトはシンボリックリンクに従うことです。これは、Unixの問題を引き起こしてWindowsの問題を回避するために行われます。化石の人たちはおそらく、Unixの問題はWindowsの問題よりも解決しやすいと考えています。だから私はsymlinksが私のためのオプションであるかどうか分からない。 – ceving

関連する問題