यदि कोई निश्चित शर्त पूरी हो जाती है, तो परिवर्तनीय: वैरिएबल फ़ाइल में वैरिएबल को परिभाषित करें


19

Group_vars में परिभाषित एक चर के मान (ट्रू / गलत) के आधार पर मैं एक चर फ़ाइल में कुछ चर को परिभाषित करने का प्रयास कर रहा हूं। उनका मूल्य समूह संस्करण के मूल्य पर निर्भर करता है।

मेरी वर्तमान var फ़ाइल इस तरह दिखती है:

{% if my_group_var %}
test:
   var1: value
   var2: value
   ...
   varn: value
{% else %}
test:
   var1: other_value
   var2: other_value
   ...
   varn: other_value
{% endif %}

मेरी प्रत्येक भूमिका के लिए मैं इस फ़ाइल में परिभाषित एक चर का उपयोग कर रहा हूँ।

मेरा टेस्ट प्लेबुक नीचे की तरह दिखता है:

- name: blabla
  hosts: blabla
  vars_files:
     - <path>/test_vars.yml
  roles: blabla 

प्लेबुक चलाने के बाद मुझे जो त्रुटि मिल रही है, वह है:

{% if my_group_var %}
 ^ here

exception type: <class 'yaml.scanner.ScannerError'>
exception: while scanning for the next token
found character that cannot start any token
  in "<unicode string>"

क्या मैं यहाँ कुछ मूर्खता कर रहा हूँ या यह भी समर्थित नहीं है? मैंने इन वर्जनों को परिभाषित करने के लिए एक और तरीका खोजने की कोशिश की है (मेरे पास उनमें से एक है), लेकिन मैं यहां कुछ कार्यात्मक प्राप्त करने में कामयाब नहीं हुआ। कोई सुझाव?


इन संस्करणों का उपयोग कहां किया जा रहा है? यह अनावश्यक हो सकता है यदि आप उन सभी का उपयोग करने जा रहे हैं जो templateमॉड्यूल कॉल का हिस्सा हैं।
84104

यदि testसमूह निर्भर है, तो इसे group_vars में रखा जाना चाहिए।
कोनस्टेंटिन सुवोरोव

दुर्भाग्य से, परीक्षण समूह पर निर्भर नहीं है। जैसा कि विवरण में बताया गया है, परीक्षण एक group_var चर के मूल्य पर निर्भर करता है।
pandoJohn

जवाबों:


11

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

- include_vars: test_environment_vars.yml
  when: global_platform == "test"

- include_vars: staging_environment_vars.yml
  when: global_platform == "staging"

- include_vars: prod_environment_vars.yml
  when: 
    - global_platform != "test" 
    - global_platform != "staging" 

2
यह कुछ ऐसा है जिससे मैं बचने की कोशिश कर रहा था। मैं शामिल नहीं करना चाहता हूँ vars या अपने कार्यों के लिए 2 अतिरिक्त var फ़ाइलों को परिभाषित करना।
pandoJohn

मुझे यह नहीं मिला..जब हालत के साथ इसमें शामिल हैं_ का उपयोग करना संभव है, तो चर को शर्त के साथ क्यों नहीं परिभाषित किया जा सकता है?
GP92

10

परिवर्तनीय को सशर्त रूप से परिभाषित करने के लिए निम्नलिखित में से एक फॉर्म की अनुमति देता है:

    test:
      var1: "{% if my_group_var %}value{% else %}other_value{% endif %}"
      var2: "{{'value' if (my_group_var) else 'other_value'}}"

वेरिएंट लुकअप के साथ सिंटैक्स के ऊपर संयोजन करके हम कॉम्प्लेक्स वर्सेस (इस मामले में सूची) को लोड कर सकते हैं:

test_value_when_my_group_var_is_true:
   var1: value
   var2: value

test_value_when_my_group_var_is_false:
   var1: other_value
   var2: other_value

test: "{{ lookup('vars','test_value_when_my_group_var_is_true') if (my_group_var) else lookup('vars','test_value_when_my_group_var_is_false')}}"

वर्जन लुकअप के साथ सशर्त पेड़ लोडिंग करने का एक और तरीका है। यह तरीका आसान है जब आपको केस लॉजिक लागू करने की आवश्यकता होती है (यानी कंडीशन वेरिएबल में दो से अधिक संभावित मान हैं):

test_value_when_my_group_var_is_foo:
   var1: value
   var2: value

