आयात स्थिर हैं, इसमें गतिशील भी शामिल हैं। आयात पार्सिंग समय पर होता है, रनटाइम में शामिल होता है।
आयात मूल रूप से कार्य को फ़ाइल से कार्यों से बदल देता है। कोई 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बाल कार्यों के प्रसार को रोकता है।