include_tasks와 import_tasks의 차이점은 무엇입니까?


62

Ansible 2.4에서는 include모듈이 더 이상 사용되지 않습니다. 그 자리에서, 두 개의 교체 용 모듈과 함께 제공 그것을, import_tasks하고 include_tasks. 그러나 그들은 매우 유사한 설명을 가지고 있습니다 :

  • include_tasks: 현재 플레이 북에서 실행할 작업 목록이있는 파일을 포함합니다.
  • import_tasks: 후속 실행을 위해 현재 플레이 북에 추가 할 작업 목록을 가져옵니다.

전자는 언제 사용해야합니까, 전자는 언제 사용해야합니까?


(또한, 지원 중단 경고는 "동적"및 "정적"작업을 나타냅니다. 문서를 읽었지만 이해하지 못했습니다.)
Ben S

답변:


68

설명서에는이 주제에 대한 내용이 약간 있습니다.

주요 차이점은 다음과 같습니다.

모든 import*설명은 플레이 북이 구문 분석 될 때 사전 처리됩니다.
모든 include*설명은 플레이 북을 실행하는 동안 발생하는대로 처리됩니다.

그래서 import정적, include동적입니다.

내 경험상 import논리적 인 "단위"를 다룰 때 사용해야합니다 . 예를 들어, 긴 작업 목록을 하위 작업 파일로 분리하십시오.

main.yml :

- import_tasks: prepare_filesystem.yml
- import_tasks: install_prerequisites.yml
- import_tasks: install_application.yml

그러나 include다양한 워크 플로를 처리하고 동적으로 수집 된 몇 가지 사실에 따라 결정을 내릴 수 있습니다.

install_prerequisites :

- include_tasks: prerequisites_{{ ansible_os_family | lower }}.yml

8
이 링크가 매우 유용하다는 것을 알았습니다. docs.ansible.com/ansible/latest/… 가져 오기와 포함이 다르게 동작하는 경우를 호출합니다. 파일의 작업이 가져 오기를 결정하는 데 사용되는 기준을 변경할 수있는 '언제'조건입니다. . import_tasks를 사용하면 각 작업이 기준을 확인하므로 기준이 변경되면 동작이 변경됩니다. include_tasks를 사용하면 include_tasks 문이 실행될 때 조건이 true로 평가되었는지 여부에 따라 태스크가 존재하는지 여부가 결정됩니다. 내가 잘 이해한다면 ...
Ethel Evans

의 행동은 include무엇입니까? 우리가 사용 include한다면 import_tasks동등할까요?
Andy Shinn

include했다 static: yes(처럼 행동 import_tasks)과 static: no(와 같은 include_tasks).
Konstantin Suvorov

의 기본값은 무엇입니까 static?
Andy Shinn

static이다 None기본적으로 : Ansible 2.0, 작업이 포함되어 있기 때문에 동적이며 더 실제 작업처럼 행동. 즉, 루프를 건너 뛰고 건너 뛰고 모든 소스의 변수를 사용할 수 있습니다. Ansible이 자동 감지를 시도하지만 Ansible 2.1에 추가 된 정적 지시문을 사용하여 자동 감지를 무시할 수 있습니다.
Konstantin Suvorov

15

가져 오기는 정적이며 포함은 동적입니다. 가져 오기는 구문 분석시 발생하며 런타임에 포함됩니다.

가져 오기는 기본적으로 작업을 파일의 작업으로 대체합니다. 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. 따라서 importwhen속성에 사용 된 변수를 변경하는 가져 오기 작업 파일이 없습니다 .

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하위 작업으로 전파되지 않습니다 .


4
좋은 답변!. 인터넷상의 모든 사람들이 문서의 내용을 반복해서 좌절했습니다. 감사합니다.
Sergio Acosta
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.