डिफॉल्ट और वार्स के बीच अंतर क्या है?


151

एक नई Ansible भूमिका बनाते समय, टेम्पलेट एक खाली फ़ाइल के साथ एक varsऔर एक defaultsनिर्देशिका दोनों बनाता है main.yml। अपनी भूमिका को परिभाषित करते समय, मैं इनमें से किसी एक में परिवर्तनशील परिभाषाएँ रख सकता हूं, और वे मेरे कार्यों में उपलब्ध होंगी।

defaultsऔर परिभाषाओं के बीच अंतर क्या है vars? क्या में जाना चाहिए defaults, और क्या करना चाहिए vars? क्या यह एक ही डेटा के लिए दोनों का उपयोग करने के लिए समझ में आता है?

मुझे पता है कि दोनों के बीच पूर्वता / प्राथमिकता में अंतर है, लेकिन मैं समझना चाहूंगा कि कहां जाना चाहिए।

मान लीजिए कि मेरी भूमिका लक्ष्य प्रणाली पर निर्देशिकाओं की एक सूची तैयार करेगी। मैं बनाई जाने वाली डिफ़ॉल्ट निर्देशिकाओं की एक सूची प्रदान करना चाहूंगा, लेकिन भूमिका का उपयोग करते समय उपयोगकर्ता को उन्हें ओवरराइड करने की अनुमति देना चाहूंगा।

यहां देखें कि यह कैसा होगा:

---
- directories:
  - foo
  - bar
  - baz

मैं इसे या तो में defaults/main.ymlया vars/main.ymlएक निष्पादन परिप्रेक्ष्य से अंदर रख सकता हूं , इससे कोई फर्क नहीं पड़ेगा - लेकिन इसे कहां जाना चाहिए?

जवाबों:


113

परिवर्तनशील पूर्वता पर Ansible प्रलेखन इस गुडले को सारांशित करता है:

यदि एक ही नाम के कई चर अलग-अलग स्थानों में परिभाषित किए जाते हैं, तो वे एक निश्चित क्रम में जीतते हैं, जो है:

  • अतिरिक्त संस्करण (कमांड लाइन में -e) हमेशा जीतते हैं
  • फिर इन्वेंट्री में परिभाषित कनेक्शन चर (ansible_ssh_user, आदि) आता है
  • फिर "सबसे अधिक सब कुछ" आता है (कमांड लाइन स्विच, खेलने में var, शामिल var, भूमिका संस्करण, आदि)
  • इसके बाद इन्वेंट्री में परिभाषित शेष चर आते हैं
  • इसके बाद सिस्टम के बारे में खोजे गए तथ्य सामने आते हैं
  • फिर "भूमिका चूक", ​​जो सबसे "डिफ़ॉल्ट" हैं और हर चीज को प्राथमिकता में खो देते हैं।

तो तुम एक "बिल्ला" भूमिका है कि आप webhosts का एक समूह पर बिलाव स्थापित करने के लिए उपयोग किया है लगता है, लेकिन आप एक जोड़े को होस्ट पर बिल्ला के विभिन्न संस्करणों की जरूरत है, वह अन्य मामलों में अलग-अलग उपयोगकर्ताओं के रूप में चलाने की आवश्यकता आदि defaults/main.ymlफ़ाइल हो सकता है नज़र कुछ इस तरह:

tomcat_version: 7.0.56
tomcat_user: tomcat

चूंकि वे केवल डिफ़ॉल्ट मान हैं, इसका मतलब है कि यदि वे उन चर का उपयोग नहीं किया जाता है, जो प्रश्न में मेजबान के लिए कहीं और परिभाषित नहीं हैं। आप इन चर के लिए अलग-अलग मान निर्दिष्ट करने के लिए, अपनी इन्वेंट्री फ़ाइल में तथ्यों के माध्यम से, अतिरिक्त-संस्करण के माध्यम से इन्हें ओवरराइड कर सकते हैं।

संपादित करें: ध्यान दें कि उपरोक्त सूची Ansible 1.x के लिए है। Ansible 2.x में सूची का विस्तार किया गया है। हमेशा की तरह, Ansible दस्तावेज़ीकरण 2.x के लिए चर पूर्ववर्तीता का विस्तृत विवरण प्रदान करता है।


4
धन्यवाद, यह एक उत्कृष्ट पृष्ठ है - यही मैं ढूंढ रहा था। मैं और अधिक विस्तार में जाता हूं defaultsकि varsआगे क्या करना है और क्या करना है ।
nwinkler

42
यह जोर देने के लायक है: भूमिका संस्करण में एक बुराई-उच्चता है । मेरे अनुभव में वे प्ले वर्जन से अधिक हैं, जो वास्तव में कष्टप्रद है।
tedder42

5 साल बाद, लेकिन ... मैं इसे इस तरह से देखता हूं: भूमिका चूक ऐसी चीजें हैं जो मुझे उम्मीद है कि भूमिका के एक उपयोगकर्ता को कहीं न कहीं उनके संस्करण में ओवरराइड करने की उम्मीद है। भूमिका संस्करण, ओटीओएच, मुझे एक कार्य में हार्ड-कोडिंग जानकारी से बचने की अनुमति देता है, लेकिन संभवतः केवल परीक्षण के लिए ओवरराइड किया जाएगा, और भूमिका अनुचर द्वारा बदल दिया जाएगा। एक उदाहरण के रूप में, एक प्रारंभिक व्यवस्थापक उपयोगकर्ता नाम चूक में होगा, लेकिन निर्भरता संस्करण vars में होगी।
ntwrkguru

