2015-01-06 8 views
19

変数でパラメータ名またはキー名として使用しようとすると、決して解決されません。私は{{ some_var }}: true、または持っている場合たとえば、:Anibleで辞書キーまたはパラメータ変数を解決する

template: "{{ resolve_me_to_src }}": "some_src" 

を変数は、文字通り使用して解決することはありませんされます。

- name: Provision a set of instances 
    ec2: 
    group: "{{ aws_security_group }}" 
    instance_type: "{{ aws_instance_type }}" 
    image: "{{ aws_ami_id }}" 
    region: "{{ aws_region }}" 
    vpc_subnet_id: "{{ aws_vpc_subnet_id }}" 
    key_name: "{{ aws_key_name }}" 
    wait: true 
    count: "{{ num_machines }}" 
    instance_tags: { "{{ some_tag }}": "{{ some_value }}", "{{ other_tag }}": "{{ other_value }}" } 

この周りにどのような方法があります:私の特定のユースケースは、私のタグ名の一部を変数として保存されているEC2モジュール、でこれを使用していますか?私は評価を何とかしたいと思うと印を付けることができますか?

+0

タグを含むvarを作成するのはどうですか?例えば、instance_tags:{{my_instance_tags}} – jarv

+0

@jarv私はそれを100%涼しくしますが、varを作成するときには全く同じ問題が発生します。 'set_fact'を使って辞書を作成しても、キーは変数として処理されません。 – Eli

+0

私はあなたの問題をec2モジュールから切り離して、ec2タスクの前に " - debug:var = my_instance_tags"を追加して、Anipalがvarに対して持っているものを見てみましょう。 – jarv

答えて

27

これは機能しますか?

(rc=0)$ cat training.yml 
- hosts: localhost 
    tags: so5 
    gather_facts: False 
    vars: [ 
     k1: 'key1', 
     k2: 'key2', 
     d1: "{ 
     '{{k1}}': 'value1', 
     '{{k2}}': 'value2', 
     }", 
    ] 
    tasks: 
    - debug: msg="{{item}}" 
    with_dict: "{{d1}}" 


(rc=0)$ ansible-playbook training.yml -t so5 

PLAY [localhost] **************************************************************** 

PLAY [localhost] **************************************************************** 

TASK: [debug msg="{{item}}"] ************************************************** 
ok: [localhost] => (item={'key': 'key2', 'value': 'value2'}) => { 
    "item": { 
     "key": "key2", 
     "value": "value2" 
    }, 
    "msg": "{'value': 'value2', 'key': 'key2'}" 
} 
ok: [localhost] => (item={'key': 'key1', 'value': 'value1'}) => { 
    "item": { 
     "key": "key1", 
     "value": "value1" 
    }, 
    "msg": "{'value': 'value1', 'key': 'key1'}" 
} 

PLAY RECAP ******************************************************************** 
localhost     : ok=1 changed=0 unreachable=0 failed=0 

(rc=0)$ 

トリックは二重引用符で囲むことです。 Anabilitiesは、プレイブックのYAML値(全てRHSは':')のほとんど(すべてではない)に対して、この文書化されていない(しかし、一貫性のある)駄目な翻訳(シェル変数の拡張と同じ)を適用します。これらの文字列をJinja2エンジン、Pythonインタープリタ、そして不明な順序でいくつか組み合わせて組み合わせることがあります。

+2

はい!これが信じられない。どのようにこれを行う方法を見つけましたか?私はどこからでも見て、数ヶ月前にこれを稼働させることをやめました。 – Eli

+4

O私は似たようなものに苛立っていて、地獄がどのようにヴァルスを拡大するのかを調べるためにコードを見ました.. :-) – Kashyap

0

別のオプションは、 - あなたのような何かを試すことができます。

module_name: "{{ item.key }}={{ item.value }}" 
    with_items: 
    - { key: "option", value: "{{ any_value }}" } 

をすべてがインラインであると私は(=)と等しいを使用していますし、すべてのものが二重引用符でラップされますのでご注意ください。

関連する問題