आयात स्थिर हैं, इसमें गतिशील भी शामिल हैं। आयात पार्सिंग समय पर होता है, रनटाइम में शामिल होता है।
आयात मूल रूप से कार्य को फ़ाइल से कार्यों से बदल देता है। कोई import_task
रनटाइम पर नहीं है। इसलिए, हर आयातित कार्य के लिए विशेषताएँ tags
, और when
(और सबसे अधिक संभावना है कि अन्य विशेषताएँ) कॉपी की जाती हैं।
include
s वास्तव में निष्पादित हैं। 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
बाल कार्यों के प्रसार को रोकता है।