यदि कोई चर परिभाषित नहीं है, तो डिफ़ॉल्ट का उपयोग करें


98

मैं 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

लेकिन जैसा कि मैंने उल्लेख किया है, इसमें बहुत सारे वैकल्पिक चर हैं और यह बहुत सारी संभावनाएं पैदा करता है।

क्या ऊपर कोड जैसा कुछ है?

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

name="default_name"जब my_variableपरिभाषित न किया जाए तो कोड सेट होना चाहिए ।

मैं सभी वैरिएबल सेट कर सकता हूं defaults/main.ymlऔर उपयोगकर्ता को इस तरह बना सकता हूं :

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

लेकिन वे चर वास्तव में बड़े हैश के अंदर हैं और उस हैश के अंदर कुछ हैश हैं जो डिफ़ॉल्ट नहीं हो सकते।


जवाबों:


190

आप जिनजा का उपयोग कर सकते हैं default:

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

10
और अगर डिफ़ॉल्ट चर दूसरे चर पर निर्भर करता है। उदाहरण के लिए default('/home/' {{ anothervar }}), क्या उन मूल्यों को समझने का एक तरीका है?
बर्नार्डो वले

8
बस 'के आसपास' को हटा दें default_valueऔर यह
dagonza

7
चर की तरह नेस्टेड होने पर काम नहीं करता है {{ dict.key | default(5) }}। यदि dictयह अपरिभाषित है तो यह विफल हो जाएगा ।
जॉर्डन स्टीवर्ट

1
FYI करें, अब यह एक त्रुटि देगा:[WARNING]: when statements should not include jinja2 templating delimiters such as {{ }} or {% %}.
bryan kennedy

1
@JordanStewart मेरे पास एक ही मामला था - नेस्टेड चर के साथ। मैंने नीचे संभावित समाधान के साथ एक उत्तर पोस्ट किया है।
रोमन क्रुग्लोव

11

नहीं पूरी तरह से संबंधित है, लेकिन आप भी दोनों के लिए जाँच कर सकते हैं undefinedऔर empty(उदाहरण के लिए my_variable:) अलग-अलग। (नोट: केवल ansible संस्करण> 1.9 के साथ काम करता है, देखें: लिंक )

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

2
यह बहुत अच्छा है, बहुत उपयोगी है।
eagle33322

5

अगर कोई ऐसे विकल्प की तलाश में है जो नेस्टेड वेरिएबल्स को हैंडल करे, तो इस गीथब इश्यू में कई ऐसे विकल्प हैं ।

संक्षेप में, आपको नेस्टेड वर्जन के हर स्तर के लिए "डिफ़ॉल्ट" फिल्टर का उपयोग करने की आवश्यकता है। एक चर "a.nested.var" के लिए यह ऐसा दिखेगा:

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

या आप प्रत्येक स्तर के var के लिए खाली dicts के डिफ़ॉल्ट मान सेट कर सकते हैं, शायद "गठबंधन" फ़िल्टर का उपयोग कर रहे हैं। या "json_query" फ़िल्टर का उपयोग करें। लेकिन मेरे द्वारा चुना गया विकल्प मुझे सरल लगता है यदि आपके पास केवल एक स्तर का घोंसला है।


4

यदि आपके पास एक एकल नाटक है जिसे आप आइटम पर लूप करना चाहते हैं, तो उस सूची को group_vars / सभी या कहीं और से परिभाषित करें जो कुछ समझ में आता है:

all_items:
  - first
  - second
  - third
  - fourth

तब आपका कार्य इस तरह दिख सकता है:

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

एक JSON सरणी के रूप में varlist में पास करें:

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

3

यदि आपने पर्यावरण से डिफ़ॉल्ट रीड सेट को देखने के लिए उपयोग किया है, तो आपने डिफ़ॉल्ट के दूसरे पैरामीटर को भी सही पर सेट किया है:

- 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') }}"

1

सवाल काफी पुराना है, लेकिन इसके बारे में क्या:

- 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') }}"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.