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