2014-04-24 8 views
30

extra vars पैरामीटर के आधार पर मैं ansible playbookकैसे Ansible प्लेबुक में गतिशील चर लिखने के

ansible-playbook playbook.yml -e "param1=value1 param2=value2 param3=value3" 

अगर केवल param1 पारित कर में चर मूल्य लिखने के लिए की आवश्यकता है

myvariable: 'param1' 

अगर केवल param1, param2 पास

myvariable: 'param1,param2' 
,210

तो param1, param2, param3 पारित कर रहे हैं तो वैरिएबल मान जब मैं टेम्पलेट के माध्यम से गतिशील चर बनाने का प्रयास करें

myvariable: 'param1,param2,param3' 

हो जाएगा तो मेरे प्लेबुक हमेशा पिछले चर मूल्य लेता है। लेकिन dest=roles/myrole/vars/main.yml के अंदर इसका लेखन सही मूल्य है।

मैं क्या एक यहाँ कोशिश

- hosts: local 
    user: roop 
    gather_facts: yes 
    connection: local 

    tasks: 

    - template: src=roles/myrole/templates/myvar.j2 dest=roles/myrole/vars/main.yml 

    - debug: var=myvariable 

    roles: 
     - { role: myrole } 

तो myrole अंदर निर्देशिका मैं template और vars

- roles 
    - myrole 
    - vars/main.yml 
    - templates/myvar.j2 

टेम्पलेट्स बनाया है बनाने/myvar.j2

{% if param1 is defined and param2 is defined and param3 is defined %} 
    myvariable: 'param1,param2,param3' 
{% elif param1 is defined and param2 is defined %} 
    myvariable: 'param1,param2' 
{% elif param1 is defined %} 
    myvariable: 'param1' 
{% else %} 
    myvariable: 'default-param' 
{% endif %} 
,210

मुझे पता है के रूप में अगर केवल दो हालत तो मैं जैसे

नीचे
{{ 'param1,param2' if param1 is defined and param2 is defined else 'default-param' }} 

<do something> if <something is true> else <do something else>

क्या यह संभव है inline expression ऊपर की तरह में if - elif - else इस inline expression उपयोग कर सकते हैं। या उत्तरदायी प्लेबुक में गतिशील रूप से मूल्य आवंटित करने का कोई अन्य तरीका?

उत्तर

36

मुझे यकीन है कि आप क्या चाहते करने के लिए एक बेहतर तरीका है, लेकिन यह काम करना चाहिए:

- name   : Test var 
    hosts  : all 
    gather_facts : no 
    vars: 
    myvariable : false 
    tasks: 
    - name: param1 
     set_fact: 
     myvariable: "{{param1}}" 
     when: param1 is defined 

    - name: param2 
     set_fact: 
     myvariable: "{{ param2 if not myvariable else myvariable + ',' + param2 }}" 
     when: param2 is defined 

    - name: param3 
     set_fact: 
     myvariable: "{{ param3 if not myvariable else myvariable + ',' + param3 }}" 
     when: param3 is defined 

    - name: default 
     set_fact: 
     myvariable: "default" 
     when: not myvariable 

    - debug: 
     var=myvariable 

आशा है कि मदद करता है। मुझे यकीन नहीं है कि क्या आप गतिशील रूप से चर बना सकते हैं और इसे एक पुनरावर्तक में कर सकते हैं।लेकिन आप एक छोटे पायथन कोड या किसी अन्य भाषा को भी लिख सकते हैं और इसे

+0

नाइस के मूल्यों के अनुसार my_var को सौंपा जा करने के लिए मान। यह काम कर रहा है। – Roopendra

+1

@Roopendra 3 मानों की एक सूची को जोड़ने के लिए कोड की 16 लाइनें बहुत अच्छी हैं। – ceving

+0

@ceving से सहमत है लेकिन कभी-कभी हम समाधान पर ध्यान देते हैं और बाद में अनुकूलन करते हैं। उस समय यह एकमात्र समाधान था। अगर आप अनुकूलित उत्तर साझा करेंगे तो मुझे खुशी होगी। शायद यह अन्य लोगों को भी मदद करेगा। – Roopendra

14

पर पहले प्लग कर सकते हैं, मैं पहले सुझाव दूंगा कि आप वापस कदम उठाएं और इस तरह की जटिलता की आवश्यकता के लिए अपने नाटकों को व्यवस्थित करने के लिए देखें, लेकिन यदि आप वास्तव में वास्तव में करते हैं, तो उपयोग करें निम्नलिखित:

vars: 
    myvariable: "{{[param1|default(''), param2|default(''), param3|default('')]|join(',')}}" 
+0

उत्तर के लिए धन्यवाद। आउटपुट प्राप्त करना '", "'आपके द्वारा सुझाए गए अनुसार परिवर्तनीय बदलने के बाद। – Roopendra

+5

['अस्वीकार करें] के साथ प्रयास करें (http://jinja.pocoo.org/docs/dev/templates/#reject) और [' परीक्षण'] (http://jinja.pocoo.org/docs/dev/templates/# बिल्टिन-टेस्ट): '{{[param1, param2, param3, param4] | अस्वीकार करें ('अपरिभाषित') | शामिल हों (',')}}' – bufh

8

my_var: चर घोषित

वीएआर: चर, जिसका मान जांच की जानी

param_1, param_2 है: चर वीएआर के मूल्यों

मान_1, मान_2, VALUE_3: my_var

my_var: "{{ 'value_1' if VAR == 'param_1' else 'value_2' if VAR == 'param_2' else 'value_3' }}" 
संबंधित मुद्दे