가져 오기는 정적이며 포함은 동적입니다. 가져 오기는 구문 분석시 발생하며 런타임에 포함됩니다.
가져 오기는 기본적으로 작업을 파일의 작업으로 대체합니다. import_task
런타임 에는 없습니다 . 그래서, 같은 속성 tags
, 그리고 when
(가장 가능성이 다른 속성)을 가져온 모든 작업에 복사됩니다.
include
실제로 실행됩니다. tags
그리고 when
는 포함 된 작업의 작업 자체에만 적용됩니다.
import
작업에 태그가 지정되지 않은 경우 가져온 파일에서 태그가 지정된 작업이 실행됩니다 . include
태그가 지정되지 않은 작업은 포함 된 파일에서 실행 되지 않습니다.
import
작업에 태그가 지정된 경우 가져온 파일의 모든 작업이 실행됩니다 . include
태스크에 태그가 지정된 경우 포함 된 파일에서 태그가 지정된 태스크 만 실행됩니다 .
의 한계 import
:
with_*
또는 loop
속성 과 함께 사용할 수 없습니다
- 변수에 따라 이름이 다른 파일을 가져올 수 없습니다
의 한계 include
:
--list-tags
포함 된 파일의 태그를 표시하지 않습니다
--list-tasks
포함 된 파일의 작업을 표시하지 않습니다
notify
동적 포함 내부에서 오는 핸들러 이름을 트리거하는 데 사용할 수 없습니다.
--start-at-task
동적 포함 내부의 작업에서 실행을 시작할 수 없습니다
여기 와 여기 에 더 있습니다 .
저에게는 기본적으로 import
s를 루프 속성과 함께 사용할 수 없다는 사실이 나옵니다 .
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
속성에 사용 된 변수를 변경하는 가져 오기 작업 파일이 없습니다 .
import
s 로 시작하는 정책이 있었지만 일단 include
포함 된 파일이나 포함 된 파일에서 아무것도 가져 오지 않아야합니다. 그러나 그것은 유지하기가 꽤 어렵습니다. 그리고 그것이 나를 문제로부터 보호 해 줄지는 아직 명확하지 않습니다. 의미 하지 않는 include
s와 import
s를 섞는 것 .
import
때때로 include
작업 을 반복해야하기 때문에 s 만 사용할 수 없습니다 . 아마 include
s 로만 전환 할 수 있습니다. 그러나 작업이 여러 번 실행되어야하는 경우를 제외하고는 모든 곳에서 수입품으로 전환하기로 결정했습니다. 나는 모든 까다로운 엣지 케이스를 직접 경험하기로 결정했습니다. 아마 내 플레이 북에 아무것도 없을 것입니다. 또는 잘 작동하는 방법을 찾을 수 있기를 바랍니다.
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
하위 작업으로 전파되지 않습니다 .