2015-01-06 32 views
19

olarak çözümleyin Ansible, değişkeni parametre adı veya anahtar adı olarak kullanmaya çalışırsa, bu çözüm asla çözülmez. Ben {{ some_var }}: true ya sahip Örneğin,:sözlük anahtarını veya parametre değişkenini Ansible

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

değişkenler sadece anlamıyla ve asla kullanılacak çözmek olacaktır.

- 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 }}" } 

bu çevrede herhangi bir yolu var mı: My özel kullanım dava benim etiket isimleri bazı değişkenler olarak depolanır EC2 modülü ile bu kullanıyor? Değerlendirmeyi bir şekilde zorlamak istediğimi belirtebilir miyim?

+0

Bunun yerine etiketlerinizi içeren bir var oluşturmaya ne dersiniz? Örneğin, example_tags: {{my_instance_tags}} – jarv

+0

@jarv Bununla% 100 serinim, ancak varı oluştururken tam olarak aynı problemlerle karşılaşıyorum. Sözcüğü oluşturmak için 'set_fact' kullanarak, hala anahtarları değişkenler olarak işlemez. – Eli

+0

Sorununuzu ec2 modülünden ayırır, Ansible'ın var için ne yaptığını görmek için ec2 görevinden önce bir "- debug: var = my_instance_tags" eklemeyi deneyin. – jarv

cevap

27

Bu sizin için çalışacak mı?

(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)$ 

Trick, çift tırnak işaretleri ile dict bildirimini sarmaktır. Ansible, bu belgesiz (ama tutarlı) ve crappy çeviri (ansible'nın kabuk değişkeni expantion eşdeğeri) oyun kitapçığındaki çoğu (tümü değil) YAML değerlerine (':' numaralı RHS) herşeyi uygular. Bu dizeleri Jinja2-motor, Python-interpreter ve ansible-engine ile bilinmeyen bir sıraya koymak bazı kombinasyonlardır. her şeyin sıralı dikkat ve ben eşit (=) ve her şeyi çift tırnak ile sarılır kullanıyorum Lütfen

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

: -

+2

Evet! Bu inanılmaz. Bunu nasıl yapacağınızı nasıl buldunuz? Her yere baktım ve bunu aylar önce çalışmaktan vazgeçtim. – Eli

+4

O Ben benzer bir şey ile sinirli ve nasıl cehennem var genellemek olduğunu anlamak için kodu inceledim .. :-) – Kashyap

0

Başka bir seçenek gibi bir şey deneyebilirsiniz.