İthalat statik, içerik dinamik. İthalat, ayrıştırma sırasında gerçekleşir, çalışma zamanında içerir.
İthalat, temel olarak görevi dosyadaki görevlerle değiştirir. Çalışma import_task
zamanında yok . Bu nedenle, tags
ve when
(ve diğer olasılıklar gibi ) gibi nitelikler içe aktarılan her göreve kopyalanır.
include
Gerçekten de idam edilir. tags
ve when
dahil olan bir görevin yalnızca görevin kendisi için geçerlidir.
import
Görev etiketlenmemişse içe aktarılmış bir dosyadan etiketli görevler yerine getirilir. include
Görev etiketlenmemişse , hiçbir görev dahil edilen bir dosyadan yürütülmez .
import
Görev etiketlenirse içe aktarılmış bir dosyadaki tüm görevler yerine getirilir. Yalnızca dahil edilen bir dosyadaki etiketli görevler, include
görev etiketlendiğinde yürütülür .
S sınırlamaları import
:
with_*
veya loop
niteliklerle kullanılamaz
- değişkene bağlı olan bir dosyayı alamıyor
S sınırlamaları include
:
--list-tags
dahil edilen dosyalardan etiket göstermiyor
--list-tasks
dahil edilen dosyalardaki görevleri göstermiyor
notify
dinamik bir içeriğin içinden gelen bir işleyici adını tetiklemek için kullanamazsınız
--start-at-task
Dinamik bir dahil içinde bir göreve yürütmeye başlamak için kullanamazsınız
Burada ve burada daha fazlası .
Benim için bu, temelde import
döngü öznitelikleriyle kullanılamaması gerçeğine bağlı .
import
Bu gibi durumlarda kesinlikle başarısız olur :
# playbook.yml
- import_tasks: set-x.yml
when: x is not defined
# set-x.yml
- set_fact
x: foo
- debug:
var: x
debug
devralır beri yürütülmez when
gelen import_tasks
görevi. Yani, kullanılan değişkenleri değiştirmek hiçbir ithal görev dosyalar import
'ın when
özelliğinde.
import
S ile başlamak için bir politikam vardı , ancak bir keresinde include
içerdiği dosya veya içerdiği dosyalar tarafından hiçbir şeyin içe aktarılmadığından emin olmak istiyorum. Ama bakımı oldukça zor. Ve hala beni sıkıntılardan koruyacak mı belli değil. Anlam, onların tavsiye etmediği karıştırma include
s ve import
s.
Sadece import
s kullanamıyorum çünkü ara sıra include
görevlerim gerekiyor . Muhtemelen sadece include
s'ye geçebilirim . Ancak görevin birkaç kez çalıştırılması gereken durumlar dışında her yere ithalat yapmaya geçmeye karar verdim. Tüm bu zor vakaları ilk elden deneyimlemeye karar verdim. Belki de oyun kitaplarımda hiç bir şey olmaz. Ya da umarım çalışmasını sağlayacak bir yol bulacağım.
UPD Birçok kez içe aktarılabilen ancak bir kez çalıştırılabilen bir görev dosyası oluşturmak için muhtemelen faydalı bir numara :
- name: ...
...
when: not _file_executed | default(False)
- name: ...
...
when: not _file_executed | default(False)
...
- name: Set _file_executed
set_fact:
_file_executed: True
UPD Karışımların ve ithalatların karıştırılmasının gerçekten beklenmeyen bir etkisi, ithal edilenleri geçersiz kılan varyasyonları içermesidir:
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
Muhtemelen, çünkü include_tasks
ilk önce tüm statik ithalatları yapıyor, sonra da vars
direktiflerinden geçen değişkenleri değiştiriyor .
Aslında, sadece ithalatla olmaz:
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 Başka bir karıştırma durumu, ithalatı içerir.
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
Biz almak true
ve true
, yukarıda yer alan dava (vars ithalat vars önceliklidir dahil). Bu yüzden içine dahil etmeye geçiyoruz 3.yml
. Ama sonra ilk ekleme 3.yml
atlanır. Çünkü when: https
ana görevin mirasını alır ve ikincisi sözde https
görevin görevinden alır vars
. Çözüm, içerisine de geçmek 2.yml
. Bu when: https
, çocuk görevlerine yayılmasını önler .