উত্তরগুলিতে তালিকাগুলিতে যোগ করা বা অভিধানগুলিতে কী যুক্ত করা


34

( কলব্যাকস বা হুক সম্পর্কিত, এবং কার্যের পুনর্ব্যবহারযোগ্য সিরিজের, জবাবদিহি ভূমিকাতে সম্পর্কিত ):

একটি জিন 2 টেম্পলেট এক্সপ্রেশন ব্যবহার করে (আব) এর চেয়ে উত্তরটিতে কোনও অভিধানে কী যুক্ত করার বা কোনও অভিধানে কী যুক্ত করার আরও ভাল উপায় আছে?

আমি জানি আপনি যেমন কিছু করতে পারেন:

- name: this is a hack
  shell: echo "{% originalvar.append('x') %}New value of originalvar is {{originalvar}}"

তবে সত্যিই এটি করার জন্য কোনও ধরণের মেটা টাস্ক বা সহায়তাকারী নেই?

এটি ভঙ্গুর বোধ হয়, অপ্রকাশিত বলে মনে হয় এবং ভেরিয়েবল কীভাবে উত্তরযোগ্য অবস্থায় কাজ করে তা নিয়ে প্রচুর অনুমানের উপর নির্ভর করে।

আমার ব্যবহারের ক্ষেত্রে একাধিক ভূমিকা (ডাটাবেস সার্ভার এক্সটেনশনগুলি) যা প্রতিটিকে একটি বেস রোলের (ডেটাবেস সার্ভার) কিছু কনফিগারেশন সরবরাহ করতে হবে। এটি ডিবি সার্ভার কনফিগারেশন ফাইলটিতে একটি লাইন যুক্ত করার মতো সহজ নয়; প্রতিটি পরিবর্তন একই লাইনে প্রযোজ্য , উদাহরণস্বরূপ এক্সটেনশানগুলি bdrএবং pg_stat_statementsউভয়ই একটি লক্ষ্য লাইনে উপস্থিত হওয়া উচিত:

shared_preload_libaries = 'bdr, pg_stat_statements'

বর্তমানের মানটি বের করে, পার্স করে, এবং তারপরে পুনরায় লিখে আবার কি রেজিপ্সের সাহায্যে কনফিগার ফাইলটি একাধিক বার প্রসেস করার জন্য (এক্সটেনশনে একবার) প্রসেস করার জন্য উপযুক্ত উপায়? যদি তা হয় তবে আপনি কীভাবে একাধিক রান জুড়ে সেই আদর্শবানকে তৈরি করতে পারেন?

যদি কনফিগারটি পার্স করা তার থেকে আরও শক্ত হয় এবং এটি অন্য কমা-বিভাজিত মান সংযোজন করার মতো সহজ নয়? এক্সএমএল কনফিগারেশন ফাইলগুলি ভাবেন।


তুমি কি জানো? আমি আপনার পার্শ্ব-প্রতিক্রিয়া-পূর্ণ jib
the

উত্তর:


13

আপনি একটি ভেরিয়েবলের সাথে দুটি তালিকার একত্রীকরণ করতে পারেন +। বলুন আপনার group_varsএই বিষয়বস্তু সহ একটি ফাইল রয়েছে:

---
# group_vars/all
pgsql_extensions:
  - ext1
  - ext2
  - ext3

এবং এটি এই জাতীয় টেমপ্লেটে ব্যবহৃত হয় pgsql.conf.j2:

# {{ ansible_managed }}
pgsql_extensions={% for item in pgsql_extensions %}{{ item }}, {% endfor %}

এরপরে আপনি টেস্টিং ডাটাবেস সার্ভারগুলিতে এই জাতীয় এক্সটেনশান যুক্ত করতে পারেন:

---
# group_vars/testing_db
append_exts:
  - ext4
  - ext5
pgsql_extensions: "{{ pgsql_extensions + append_exts }}"

যে কোনও পরীক্ষার সার্ভারে ভূমিকাটি চালানো হলে, অ্যাডিশনাল এক্সটেনশনগুলি যুক্ত করা হবে।

আমি নিশ্চিত নই যে এটি অভিধানের জন্যও কাজ করে এবং স্থানগুলির সাথে এবং লাইনের শেষে একটি ঝোলা কমা রেখে সতর্কতা অবলম্বন করুন।


আপনি পারেন, তবে আপনাকে এটি সব কিছু করতে হবে group_vars, ভূমিকাগুলি নিজেরাই এক্সটেনশানগুলি সেট আপ করার বিশদটির যত্ন নিতে পারে না। এটি বিশেষত যে ভূমিকাগুলি আমি সন্ধান করছি তার থেকে বর্ণগুলি সংযোজন করা হয় , সুতরাং একটি ভূমিকা অন্য ভূমিকা দ্বারা উদ্ভূত কোনও ভ্যারিতে যুক্ত হতে পারে।
ক্রেগ রিঞ্জার

