Nhập khẩu là tĩnh, bao gồm là động. Nhập khẩu xảy ra tại thời điểm phân tích cú pháp, bao gồm tại thời gian chạy.
Nhập khẩu về cơ bản thay thế nhiệm vụ với các nhiệm vụ từ tệp. Không có import_taskthời gian chạy. Vì vậy, các thuộc tính như tagsvà when(và rất có thể là các thuộc tính khác) được sao chép vào mọi tác vụ được nhập.
includes thực sự được thực thi. tagsvà whencủa một nhiệm vụ bao gồm chỉ áp dụng cho chính nhiệm vụ đó.
Các tác vụ được gắn thẻ từ một tệp đã nhập được thực thi nếu importtác vụ không được gắn thẻ. Không có tác vụ nào được thực thi từ một tệp được bao gồm nếu includetác vụ không được xử lý.
Tất cả các tác vụ từ một tệp đã nhập được thực thi nếu importtác vụ được gắn thẻ. Chỉ các tác vụ được gắn thẻ từ một tệp được bao gồm mới được thực thi nếu includetác vụ được gắn thẻ.
Hạn chế của imports:
- không thể được sử dụng với
with_*hoặc loopthuộc tính
- không thể nhập tệp, tên nào phụ thuộc vào biến
Hạn chế của includes:
--list-tags không hiển thị thẻ từ các tệp được bao gồm
--list-tasks không hiển thị các tác vụ từ các tệp được bao gồm
- bạn không thể sử dụng
notifyđể kích hoạt một tên xử lý xuất phát từ bên trong một động bao gồm
- bạn không thể sử dụng
--start-at-taskđể bắt đầu thực thi tại một tác vụ bên trong động bao gồm
Thêm về nó ở đây và ở đây .
Đối với tôi, về cơ bản, importchúng ta không thể sử dụng các thuộc tính vòng lặp.
importchắc chắn sẽ thất bại trong trường hợp như thế này :
# playbook.yml
- import_tasks: set-x.yml
when: x is not defined
# set-x.yml
- set_fact
x: foo
- debug:
var: x
debugkhông được thực thi, vì nó kế thừa whentừ import_tasksnhiệm vụ. Vì vậy, không nhập khẩu file nhiệm vụ đó thay đổi các biến được sử dụng trong import's whenthuộc tính.
Tôi đã có một chính sách để bắt đầu với imports, nhưng một khi tôi cần includechắc chắn rằng không có gì được nhập bởi tệp bao gồm hoặc các tệp mà nó bao gồm. Nhưng đó là khá khó để duy trì. Và vẫn chưa rõ liệu nó có bảo vệ tôi khỏi những rắc rối không. Ý nghĩa, pha trộn includes và imports mà họ không đề xuất.
Tôi không thể chỉ sử dụng imports, vì thỉnh thoảng tôi cần lặp lại includecác tác vụ. Tôi có lẽ chỉ có thể chuyển sang includes. Nhưng tôi quyết định chuyển sang nhập hàng ở mọi nơi trừ trường hợp nhiệm vụ được cho là chạy nhiều lần. Tôi quyết định trải nghiệm tất cả những trường hợp khó khăn trong tầm tay. Có lẽ sẽ không có bất kỳ cuốn sách nào trong vở kịch của tôi. Hoặc hy vọng tôi sẽ tìm ra cách để nó hoạt động.
CẬP NHẬT Một thủ thuật có thể hữu ích để tạo một tệp tác vụ có thể được nhập nhiều lần, nhưng được thực hiện một lần :
- name: ...
...
when: not _file_executed | default(False)
- name: ...
...
when: not _file_executed | default(False)
...
- name: Set _file_executed
set_fact:
_file_executed: True
CẬP NHẬT Một tác dụng không thực sự được mong đợi của việc trộn bao gồm và nhập khẩu là bao gồm các vars ghi đè lên các mục nhập:
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
Có lẽ, bởi vì include_taskstrước tiên, tất cả các nhập khẩu tĩnh bổ sung, và sau đó thay đổi các biến được truyền qua varschỉ thị của nó .
Trên thực tế, nó không chỉ xảy ra với hàng nhập khẩu:
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
CẬP NHẬT Một trường hợp trộn khác bao gồm và nhập khẩu.
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
Chúng tôi nhận được truevà true, xem trường hợp trước (bao gồm các vars được ưu tiên hơn các vars nhập khẩu). Vì vậy, chúng tôi chuyển sang bao gồm trong 3.yml. Nhưng sau đó bao gồm đầu tiên 3.ymlđược bỏ qua. Vì nó kế thừa when: httpstừ nhiệm vụ mẹ và cái sau được cho là lấy httpstừ nhiệm vụ vars. Giải pháp là chuyển sang bao gồm cả 2.yml. Điều đó ngăn cản sự truyền bá when: httpsđến các nhiệm vụ con.