Dalam Ansible 2.4, include
modul tidak digunakan lagi. Sebagai gantinya, ia dikirimkan dengan dua modul pengganti, import_tasks
dan include_tasks
. Tetapi mereka memiliki deskripsi yang sangat mirip:
include_tasks
: Termasuk file dengan daftar tugas yang akan dieksekusi di buku pedoman saat ini.import_tasks
: Mengimpor daftar tugas yang akan ditambahkan ke playbook saat ini untuk eksekusi selanjutnya.
Kapan saya harus menggunakan yang pertama, dan kapan saya harus menggunakan yang kedua?
Jawaban:
Ada cukup banyak tentang topik ini dalam dokumentasi:
Perbedaan utama adalah:
Begitu
import
juga statis,include
dinamis.Dari pengalaman saya, Anda harus menggunakan
import
ketika Anda berurusan dengan "unit" logis. Misalnya, pisahkan daftar tugas yang panjang ke dalam file subtugas:main.yml:
Tetapi Anda akan terbiasa
include
menghadapi alur kerja yang berbeda dan mengambil keputusan berdasarkan beberapa fakta yang dikumpulkan secara dinamis:install_prasyarat:
sumber
include
? Jika kita menggunakaninclude
akanimport_tasks
setara?include
telahstatic: yes
(berperilaku sepertiimport_tasks
), danstatic: no
(sukainclude_tasks
).static
?static
secaraNone
default: Karena Ansible 2.0, tugas termasuk bersifat dinamis dan berperilaku lebih seperti tugas nyata. Ini berarti mereka dapat diulang, dilewati dan menggunakan variabel dari sumber apa pun. Ansible mencoba mendeteksi ini secara otomatis, tetapi Anda dapat menggunakan arahan statis (yang ditambahkan pada An 2.1) untuk memintas deteksi otomatis.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 liketags
, danwhen
(dan kemungkinan besar atribut lainnya) disalin ke setiap tugas yang diimpor.include
Memang dieksekusi.tags
danwhen
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 jikainclude
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 jikainclude
tugas ditandai.Keterbatasan
import
s:with_*
atauloop
atributKeterbatasan
include
s:--list-tags
tidak menampilkan tag dari file yang disertakan--list-tasks
tidak menampilkan tugas dari file yang disertakannotify
untuk memicu nama penangan yang berasal dari dalam dinamis termasuk--start-at-task
untuk memulai eksekusi pada tugas di dalam dinamis termasukLebih 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 :debug
tidak dieksekusi, karena ia mewarisiwhen
dariimport_tasks
tugas. Jadi, tidak ada mengimpor file tugas yang mengubah variabel yang digunakan dalamimport
'swhen
atribut.Saya memiliki kebijakan untuk memulai dengan
import
s, tetapi begitu saya perluinclude
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, mencampurinclude
s danimport
s yang tidak mereka rekomendasikan.Saya tidak bisa menggunakan
import
s saja , karena saya kadang-kadang perlu mengulanginclude
tugas. Saya mungkin bisa beralih ke hanyainclude
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 :
UPD. Satu efek yang tidak benar-benar diharapkan dari pencampuran termasuk dan impor adalah bahwa termasuk vars menimpa yang impor:
playbook.yml
:2.yml
:3.yml
:Mungkin, karena
include_tasks
pertama-tama melakukan semua impor statis tambahan, dan kemudian perubahan variabel melewativars
arahannya.Sebenarnya, itu tidak hanya terjadi pada impor:
playbook.yml
:2.yml
:UPD Kasus pencampuran lainnya termasuk dan impor.
playbook.yml
:2.yml
:3.yml
:4.yml
:Kami mendapatkan
true
dantrue
, melihat kasus sebelumnya (termasuk vars diutamakan daripada vars impor). Jadi kami beralih ke memasukkan dalam3.yml
. Tapi kemudian yang pertama termasuk3.yml
dilewati. Karena itu mewarisiwhen: https
dari tugas induk, dan yang terakhir diduga mengambilhttps
dari tugas ituvars
. Solusinya adalah beralih ke memasukkan2.yml
juga. Itu mencegah penyebaranwhen: https
ke tugas anak.sumber