test_value_when_my_group_var_is_bar:
   var1: other_value
   var2: other_value

test_value_when_my_group_var_is_baz:
   var1: yet_another_value
   var2: yet_another_value

test: "{{ lookup('vars','test_value_when_my_group_var_is_' + my_group_var) }}"

2

इसके बावजूद यह अच्छा होगा, मुझे डर है कि आपका रास्ता संभव नहीं है (या मुझे सही तरीके से पता नहीं है)।

मैं पहले jinja टेम्पलेट से vars फ़ाइल तैयार करने का सुझाव दूंगा और फिर इसे शामिल करें_वर। उदाहरण प्लेबुक देखें:

---
- name: -Test-
  hosts: local
  vars:
    my_group_var: False
#    my_group_var: True

  tasks:

  - name: Prepare vars file from template.
    template: src=/tmp/vars.yaml.j2
              dest=/tmp/vars.yaml

  - name: Include vars
    include_vars: "/tmp/vars.yaml"

उदाहरण jinja टेम्पलेट /tmp/vars.yaml.j2 की सामग्री है:

{% if my_group_var %}                                                                                                                                                                                             
test:                                                                                                                                                                                                             
   var1: value                                                                                                                                                                                                    
   var2: value                                                                                                                                                                                                    
{% else %}                                                                                                                                                                                                        
test:                                                                                                                                                                                                             
   var1: other_value                                                                                                                                                                                              
   var2: other_value                                                                                                                                                                                              
{% endif %}

मुझे यह पसंद है लेकिन समस्या यह है कि jinja टेम्पलेट से .yml फ़ाइल बनाने के बाद यह किसी भी प्लेबुक से आने वाले कार्यों के लिए उपलब्ध नहीं है।
pandoJohn

क्यों? जब मैं डिबग कार्य के साथ परीक्षण प्लेबुक का विस्तार करने की कोशिश की - debug: var=test, मैं देख सकता वहाँ परिभाषित कर रहे हैं दोनों कि test.var1और test.var2उम्मीद मूल्यों के साथ। इसलिए आप इन चरों को प्लेबुक के अन्य कार्यों में उपयोग करने में सक्षम होना चाहिए।
जारोस्लाव कुचेरा

0

AFAIK, यह {} आप जो कोशिश कर रहे हैं वह Jinja2 टेम्प्लेट के लिए है न कि yml फाइलों के लिए। से प्रलेखन :

ansible टेम्पलेट्स में जिंजा 2 लूप्स और कंडीशनल्स की अनुमति देता है, लेकिन प्लेबुक में, हम उनका उपयोग नहीं करते हैं।

आप एक भिन्न .yml फ़ाइल को एक नाटक के साथ तैयार कर सकते हैं जो क्लॉज़ होने पर आपके द्वारा उपयोग किए जाने वाले चर सेट करता है, और फिर उन्हें अपनी मुख्य प्लेबुक में आयात (या शामिल) करता है। इस तरह से आप सभी vars को सशर्त रूप से एक फ़ाइल में परिभाषित कर सकते हैं।

या: भूमिकाओं का उपयोग करें। मुझे लगता है कि आपकी समस्या को हल करने के लिए भूमिकाएं सबसे पर्याप्त दृष्टिकोण हैं।


0

अंत में मैंने जो किया वह था 2 अलग-अलग var फाइलें बनाना - चलो उन्हें कॉल करें type_a.ymlऔर type_b.yml- और मैंने एक ग्रुप वेरिएबल को परिभाषित किया जो इंगित करता है कि किस फाइल का उपयोग करना है - कुछ ऐसा type_of_file: a। इस तरह मेरी प्लेबुक अब दिखती है:

- name: blabla
  hosts: blabla
  vars_files:
     - <path>/type_{{ type_of_file }}.yml
  roles: blabla

सारे सवालों के जवाब देने के लिए धन्यवाद। मैं उन्हें वास्तव में मददगार लगता हूं।


0

मुझे उम्मीद है कि निम्नलिखित स्निप ( आंनदनीय प्रलेखन से लिया गया ) ऊपर के अन्य लोगों के उपयोगी योगदान के लिए एक सार्थक अतिरिक्त हो सकता है।

- name: Show value of 'variablename'
  debug: msg="{{ lookup('vars', 'variabl' + myvar)}}"
  vars:
    variablename: hello
    myvar: ename
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.