আপনার বেস ভূমিকা প্রতিটি এক্সটেনশন ভূমিকা সম্পর্কে জানেন? আমার একটি অনুরূপ কেস হয়েছে যেখানে আমি একটি with_itemsবাক্য অবধি অবতারণা করতে সক্ষম হয়েছি ।
জিএনপি

না, এবং এটি আসলে সমস্যা। একটি স্থাপনায় বেস রোল হতে পারে
ক্রেগ রিঞ্জার

4
দেখে মনে হচ্ছে আপনি দুটি তালিকাকে সংযুক্ত করার জন্য এটি করার চেষ্টা করলে মনে হয় এটি একটি অসীম পুনরাবৃত্তি টেমপ্লেট কারণ বাম হাতটিও ডানদিকে রয়েছে side আমি কীভাবে এটি ব্যবহার করব ভুল বুঝাব?
ইব্রাহিম

2
@ স্পেকট্রা কমপক্ষে উত্তরযোগ্য 2.7 হিসাবে এটি কাজ করে না। ইব্রাহিমের পরামর্শ অনুসারে, এটি একটি ত্রুটির কারণ: "টেমপ্লেটের স্ট্রিংগুলিতে পুনরাবৃত্ত লুপ সনাক্ত করা"।
rluba

35

উত্তরীয় v2.x যেহেতু আপনি এগুলি করতে পারেন:

# use case I: appending to LIST variable:

      - name: my appender
        set_fact:
          my_list_var: '{{my_list_myvar + new_items_list}}'

# use case II: appending to LIST variable one by one:

      - name: my appender
        set_fact:
          my_list_var: '{{my_list_var + [item]}}'
        with_items: '{{my_new_items|list}}'

# use case III: appending more keys DICT variable in a "batch":

      - name: my appender
        set_fact:
          my_dict_var: '{{my_dict_var|combine(my_new_keys_in_a_dict)}}'

