Impor statis, termasuk dinamis. Impor terjadi pada waktu parsing, termasuk saat runtime.
Impor pada dasarnya mengganti tugas dengan tugas dari file. Tidak ada import_task
saat runtime. Jadi, atribut like tags
, dan when
(dan kemungkinan besar atribut lainnya) disalin ke setiap tugas yang diimpor.
include
Memang dieksekusi. tags
dan when
tugas yang disertakan hanya berlaku untuk tugas itu sendiri.
import
Tugas yang ditandai dari file yang diimpor dijalankan jika tugas tidak diberi tag. Tidak ada tugas yang dieksekusi dari file yang disertakan jika include
tugas tersebut tidak ditandai.
Semua tugas dari file yang diimpor dieksekusi jika import
tugas ditandai. Hanya tugas yang ditandai dari file yang disertakan yang dieksekusi jika include
tugas ditandai.
Keterbatasan import
s:
- tidak dapat digunakan dengan
with_*
atau loop
atribut
- tidak dapat mengimpor file, yang namanya tergantung pada variabel
Keterbatasan include
s:
--list-tags
tidak menampilkan tag dari file yang disertakan
--list-tasks
tidak menampilkan tugas dari file yang disertakan
- Anda tidak dapat menggunakan
notify
untuk memicu nama penangan yang berasal dari dalam dinamis termasuk
- Anda tidak dapat menggunakan
--start-at-task
untuk memulai eksekusi pada tugas di dalam dinamis termasuk
Lebih lanjut tentang ini di sini dan di sini .
Bagi saya itu pada dasarnya datang ke fakta bahwa import
s tidak dapat digunakan dengan atribut loop.
import
pasti akan gagal dalam kasus-kasus seperti ini :
# playbook.yml
- import_tasks: set-x.yml
when: x is not defined
# set-x.yml
- set_fact
x: foo
- debug:
var: x
debug
tidak dieksekusi, karena ia mewarisi when
dari import_tasks
tugas. Jadi, tidak ada mengimpor file tugas yang mengubah variabel yang digunakan dalam import
's when
atribut.
Saya memiliki kebijakan untuk memulai dengan import
s, tetapi begitu saya perlu include
memastikan tidak ada yang diimpor oleh file yang disertakan atau file yang disertakan. Tapi itu sangat sulit dipertahankan. Dan masih belum jelas apakah itu akan melindungi saya dari masalah. Artinya, mencampur include
s dan import
s yang tidak mereka rekomendasikan.
Saya tidak bisa menggunakan import
s saja , karena saya kadang-kadang perlu mengulang include
tugas. Saya mungkin bisa beralih ke hanya include
s. Tetapi saya memutuskan untuk beralih ke impor di mana-mana kecuali untuk kasus-kasus di mana tugas seharusnya dijalankan beberapa kali. Saya memutuskan untuk mengalami sendiri semua kasus tepi yang rumit itu secara langsung. Mungkin tidak akan ada di buku pedoman saya. Atau mudah-mudahan saya akan menemukan cara untuk membuatnya bekerja.
UPD Trik yang mungkin berguna untuk membuat file tugas yang dapat diimpor berkali-kali, tetapi dieksekusi sekali :
- name: ...
...
when: not _file_executed | default(False)
- name: ...
...
when: not _file_executed | default(False)
...
- name: Set _file_executed
set_fact:
_file_executed: True
UPD. Satu efek yang tidak benar-benar diharapkan dari pencampuran termasuk dan impor adalah bahwa termasuk vars menimpa yang impor:
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
Mungkin, karena include_tasks
pertama-tama melakukan semua impor statis tambahan, dan kemudian perubahan variabel melewati vars
arahannya.
Sebenarnya, itu tidak hanya terjadi pada impor:
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 Kasus pencampuran lainnya termasuk dan impor.
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
Kami mendapatkan true
dan true
, melihat kasus sebelumnya (termasuk vars diutamakan daripada vars impor). Jadi kami beralih ke memasukkan dalam 3.yml
. Tapi kemudian yang pertama termasuk 3.yml
dilewati. Karena itu mewarisi when: https
dari tugas induk, dan yang terakhir diduga mengambil https
dari tugas itu vars
. Solusinya adalah beralih ke memasukkan 2.yml
juga. Itu mencegah penyebaran when: https
ke tugas anak.