উত্তরযোগ্য - কোনও ভেরিয়েবল সংজ্ঞায়িত না হলে ডিফল্ট ব্যবহার করুন


105

আমি usersআমার ভূমিকার ভিতরে লিনাক্স তৈরিটি কাস্টমাইজ করছি । আমি আমার ভূমিকা কাস্টমাইজ ব্যবহারকারীদের জানানোর প্রয়োজন বোধ করি home_directory, group_name, name, password

আমি ভাবছিলাম যে ডিফল্ট মানগুলির সাথে মানিয়ে নেওয়ার আরও নমনীয় উপায় আছে কিনা।

আমি জানি যে নীচের কোডটি সম্ভব:

- name: Create default
  user:
    name: "default_name"
  when: my_variable is not defined

 - name: Create custom
  user:
    name: "{{my_variable}}"
  when: my_variable is defined

তবে আমি যেমন উল্লেখ করেছি যে এখানে প্রচুর optionচ্ছিক পরিবর্তনশীল রয়েছে এবং এটি প্রচুর সম্ভাবনা তৈরি করে।

উপরে কোড মত কিছু আছে?

user:
  name: "default_name", "{{my_variable}}"

সংজ্ঞায়িত না name="default_name"হলে কোড সেট করা উচিত my_variable

আমি সমস্ত ভেরিয়েবল সেট defaults/main.ymlকরতে এবং এর মতো ব্যবহারকারী তৈরি করতে পারতাম :

- name: Create user
  user:
    name: "{{my_variable}}"

তবে এই পরিবর্তনগুলি সত্যই একটি বড় হ্যাশের অভ্যন্তরে রয়েছে এবং সেই হ্যাশের অভ্যন্তরে কিছু হ্যাশ রয়েছে যা ডিফল্ট হতে পারে না।


উত্তর:


199

আপনি জিনজার ব্যবহার করতে পারেন default:

- name: Create user
  user:
    name: "{{ my_variable | default('default_value') }}"

10
এবং যদি ডিফল্ট ভেরিয়েবল অন্য ভেরিয়েবলের উপর নির্ভর করে। উদাহরণস্বরূপ default('/home/' {{ anothervar }}), এই মানগুলি একত্রিত করার কোনও উপায় আছে?
বার্নার্ডো ভ্যালে

8
কেবল 'এর চারপাশে' অপসারণ করুন default_valueএবং এটি
ডিফল্ট_মূল্য

7
ভেরিয়েবলের মতো নেস্ট করা থাকলে কাজ করে না {{ dict.key | default(5) }}। অপরিবর্তিত থাকলে এটি ব্যর্থ হবে dict
জর্ডান স্টুয়ার্ট

4
এফওয়াইআই, এটি এখন একটি ত্রুটি ফেলবে:[WARNING]: when statements should not include jinja2 templating delimiters such as {{ }} or {% %}.
ব্রায়ান কেনেডি

4
@ জোর্দানস্টেওয়ার্টে আমার একই অবস্থা ছিল - নেস্টেড ভেরিয়েবলের সাথে। আমি নীচে সম্ভাব্য সমাধান সহ একটি উত্তর পোস্ট করেছি।
রোমান কৃগলভ

12

সম্পূর্ণ সম্পর্কিত নয়, তবে আপনি উভয় undefinedএবং উভয়ই পরীক্ষা করতে পারেন empty(উদাহরণস্বরূপmy_variable: ) ভেরিয়েবলের । (দ্রষ্টব্য: কেবল উত্তরসূচক সংস্করণ> 1.9 এর সাথে কাজ করে, দেখুন: লিঙ্ক করুন )

- name: Create user
  user:
    name: "{{ ((my_variable == None) | ternary('default_value', my_variable)) \
    if my_variable is defined else 'default_value' }}"

4
এটি দুর্দান্ত, খুব দরকারী।
agগল 33322

6