# use case IV: appending keys DICT variable one by one from tuples
      - name: setup list of tuples (for 2.4.x and up
        set_fact:
          lot: >
            [('key1', 'value1',), ('key2', 'value2',), ..., ('keyN', 'valueN',)],
      - name: my appender
        set_fact:
          my_dict_var: '{{my_dict_var|combine({item[0]: item[1]})}}'
        with_items: '{{lot}}'
# use case V: appending keys DICT variable one by one from list of dicts (thanks to @ssc)

  - name: add new key / value pairs to dict
    set_fact:
      my_dict_var: "{{ my_dict_var | combine({item.key: item.value}) }}"
    with_items:
    - { key: 'key01', value: 'value 01' }
    - { key: 'key02', value: 'value 03' }
    - { key: 'key03', value: 'value 04' }

উপরের সমস্তটি নথিভুক্ত রয়েছে: http://docs.ansible.com/ansible/playbooks_filters.html


1
ব্যবহারের চতুর্থটি কেবল সংযোজন করেছেu'(': u\"'\"}"
এসএসসি

1
ধন্যবাদ, এসএসসি আমি লক্ষ্য করেছি যে এটি জবাবদিহি 2.4.x( ফিক্সড ) এর সাথে কাজ করছে না
ম্যাক্স কোভগান

# 4 usecase অনুযায়ী, আমি হ্যান্ডেল করতে ডিফল্ট মান যোগ করেছেন অনির্ধারিত ত্রুটি আমার দৃশ্যকল্প মধ্যে: set_fact: my_dict_var: '{{my_dict_var|default({})|combine({item[0]: item[1]})}}'। কিছু ফিল্টারিং ব্যবহৃত হয় বা কোনও ফলাফল নিবন্ধিত না হলে অপরিজ্ঞাত ত্রুটিটি আসে।
এস কে ভেঙ্কট

মিঃ এস কে ভেঙ্কট, নমুনা কোডটি এখানে কেবলমাত্র সুনির্দিষ্ট বিষয় (টিপলস থেকে অভিধানের আইটেম যুক্ত করে) প্রদর্শিত করে। আপনার যদি অন্য কিছু করার দরকার হয় তবে এই কোডটি আপনার অনুলিপি-পেস্ট নয়।
ম্যাক্স কোভগান

3

আপনাকে লুপটি 2 এ ভাগ করতে হবে

--- 
- হোস্ট: লোকালহোস্ট
  কাজ: 
    - অন্তর্ভুক্ত_ভারস: স্ট্যাকস
    - সেট_ফ্যাক্টস: রোলস = {ac স্ট্যাকস।রোলেস | বিভক্ত ('')}
    - অন্তর্ভুক্ত: addhost.yml
      উইটাইটেলাইটস: "{{ভূমিকা}}"

এবং addhost.yml

- সেট_ফ্যাক্টস: গ্রুপের নাম = {{আইটেম}}
- সেট_ফ্যাক্টস: ips = {{স্ট্যাকস [আইটেম] | স্প্লিট ('')}
- স্থানীয়_অ্যাকশন: অ্যাড_ হোস্ট হোস্টনেম = {{আইটেম}} গ্রুপের নাম = {{গ্রুপের নাম}
  with_items: {{ips}

1

তারা কখন এটি যুক্ত করেছেন তা নিশ্চিত নয় তবে কমপক্ষে অভিধান / হ্যাশগুলির জন্য (তালিকা / অ্যারে নয়) আপনি ভেরিয়েবলটি hash_behaviour সেট করতে পারেন, আপনার মতো: hash_behaviour = mergeআপনার ansible.cfg

দুর্ঘটনাক্রমে এই সেটিংটিতে হোঁচট খেতে আমাকে বেশ কয়েক ঘন্টা সময় নিয়েছে: এস


এটি খুব সহজ, তবে বিদ্যমান কোডবেসে এটি e2e সক্ষম করতে সাবধান হন। কিছু ডিম ভাঙতে পারে।
ম্যাক্স কোভগান

0

এখানে প্রায় সমস্ত উত্তরের ক্ষেত্রে কর্মের পরিবর্তন প্রয়োজন, তবে আমার চালনার সময় নয়, বরং ওয়ার্স সংজ্ঞাতে ডায়নামিকভাবে অভিধানগুলি মার্জ করার দরকার ছিল।

উদাহরণস্বরূপ আমি কিছু অংশীদারি ভার সংজ্ঞায়িত করতে চাই all group_varsএবং তারপরে আমি সেগুলি অন্য কোনও groupবা প্রসারিত করতে চাই host_vars। ভূমিকা জন্য কাজ করার সময় খুব দরকারী।

আপনি ব্যবহার করতে চেষ্টা করুন combineবা unionVar ফাইলের মধ্যে মূল পরিবর্তনশীল overwriting ফিল্টার, আপনি টেমপ্লেট সময় অসীম লুপ এর মধ্যে সমাপ্ত হবে, তাই আমি এই কার্যসংক্রান্ত নির্মিত (এটা সমাধান না)।

আপনি কিছু নামের প্যাটার্নের ভিত্তিতে একাধিক ভেরিয়েবল সংজ্ঞা দিতে পারেন এবং তারপরে এগুলি স্বয়ংক্রিয়ভাবে ভূমিতে লোড করুন।

group_vars/all.yml

dictionary_of_bla:
  - name: blabla
    value1 : blabla
    value2 : blabla

group_vars/group1.yml

dictionary_of_bla_group1:
  - name: blabla2
    value1 : blabla2
    value2 : blabla2

রোল কোড স্নিপেট

tasks:
  - name: Run for all dictionary_of_bla.* variations
    include_tasks: do_some_stuff.yml
    with_items: "{{ lookup('varnames','dictionary_of_bla.*').split(',') }}"
    loop_control:
      loop_var: _dictionary_of_bla

do_some_stuff.yml

- name: do magic
  magic:
    trick_name: item.name
    trick_value1: item.value1
    trick_value2: item.value2
  with_items: "{{ vars[_dictionary_of_bla] }}"

এটি কেবল একটি স্নিপেট, তবে এটি কীভাবে কাজ করে তা আপনার ধারণা নেওয়া উচিত। দ্রষ্টব্য: দর্শনীয় ('বর্ণগুলি', '') উত্তরযোগ্য ২.৮ থেকে উপলব্ধ

আমার ধারণা dictionary_of_bla.*, একই সময়কার অনুসন্ধানের সময় রানটাইমের সময় সমস্ত ভেরিয়েবলকে একটি অভিধানে একত্রীকরণ করাও সম্ভব হবে ।

এই পদ্ধতির সুবিধা হ'ল আপনাকে পরিবর্তনশীল নামের সঠিক তালিকা সেট করার দরকার নেই, তবে কেবল প্যাটার্ন এবং ব্যবহারকারী এটিকে গতিশীলভাবে সেট করতে পারবেন।


-4

Ansibleএকটি অটোমেশন সিস্টেম এবং কনফিগারেশন ফাইল পরিচালনার বিষয়ে এটি এর থেকে খুব আলাদা নয় apt। একটি conf.dডিরেক্টরি থেকে কনফিগারেশন স্নিপেটগুলি আরও বেশি সংখ্যক সফ্টওয়্যার সরবরাহ করার কারণটি এই জাতীয় অটোমেশন সিস্টেমগুলিকে বিভিন্ন প্যাকেজ / ভূমিকা রাখতে সক্ষম করে সফ্টওয়্যারটিতে কনফিগারেশন যুক্ত করে। আমি বিশ্বাস করি যে আপনি যা মনে রাখবেন তা করা দর্শন নয় Ansible, বরং conf.dকৌশলটি ব্যবহার করা । যদি কনফিগার করা সফ্টওয়্যারটি এই কার্যকারিতাটি না দেয় তবে আপনি সমস্যায় পড়তে পারেন।

আপনি যেহেতু এক্সএমএল কনফিগারেশন ফাইলগুলি উল্লেখ করেছেন তাই আমি কিছু ঝকঝকে করার সুযোগটি নিয়েছি। প্লেইন টেক্সট কনফিগারেশন ফাইলগুলি ব্যবহারের ইউনিক্স traditionতিহ্যের একটি কারণ রয়েছে। বাইনারি কনফিগারেশন ফাইলগুলি সিস্টেম অটোমেশনে নিজেকে ভাল ধার দেয় না, সুতরাং কোনও ধরণের বাইনারি ফর্ম্যাট আপনাকে সমস্যা দেয় এবং কনফিগারেশনটি পরিচালনা করার জন্য আপনাকে একটি প্রোগ্রাম তৈরি করতে সম্ভবত প্রয়োজন হবে। (কেউ যদি এক্সএমএলকে একটি সরল পাঠ্য বিন্যাস বলে মনে করেন তবে তাদের মস্তিষ্ক পরীক্ষা করা উচিত)

এখন, আপনার নির্দিষ্ট PostgreSQLসমস্যা কৌতুক PostgreSQLসমর্থন করে conf.d। প্রথমত, আমি shared_preload_librariesএকাধিকবার নির্দিষ্ট করা যায় কিনা তা যাচাই করে দেখব । ডকুমেন্টেশনে এটির যে কোনও ইঙ্গিত পাওয়া যায় নি, তবে আমি এখনও চেষ্টা করে দেখব। যদি এটি একাধিকবার নির্দিষ্ট করা না যায়, তবে PostgreSQLছেলেদের ধারণা থাকলে তাদের কাছে আমি আমার সমস্যাটি ব্যাখ্যা করব ; এটি একটি PostgreSQLইস্যু এবং একটি Ansibleসমস্যা নয়। যদি কোনও সমাধান না হয় এবং আমি সত্যই ভিন্ন ভিন্ন ভূমিকাকে একের সাথে একীভূত করতে না পারি তবে আমি পরিচালিত হোস্টের কনফিগারেশনটি সংকলন করতে একটি সিস্টেম প্রয়োগ করব। এই ক্ষেত্রে, আমি সম্ভবত একটি স্ক্রিপ্ট তৈরি চাই /usr/local/sbin/update_postgresql_configযা কম্পাইল হবে /etc/postgresql/postgresql.conf.jinjaমধ্যে /etc/postgresql/9.x/main/postgresql.conf। স্ক্রিপ্টটি ভাগ করে নেওয়া প্রিললোড লাইব্রেরিগুলি থেকে /etc/postgresql/shared_preload_libraries.txtপ্রতি লাইনে একটি লাইব্রেরি পড়ত এবং সেগুলি জিনজাতে সরবরাহ করবে।

অটোমেশন সিস্টেমগুলি এটি করা অস্বাভাবিক নয়। একটি উদাহরণ দেবিয়ান exim4প্যাকেজ।


PostgreSQL একটি conf.dঅন্তর্ভুক্ত প্রক্রিয়া সমর্থন করে এবং কৃতজ্ঞতার সাথে প্লেটেক্সট ফাইলগুলি ব্যবহার করে। তবে, কিছু কনফিগারেশন বিকল্প রয়েছে যেখানে একাধিক এক্সটেনশনের সম্পর্কে এটির মতামত থাকতে পারে - যেমন "ম্যাক্সওয়াল_সেন্ডারগুলি আগে যা ছিল তার থেকে 10 দ্বারা বৃদ্ধি করুন"।
ক্রেগ রিঞ্জার

4
দেখে মনে হচ্ছে আপনি কনফিগারেশন ম্যানেজমেন্ট সিস্টেমে সীমাবদ্ধতা প্রয়োগের জন্য অ্যাপ্লিকেশনটি পরিবর্তন করা উচিত, অথবা আমার পুনরায় ব্যবহারযোগ্য ভূমিকা ছেড়ে দেওয়া উচিত।
ক্রেগ রিঞ্জার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.