2016-04-01 8 views
0

私はAnsibleでループしているハッシュを持っています。ハッシュを使用して不可能な場合、変数名を値として使用する方法はありますか?

site1: 
    some_config: value1 
    some_other_config: value2 
site2: 
    some_config: value3 
    some_other_config: value4 

ので、同じように、私は、テンプレートを使用していくつかのファイルを作成しようとしています:

- name: create config files 
    template: src=templates/site.conf.j2 dest=/etc/nginx/conf.d/site-{{item???}}.conf 
    with_items: 
     - "{{site1}}" 
     - "{{site2}}" 

は、私は、テンプレートの中から変数item.some_configなどを参照することができますよ。しかし、私はの名前に変数の名前をとしたいと思っています。

site-site1.confsite-site2.conf

ので、同じようにはどうすれば値として変数名を参照することができますか?

答えて

1

あなたはわずかな変更で、この場合、代わりにwith_itemswith_dictを使用することができ、ここでは完全な作業例です:

{{ item.value.some_config }} 
{{ item.value.some_other_config }} 
:あなたのテンプレートの中に

- hosts: all 
    gather_facts: no 
    vars: 
    sites: 
    site1: 
     some_config: value1 
     some_other_config: value2 
    site2: 
     some_config: value3 
     some_other_config: value4 
    tasks: 
    - name: create config files 
     template: 
     src: site.conf.j2 
     dest: "/etc/nginx/conf.d/site-{{ item.key }}.conf" 
     with_dict: "{{ sites }}" 

、あなたは次のように値を参照することができます

希望します。

1

あなたの最後の段落で正しい軌道に乗っているようだが、私はあなたを考える

(簡単な回避策はsite1site2ような値と各変数に別のキーを追加することです。しかし、それはただ冗長になります)ここではより単純なデータ構造が欠落しています。

代わりにご使用の構成は次のように設定することができます。今、あなたのタスクに複数のテンプレートを追加する必要がある場合

- name: create config files 
    template: src=templates/site.conf.j2 dest=/etc/nginx/conf.d/site-{{item.destination}}.conf 
    with_items: configuration 

configuration: 
- destination: site1 
    some_config: value1 
    some_other_config: value2 
- destination: site2 
    some_config: value3 
    some_other_config: value4 

そして、あなたは、このようにそれを参照することができます実際のタスクではなく、可変ブロックconfigurationを変更するだけで済みます。これが環境レベルで(グループ変数などを介して)オーバーライドされると、これはより柔軟になります。

+0

データ構造を変更しました。これは私がやろうとしていたものに比べてより洗練されたソリューションです。 –

関連する問題