যদি কেউ এমন বিকল্পের সন্ধান করে যা নেস্টেড ভেরিয়েবলগুলি পরিচালনা করে, এই গিথুব ইস্যুতে এই জাতীয় বেশ কয়েকটি বিকল্প রয়েছে ।

সংক্ষেপে, নেস্টেড ভার্সের প্রতিটি স্তরের জন্য আপনাকে "ডিফল্ট" ফিল্টার ব্যবহার করতে হবে। একটি ভেরিয়েবল "a.nested.var" এর মতো দেখতে এটি দেখতে পাবেন:

- hosts: 'localhost'
  tasks:
    - debug:
        msg: "{{ ((a | default({})).nested | default({}) ).var | default('bar') }}"

অথবা আপনি প্রতিটি স্তরের বার্সার জন্য খালি ডিক্টসের ডিফল্ট মান নির্ধারণ করতে পারেন, "সংহত" ফিল্টার ব্যবহার করে। অথবা "json_query" ফিল্টার ব্যবহার করুন। তবে আমি যে বিকল্পটি বেছে নিয়েছি তা আমার কাছে সহজ বলে মনে হয় যদি আপনার নীড়ের মাত্র এক স্তর থাকে।


5

আপনি যদি আইটেমগুলি লুপ করতে চান এমন একটি নাটক থাকে তবে সেই তালিকাটি গ্রুপ_ভার্স / সমস্ত বা অন্য কোথাও সংজ্ঞায়িত করুন:

all_items:
  - first
  - second
  - third
  - fourth

তারপরে আপনার টাস্কটি এর মতো দেখতে পাওয়া যাবে:

  - name: List items or default list
    debug:
      var: item
    with_items: "{{ varlist | default(all_items) }}"

JSON অ্যারে হিসাবে ভেরিস্টে পাস করুন:

ansible-playbook <playbook_name> --extra-vars='{"varlist": [first,third]}'

এর আগে, আপনি এমন একটি কাজও পেতে চাইতে পারেন যা ভেরিস্টের প্রতিটি আইটেম অলটাইমগুলিতে রয়েছে তা পরীক্ষা করে :

  - name: Ensure passed variables are in all_items
    fail:
      msg: "{{ item }} not  in all_items list"
    when: item not in all_items
    with_items: "{{ varlist | default(all_items) }}"

4

আপনি যদি পরিবেশ থেকে ডিফল্ট পঠন সেট করতে অনুসন্ধান ব্যবহার করে থাকেন তবে আপনি ডিফল্টের দ্বিতীয় পরামিতিটিকেও সত্য হিসাবে সেট করে রেখেছেন:

- set_facts:
    ansible_ssh_user: "{{ lookup('env', 'SSH_USER') | default('foo', true) }}"

আপনি একাধিক ডিফল্ট সংজ্ঞাও একত্রিত করতে পারেন:

- set_facts:
    ansible_ssh_user: "{{ some_var.split('-')[1] | default(lookup('env','USER'), true) | default('foo') }}"

2

প্রশ্নটি বেশ পুরানো তবে কী সম্পর্কে:

- hosts: 'localhost'
  tasks:
    - debug:
        msg: "{{ ( a | default({})).get('nested', {}).get('var','bar') }}"

এটা আমার কাছে কম জটিল মনে হচ্ছে ...


1

যদি আপনি বুলিয়ান সত্যের জন্য ডিফল্ট মান নির্ধারণ করে থাকেন তবে নিশ্চিত হয়ে নিন যে ডিফল্ট () এর অভ্যন্তরে কোনও উদ্ধৃতি ব্যবহৃত হয়নি।

- name: create bool default
  set_fact:
    name: "{{ my_bool | default(true) }}"

অন্যান্য ভেরিয়েবলের জন্য যাচাই করা উত্তরে দেওয়া একই পদ্ধতি ব্যবহার করা হয়।

- name: Create user
  user:
    name: "{{ my_variable | default('default_value') }}"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.