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




ansible-2.x (4)

मैं अपनी भूमिका के अंदर linux users निर्माण को अनुकूलित कर रहा हूँ। मुझे अपनी भूमिका के उपयोगकर्ताओं को home_directory , home_directory , 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}}"

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

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

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

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


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

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

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

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

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

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

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

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

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

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





ansible-2.x