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_task
thời gian chạy. Vì vậy, các thuộc tính như tags
và 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.
include
s thực sự được thực thi. tags
và when
củ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 import
tá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 include
tá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 import
tá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 include
tác vụ được gắn thẻ.
Hạn chế của import
s:
- không thể được sử dụng với
with_*
hoặc loop
thuộ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 include
s:
--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, import
chúng ta không thể sử dụng các thuộc tính vòng lặp.
import
chắ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
debug
không được thực thi, vì nó kế thừa when
từ import_tasks
nhiệ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 when
thuộc tính.
Tôi đã có một chính sách để bắt đầu với import
s, nhưng một khi tôi cần include
chắ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 include
s và import
s mà họ không đề xuất.
Tôi không thể chỉ sử dụng import
s, vì thỉnh thoảng tôi cần lặp lại include
các tác vụ. Tôi có lẽ chỉ có thể chuyển sang include
s. 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_tasks
trướ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 vars
chỉ 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 true
và 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: https
từ nhiệm vụ mẹ và cái sau được cho là lấy https
từ 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.