41

भूमिका चर varको बहुत उच्च वरीयता में परिभाषित किया गया है - उन्हें केवल कमांड लाइन पर, विशिष्ट कार्य में या किसी ब्लॉक में पास करके अधिलेखित किया जा सकता है। इसलिए, आपके लगभग सभी चरों को परिभाषित किया जाना चाहिएdefaults

" वैरिएबल प्रीसेशन - व्हेयर टू पुट योर रोल वार्स " लेख में लेखक एक उदाहरण देता है कि इसमें क्या डाला जाए vars: सिस्टम-विशिष्ट स्थिरांक जो बहुत अधिक नहीं बदलते हैं। तो आपके पास vars/debian.ymlऔर vars/centos.ymlएक ही चर नाम के साथ लेकिन विभिन्न मूल्य हो सकते हैं और उन्हें सशर्त रूप से शामिल कर सकते हैं।


4

IMHO यह अव्यावहारिक और समझदार नहीं है कि Ansible स्थानों में विन्यास पर इस तरह के उच्च प्राथमिकता वार्स की भूमिकाओं । में विन्यास vars/main.ymlऔर defaults/main.ymlकम है और शायद ही प्राथमिकता होनी चाहिए।

क्या ऐसे मामलों का कोई वास्तविक जीवन उदाहरण है जहां हम इस प्रकार का व्यवहार चाहते हैं?

ऐसे उदाहरण हैं कि हम ऐसा नहीं चाहते हैं।

यहाँ बनाने की बात यह है कि कॉन्फ़िगरेशन defaults/main.ymlगतिशील नहीं हो सकता। में विन्यास vars/main.ymlकर सकते हैं। तो उदाहरण के लिए आप विशिष्ट OS और संस्करण के लिए कॉन्फ़िगरेशन को शामिल कर सकते हैं जैसा कि geerlingguy.postgresql में दिखाया गया है

लेकिन क्योंकि पूर्वता इतनी अजीब और Ansible geerlingguy जरूरतों को पेश करने में अव्यावहारिक है छद्म चर के रूप में देखा जा सकता है variables.yml

- name: Define postgresql_packages.
  set_fact:
    postgresql_packages: "{{ __postgresql_packages | list }}"
  when: postgresql_packages is not defined

यह एक ठोस वास्तविक जीवन उदाहरण है जो दर्शाता है कि पूर्वगामी अव्यावहारिक है।

यहाँ एक और बात यह है कि हम चाहते हैं कि भूमिकाएँ विन्यास योग्य हों। भूमिकाएं बाहरी हो सकती हैं, किसी और द्वारा प्रबंधित की जा सकती हैं। एक सामान्य नियम के रूप में आप उच्च प्राथमिकता वाले भूमिकाओं में कॉन्फ़िगरेशन नहीं चाहते हैं।


यह एक टिप्पणी होनी चाहिए, एक जवाब नहीं।
ntwrkguru

3

असल में, कुछ भी जो "भूमिका चूक" (भूमिका के अंदर डिफ़ॉल्ट फ़ोल्डर) में चला जाता है, सबसे निंदनीय और आसानी से निषिद्ध है। भूमिका के चर निर्देशिका में कुछ भी नाम चर में उस चर के पिछले संस्करणों को ओवरराइड करता है। इसका अनुसरण करने के लिए विचार यह है कि आप जितना अधिक स्पष्ट रूप से दायरे में आते हैं, उतनी ही पूर्ववर्ती स्थिति कमांड लाइन के साथ-साथ अतिरिक्त संस्करण हमेशा जीतती है। होस्ट और / या इन्वेंट्री वैरिएबल रोल डिफॉल्ट पर जीत सकते हैं, लेकिन स्पष्ट नहीं है जैसे कि वॉर डायरेक्टरी या एक शामिल_कार कार्य। दस्तावेज़


-4

चर और असत्य हाथ में हाथ डाले चलते हैं। यहाँ एक उदाहरण है

-name: install package
 yum: name=xyz{{package_version}} state=present

आपकी डिफ़ॉल्ट फ़ाइल में आपके पास कुछ ऐसा होगा:

package_version: 123

जो कुछ भी करने योग्य है, वह है मान लेना package_versionऔर इसे पैकेज के नाम के आगे रखना, ताकि यह कहीं पढ़ा जाए:

-name: install package
 yum: name=xyz123 state=present

इस तरह यह स्थापित हो जाएगा xyz123 और xyz123.4xyz के महान भंडार में है या नहीं ।

आखिर में यह करेंगे yum install -y xyz123

तो मूल रूप से चूक मौजूद मान हैं, यदि आप चर के लिए एक विशिष्ट मूल्य निर्धारित नहीं करते हैं, तो इसका कारण यह है कि स्थान खाली नहीं रह सकता है।


डाउनवोट किया गया क्योंकि यह प्रश्न को संबोधित नहीं करता है। स्पष्ट रूप defaultsसे उपयोग किया जाता है जब कोई varsपरिभाषित नहीं होता है, लेकिन उत्तर यह नहीं समझाता है, कि आप एक मान को एक या दूसरे के रूप में क्यों परिभाषित करेंगे, जो कि ओपी ने पूछा है। नीचे दिए गए स्पष्टीकरण की तुलना करें।
थॉमस हिर्श
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.