इनकाउंटर_टैक और इम्पोर्ट_टैक्स में क्या अंतर है?


62

Ansible 2.4 में, includeमॉड्यूल को हटा दिया गया है। इसके स्थान पर, यह दो प्रतिस्थापन मॉड्यूल के साथ जहाज करता है, import_tasksऔर include_tasks। लेकिन उनके पास बहुत समान विवरण हैं:

  • include_tasks: वर्तमान प्लेबुक में निष्पादित किए जाने वाले कार्यों की सूची के साथ एक फ़ाइल शामिल है।
  • import_tasks: बाद के निष्पादन के लिए वर्तमान प्लेबुक में जोड़े जाने वाले कार्यों की एक सूची को लागू करता है।

मुझे पूर्व का उपयोग कब करना चाहिए, और मुझे बाद का उपयोग कब करना चाहिए?


(इसके अलावा, अवकास चेतावनी "डायनेमिक" और "स्टैटिक" कार्यों को संदर्भित करती है। मैं डॉक्स पढ़ता हूं, लेकिन उन्हें समझ नहीं पाया।)
बेन एस

जवाबों:


68

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

मुख्य अंतर यह है:

सभी import*विवरणों को पूर्व-संसाधित किया जाता है जब playbooks को पार्स किया जाता है।
सभी include*विवरणों को संसाधित किया जाता है क्योंकि वे प्लेबुक के निष्पादन के दौरान सामना करते थे।

तो importस्थिर है, includeगतिशील है।

मेरे अनुभव से, आपको importतार्किक "इकाइयों" से निपटने पर उपयोग करना चाहिए । उदाहरण के लिए, कार्यों की लम्बी सूची को उप-स्तरीय फाइलों में अलग करें:

main.yml:

- import_tasks: prepare_filesystem.yml
- import_tasks: install_prerequisites.yml
- import_tasks: install_application.yml

लेकिन आप includeविभिन्न वर्कफ़्लो से निपटने और कुछ गतिशील रूप से एकत्रित तथ्यों के आधार पर निर्णय लेने के लिए उपयोग करेंगे :

install_prerequisites:

- include_tasks: prerequisites_{{ ansible_os_family | lower }}.yml

8
मुझे यह लिंक बहुत उपयोगी लगा: docs.ansible.com/ansible/latest/… यह एक ऐसा मामला है जिसमें आयात और अलग तरीके से व्यवहार शामिल है - एक 'जब' स्थिति जहां फ़ाइल में कार्य आयात को निर्धारित करने के लिए उपयोग किए गए मानदंड बदल सकते हैं । Import_tasks के साथ, प्रत्येक कार्य मापदंड की जांच करता है, इसलिए मानदंड बदलने पर व्यवहार बदलता है। शामिल__ कार्य के साथ, कार्य या तो मौजूद हैं या नहीं, इस पर आधारित है कि क्या हालत का सच मूल्यांकन किया गया था या नहीं जब शामिल किया गया था। अगर मैं अच्छी तरह
समझूँ

का व्यवहार क्या था include? अगर हम इस्तेमाल कर रहे थे includeहोगा import_tasksबराबर हो?
एंडी शिन

includeथा static: yes(जैसा व्यवहार import_tasks), और static: no(जैसे include_tasks)।
कॉन्सटेंटिन सुवोरोव

किसके लिए डिफ़ॉल्ट है static?
एंडी शिन

staticहै Noneडिफ़ॉल्ट रूप से: के बाद से Ansible 2.0, कार्य भी शामिल है गतिशील हैं और अधिक वास्तविक कार्यों की तरह व्यवहार करते हैं। इसका मतलब है कि वे किसी भी स्रोत से चर, छोड़े जा सकते हैं और चर का उपयोग कर सकते हैं। आंसिबल ऑटो को इसका पता लगाने की कोशिश करता है, लेकिन आप ऑटोडेटेक्शन को बायपास करने के लिए स्थैतिक निर्देश (जो कि ऐसिबल 2.1 में जोड़ा गया था) का उपयोग कर सकते हैं।
कॉन्स्टेंटिन सुवोरोव

15

आयात स्थिर हैं, इसमें गतिशील भी शामिल हैं। आयात पार्सिंग समय पर होता है, रनटाइम में शामिल होता है।

आयात मूल रूप से कार्य को फ़ाइल से कार्यों से बदल देता है। कोई import_taskरनटाइम पर नहीं है। इसलिए, हर आयातित कार्य के लिए विशेषताएँ tags, और when(और सबसे अधिक संभावना है कि अन्य विशेषताएँ) कॉपी की जाती हैं।

includes वास्तव में निष्पादित हैं। tagsऔर whenएक सम्मिलित कार्य केवल कार्य के लिए ही लागू होता है।

आयातित फ़ाइल से टैग किए गए importकार्य निष्पादित होने पर निष्पादित हो जाते हैं । यदि कोई कार्य पूरा नहीं हुआ है, तो सम्मिलित फ़ाइल से कोई भी कार्य निष्पादित नहीं किया जाता includeहै।

यदि आयात किया गया है तो एक आयातित फ़ाइल से सभी कार्य निष्पादित हो जाते हैं import। शामिल फ़ाइल से केवल टैग किए गए कार्य निष्पादित होने पर निष्पादित हो जाते हैं include

की सीमाएं import:

  • with_*या loopविशेषताओं के साथ उपयोग नहीं किया जा सकता है
  • एक फ़ाइल आयात नहीं कर सकते, जो नाम एक चर पर निर्भर करता है

