2015-01-06 7 views
19

Ansible में पैरामीटर चर, अगर मैं एक पैरामीटर नाम या किसी महत्वपूर्ण नाम के रूप में एक चर का उपयोग करने का प्रयास करें, यह कभी नहीं हल हो गई है। उदाहरण के लिए, अगर मैं {{ some_var }}: true, या है:संकल्प शब्दकोश कुंजी या Ansible

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 कार्य से पहले "- डीबग: var = my_instance_tags" जोड़ने का प्रयास करें, यह देखने के लिए कि 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)$ 

चाल डबल कोट्स के साथ dict घोषणा को लपेटना है। Ansible इस गैर-दस्तावेजी (लेकिन लगातार) और भद्दा अनुवाद (खोल चर expantion की ansible के समकक्ष) सबसे करने के लिए (सभी नहीं) YAML मूल्यों (':' का सब कुछ आरएचएस) प्लेबुक में लागू होता है। यह कुछ संयोजन है जो कुछ अज्ञात क्रम में Jinja2-इंजन, पायथन-दुभाषिया और उत्तर-इंजन के माध्यम से इन तारों को डाल रहा है। -

+2

हां! बहुत शानदार। आपको यह कैसे पता चला कि यह कैसे करें? मैंने हर जगह देखा और महीनों पहले काम करने के लिए इसे छोड़ दिया। – Eli

+4

ओ मैं कुछ इसी तरह से निराश था और यह पता लगाने के लिए कोड के माध्यम से देखा कि यह कैसे vars का विस्तार करता है .. :-) – Kashyap

0

एक अन्य विकल्प आप की तरह कुछ की कोशिश कर सकते हैं:

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

कृपया ध्यान दें कि सब कुछ इनलाइन है और मैं एक समान (=) और सब कुछ दोहरे उद्धरण चिह्नों के साथ लिपटे है उपयोग कर रहा हूँ।

संबंधित मुद्दे