উত্তরযোগ্য: শর্তসাপেক্ষে কোনও নির্দিষ্ট শর্ত পূরণ হলে ভার্স ফাইলে ভেরিয়েবলগুলি সংজ্ঞায়িত করুন


19

গ্রুপ_ভারে সংজ্ঞায়িত একটি ভেরিয়েবলের মান (সত্য / মিথ্যা) উপর নির্ভর করে আমি একটি ভার্সে ফাইলটিতে কিছু ভেরিয়েবল সংজ্ঞায়নের চেষ্টা করছি। তাদের মান গ্রুপ ভারের মানের উপর নির্ভর করে।

আমার বর্তমান ভার ফাইলটি এর মতো দেখাচ্ছে:

{% 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গ্রুপ নির্ভর হয় তবে এটিকে গ্রুপ_ভারে স্থাপন করা উচিত।
কনস্ট্যান্টিন সুভেরভ

দুর্ভাগ্যক্রমে, পরীক্ষা গ্রুপ নির্ভর নয়। বর্ণনায় উল্লিখিত হিসাবে, পরীক্ষাটি একটি গ্রুপ_ভার ভেরিয়েবলের মানের উপর নির্ভর করে।
পান্ডো জন

উত্তর:


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
এটি এমন একটি বিষয় যা আমি এড়াতে চাইছিলাম। আমি আমার কাজগুলির জন্য ভার অন্তর্ভুক্ত ব্যবহার করতে বা 2 টি অতিরিক্ত ভার ফাইলগুলি সংজ্ঞায়িত করতে চাই না।
পান্ডো জন জন

আমি এটি পাই না..যখন শর্তযুক্ত অন্তর্ভুক্ত_ভারগুলি ব্যবহার করা সম্ভব হয় তবে কেন পরিবর্তনকের সাথে শর্তটি সংজ্ঞায়িত করা যায় না?
জিপি

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

যদিও এটি দুর্দান্ত হবে তবুও আমি আশঙ্কা করছি যে আপনার উপায়টি সম্ভব নয় (অথবা আমি সঠিকভাবে সচেতন নই)।

আমি প্রথমে জিনজা টেমপ্লেট থেকে ভার্স ফাইল প্রস্তুত করার পরামর্শ দিচ্ছি এবং তারপরে এটি অন্তর্ভুক্ত_ভারা সহ অন্তর্ভুক্ত করব। উদাহরণ প্লেবুক দেখুন:

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

উদাহরণস্বরূপ জিনজা টেমপ্লেট /tmp/vars.yaml.j2 এর সামগ্রী:

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

আমি এটি পছন্দ করি তবে সমস্যাটি হ'ল জিনজা টেম্পলেট থেকে .ml ফাইলটি তৈরি করার পরে এটি আমার প্লেবুক থেকে পরবর্তী কাজের জন্য উপলভ্য নয়।
পান্ডো জন

কেন? আমি যখন ডিবাগ টাস্কের সাথে পরীক্ষার প্লেবুকটি প্রসারিত করার চেষ্টা করেছি তখন - debug: var=testদেখতে পাচ্ছি যে সেখানে test.var1এবং test.var2প্রত্যাশিত মান উভয়ই সংজ্ঞায়িত হয়েছে । সুতরাং প্লেবুকের অন্যান্য কার্যগুলিতে আপনার এই ভেরিয়েবলগুলি ব্যবহার করতে সক্ষম হওয়া উচিত।
জারোস্লাভ কুসেরা

0

আফাইক, আপনি যে চেষ্টা করছেন তা হ'ল জিনজা 2 টেম্পলেটগুলির জন্য এবং yML ফাইলগুলির জন্য নয়। ডকুমেন্টেশন থেকে :

জবাব জিনজা 2 লুপ এবং টেমপ্লেটগুলিতে শর্তসাপেক্ষে অনুমতি দেয় তবে প্লেবুকগুলিতে আমরা সেগুলি ব্যবহার করি না।

আপনি একটি প্লে সহ একটি পৃথক। এমএল ফাইল প্রস্তুত করতে পারেন যা ক্লজগুলি ব্যবহার করার সময় আপনার প্রয়োজনীয় ভেরিয়েবলগুলি সেট আপ করে এবং তারপরে আপনার মূল প্লেবুকে সেগুলি আমদানি (বা সহ) করতে পারে। এইভাবে আপনি সমস্ত ভার্স শর্তসাপেক্ষে একটি ফাইলে সংজ্ঞায়িত করতে পারেন।

বা: ভূমিকাগুলি ব্যবহার করুন। আমি মনে করি আপনার সমস্যা সমাধানের জন্য ভূমিকাগুলিই সর্বাধিক পর্যাপ্ত পদ্ধতি।


0

আমি শেষ পর্যন্ত যা করেছি তা হ'ল 2 পৃথক পৃথক ফাইল তৈরি করা যাক - আসুন তাদের কল করুন 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.