की सीमाएं include:

  • --list-tags शामिल फ़ाइलों से टैग नहीं दिखाता है
  • --list-tasks शामिल फ़ाइलों से कार्यों को नहीं दिखाता है
  • आप notifyएक हैंडलर नाम को ट्रिगर करने के लिए उपयोग नहीं कर सकते हैं जो एक गतिशील शामिल के अंदर से आता है
  • आप --start-at-taskडायनामिक शामिल के अंदर किसी कार्य पर निष्पादन शुरू करने के लिए उपयोग नहीं कर सकते

यहाँ और यहाँ पर अधिक ।

मेरे लिए जो मूल रूप से इस तथ्य के लिए नीचे आता है कि importलूप विशेषताओं के साथ उपयोग नहीं किया जा सकता है।

importइस तरह के मामलों में निश्चित रूप से विफल हो जाएगा :

# playbook.yml
- import_tasks: set-x.yml
  when: x is not defined

# set-x.yml
- set_fact
  x: foo
- debug:
  var: x

debugइसे निष्पादित नहीं किया गया है, क्योंकि यह कार्य whenसे विरासत में मिला import_tasksहै। तो, कोई आयात कार्य फ़ाइलों को में इस्तेमाल किया चर बदलने importकी whenविशेषता।

मेरी शुरुआत importएस के साथ करने की नीति थी , लेकिन एक बार मुझे includeयह सुनिश्चित करने की ज़रूरत है कि इसमें शामिल फ़ाइल या इसमें शामिल फ़ाइलों द्वारा कुछ भी आयात न किया जाए। लेकिन इसे बनाए रखने के लिए बहुत मुश्किल है। और यह अभी भी स्पष्ट नहीं है कि यह मुझे परेशानियों से बचाएगा। मतलब, includeएस और importएस को मिलाना जो वे अनुशंसा नहीं करते हैं।

मैं केवल importएस का उपयोग नहीं कर सकता , क्योंकि मुझे कभी-कभी includeकार्यों को लूप करने की आवश्यकता होती है। मैं शायद केवल includeएस पर स्विच कर सकता हूं । लेकिन मैंने उन मामलों को छोड़कर हर जगह आयात पर स्विच करने का फैसला किया जहां कार्य को कई बार चलाया जाना चाहिए। मैंने उन सभी ट्रिकी एज मामलों को पहले अनुभव करने का फैसला किया। शायद मेरे playbooks में कोई नहीं होगा। या उम्मीद है कि मुझे इसे काम करने का एक तरीका मिल जाएगा।

UPD एक कार्य फ़ाइल बनाने के लिए संभवतः एक उपयोगी ट्रिक जिसे कई बार आयात किया जा सकता है, लेकिन एक बार निष्पादित :

- name: ...
  ...
  when: not _file_executed | default(False)

- name: ...
  ...
  when: not _file_executed | default(False)

...

- name: Set _file_executed
  set_fact:
    _file_executed: True

UPD एक में वास्तव में मिश्रण के अपेक्षित प्रभाव शामिल नहीं हैं और आयात भी शामिल है, जिनमें शामिल हैं आयात को ओवरराइड करना:

playbook.yml:

- hosts: all
  tasks:
    - import_tasks: 2.yml
      vars:
        v1: 1
    - include_tasks: 2.yml
      vars:
        v1: 1

2.yml:

- import_tasks: 3.yml
  vars:
    v1: 2

3.yml:

- debug:
    var: v1    # 2 then 1

शायद, क्योंकि include_tasksपहले सभी अतिरिक्त स्थिर आयात करता है, और फिर इसके varsनिर्देश के माध्यम से पारित चर बदलता है ।

वास्तव में, यह न केवल आयात के साथ होता है:

playbook.yml:

- hosts: all
  tasks:
    - import_tasks: 2.yml
      vars:
        v1: 1
    - include_tasks: 2.yml
      vars:
        v1: 1

2.yml:

- debug:
    var: v1    # 2 then 1
  vars:
    v1: 2

UPD मिश्रण का एक और मामला शामिल है और आयात करता है।

playbook.yml:

- hosts: all
  tasks:
    # here you're bound to use include, some sort of loop
    - include_tasks: 2.yml
      vars:
        https: yes

2.yml:

- import_tasks: 3.yml
  when: https

3.yml:

- import_tasks: 4.yml
  vars:
    https: no  # here we're trying to temporarily override https var
- import_tasks: 4.yml

4.yml:

- debug:
    var: https

हम पिछले मामले को देखते हैं trueऔर true(आयात संस्करण पर पूर्ववर्ती संस्करण को शामिल करते हैं) देखें। इसलिए हम इसमें शामिल होना चाहते हैं 3.yml। लेकिन फिर पहले शामिल किया गया 3.ymlहै छोड़ दिया। चूंकि यह when: httpsमूल कार्य से विरासत में मिला है, और उत्तरार्द्ध httpsकार्य से माना जाता है vars। समाधान के 2.ymlरूप में अच्छी तरह से में शामिल करने के लिए स्विच है । यह when: httpsबाल कार्यों के प्रसार को रोकता है।


4
बहुत बढ़िया जवाब!। मैं इंटरनेट पर हर किसी के साथ निराश हो गया था सिर्फ दस्तावेज़ीकरण कहता है। धन्यवाद।
सर्जियो अकोस्टा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.