가져 오기는 정적이며 포함은 동적입니다. 가져 오기는 구문 분석시 발생하며 런타임에 포함됩니다.
가져 오기는 기본적으로 작업을 파일의 작업으로 대체합니다. import_task런타임 에는 없습니다 . 그래서, 같은 속성 tags, 그리고 when(가장 가능성이 다른 속성)을 가져온 모든 작업에 복사됩니다.
include실제로 실행됩니다. tags그리고 when는 포함 된 작업의 작업 자체에만 적용됩니다.
import작업에 태그가 지정되지 않은 경우 가져온 파일에서 태그가 지정된 작업이 실행됩니다 . include태그가 지정되지 않은 작업은 포함 된 파일에서 실행 되지 않습니다.
import작업에 태그가 지정된 경우 가져온 파일의 모든 작업이 실행됩니다 . include태스크에 태그가 지정된 경우 포함 된 파일에서 태그가 지정된 태스크 만 실행됩니다 .
의 한계 import:
with_*또는 loop속성 과 함께 사용할 수 없습니다
- 변수에 따라 이름이 다른 파일을 가져올 수 없습니다
의 한계 include:
--list-tags 포함 된 파일의 태그를 표시하지 않습니다
--list-tasks 포함 된 파일의 작업을 표시하지 않습니다
notify동적 포함 내부에서 오는 핸들러 이름을 트리거하는 데 사용할 수 없습니다.
--start-at-task동적 포함 내부의 작업에서 실행을 시작할 수 없습니다
여기 와 여기 에 더 있습니다 .
저에게는 기본적으로 imports를 루프 속성과 함께 사용할 수 없다는 사실이 나옵니다 .
import다음과 같은 경우 확실히 실패 합니다 .
# playbook.yml
- import_tasks: set-x.yml
when: x is not defined
# set-x.yml
- set_fact
x: foo
- debug:
var: x
debug작업 when에서 상속되므로 실행되지 않습니다 import_tasks. 따라서 import의 when속성에 사용 된 변수를 변경하는 가져 오기 작업 파일이 없습니다 .
imports 로 시작하는 정책이 있었지만 일단 include포함 된 파일이나 포함 된 파일에서 아무것도 가져 오지 않아야합니다. 그러나 그것은 유지하기가 꽤 어렵습니다. 그리고 그것이 나를 문제로부터 보호 해 줄지는 아직 명확하지 않습니다. 의미 하지 않는 includes와 imports를 섞는 것 .
import때때로 include작업 을 반복해야하기 때문에 s 만 사용할 수 없습니다 . 아마 includes 로만 전환 할 수 있습니다. 그러나 작업이 여러 번 실행되어야하는 경우를 제외하고는 모든 곳에서 수입품으로 전환하기로 결정했습니다. 나는 모든 까다로운 엣지 케이스를 직접 경험하기로 결정했습니다. 아마 내 플레이 북에 아무것도 없을 것입니다. 또는 잘 작동하는 방법을 찾을 수 있기를 바랍니다.
UPD 여러 번 가져올 수 있지만 한 번만 실행할 수있는 작업 파일을 만드는 유용한 방법입니다 .
- name: ...
...
when: not _file_executed | default(False)
- name: ...
...
when: not _file_executed | default(False)
...
- name: Set _file_executed
set_fact:
_file_executed: True
UPD 실제로 include와 import를 혼합 할 때 예상하지 못한 효과는 vars가 import를 무시하는 것입니다.
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
아마도 include_tasks모든 추가 정적 가져 오기를 먼저 수행 한 다음 vars지시문을 통해 전달 된 변수를 변경 하기 때문일 수 있습니다.
실제로는 수입에서만 발생하는 것은 아닙니다.
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 혼합의 또 다른 경우는 수입품입니다.
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
우리는 도착 true하고 true, 앞의 경우를 참조 (바르가 수입 바르보다 우선 포함). 에 포함으로 전환합니다 3.yml. 그러나 첫 번째 포함 3.yml은 건너 뜁니다. 그것은 when: https상위 작업에서 상속받으며 , 후자 https는 작업의에서 가져 옵니다 vars. 해결책은 포함으로 전환하는 2.yml것입니다. 그러면 when: https하위 작업으로 전파되지 않습니다 .