การนำเข้าเป็นแบบคงที่รวมถึงเป็นแบบไดนามิก การนำเข้าเกิดขึ้นในเวลาการแยกวิเคราะห์รวมถึงตอนรันไทม์
โดยทั่วไปการนำเข้าจะแทนที่งานด้วยงานจากไฟล์ ไม่มีimport_taskเวลาทำงาน ดังนั้นคุณลักษณะเช่นtagsและwhen(และคุณลักษณะอื่น ๆ ที่น่าจะเป็นไปได้มากที่สุด) จะถูกคัดลอกไปยังงานนำเข้าทุกงาน
includes ถูกประหารชีวิตแน่นอน tagsและwhenรวมถึงงานที่ใช้กับงานตัวเองเท่านั้น
งานที่ติดแท็กจากไฟล์ที่นำเข้าจะถูกเรียกใช้importงานถ้าไม่ได้ติดแท็ก ไม่มีการดำเนินการงานจากไฟล์ที่รวมอยู่หากincludeไม่ได้ติดแท็กงาน
งานทั้งหมดจากไฟล์ที่นำเข้าจะถูกดำเนินการหากimportมีการแท็ก งานที่ติดแท็กจากไฟล์ที่รวมมาเท่านั้นที่จะถูกดำเนินการหากincludeงานถูกแท็ก
ข้อ จำกัด ของimports:
- ไม่สามารถใช้กับ
with_*หรือloopแอตทริบิวต์
- ไม่สามารถนำเข้าไฟล์ซึ่งชื่อขึ้นอยู่กับตัวแปร
ข้อ จำกัด ของincludes:
--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แอตทริบิวต์
ฉันมีนโยบายที่จะเริ่มต้นด้วยimports แต่เมื่อฉันต้องการincludeให้แน่ใจว่าไม่มีสิ่งใดถูกนำเข้าโดยไฟล์ที่รวมอยู่หรือไฟล์ที่มีอยู่ แต่มันก็ยากที่จะดูแล และยังไม่ชัดเจนว่าจะป้องกันฉันจากปัญหา ความหมายการผสมincludeและการimportที่พวกเขาไม่แนะนำ
ฉันไม่สามารถใช้เฉพาะimports เนื่องจากบางครั้งฉันจำเป็นต้องวนซ้ำincludeงาน ฉันอาจเปลี่ยนเป็นincludes เท่านั้น แต่ฉันตัดสินใจเปลี่ยนไปใช้การนำเข้าทุกที่ยกเว้นกรณีที่งานควรจะถูกเรียกใช้หลายครั้ง ฉันตัดสินใจที่จะสัมผัสกับเคสขอบที่ยุ่งยากเหล่านั้นด้วยตัวเอง อาจจะไม่มีใน 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 สิ่งที่ไม่ได้คาดหวังจริงๆของการผสมรวมและการนำเข้าคือการรวมการแทนที่ด้วยการนำเข้า vars:
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ดูกรณีก่อนหน้า (รวม vars สำคัญกว่า vars นำเข้า) 3.ymlดังนั้นเราจึงเปลี่ยนไปรวมถึงใน แต่การรวมในครั้งแรก3.ymlจะถูกข้ามไป เพราะมัน inherites when: httpsจากงานแม่และหลังคาดคะเนจะใช้เวลาจากงานของhttps varsการแก้ปัญหาคือการสลับไปรวมอยู่ใน2.ymlเช่นกัน ที่ป้องกันการแพร่กระจายของwhen: httpsงานลูก