Sự khác biệt giữa include_t Nhiệm vụ và import_t Nhiệm vụ là gì?


63

Trong Ansible 2.4, includemô-đun không được dùng nữa. Ở vị trí của nó, nó xuất xưởng với hai mô-đun thay thế, import_tasksinclude_tasks. Nhưng họ có những mô tả rất giống nhau:

  • include_tasks: Bao gồm một tệp có danh sách các tác vụ sẽ được thực hiện trong sổ chơi hiện tại.
  • import_tasks: Nhập danh sách các tác vụ sẽ được thêm vào sổ chơi hiện tại để thực hiện tiếp theo.

Khi nào tôi nên sử dụng cái trước và khi nào tôi nên sử dụng cái trước?


(Ngoài ra: cảnh báo không dùng nữa đề cập đến các nhiệm vụ "động" và "tĩnh". Tôi đã đọc các tài liệu nhưng không hiểu chúng.)
Ben S

Câu trả lời:


69

Có khá nhiều về chủ đề này trong tài liệu:

Sự khác biệt chính là:

Tất cả các import*câu lệnh được xử lý trước tại thời điểm playbooks được phân tích cú pháp.
Tất cả các include*câu lệnh được xử lý khi chúng gặp phải trong quá trình thực hiện Playbook.

Thế importlà tĩnh, includelà động.

Từ kinh nghiệm của tôi, bạn nên sử dụng importkhi bạn xử lý các "đơn vị" logic. Ví dụ: tách danh sách dài các tác vụ thành các tệp con:

chính.yml:

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

Nhưng bạn sẽ sử dụng includeđể đối phó với các quy trình công việc khác nhau và đưa ra quyết định dựa trên một số sự kiện được thu thập động:

install_prerequisites:

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

8
Tôi thấy liên kết này rất hữu ích: docs.ansible.com/ansible/latest/ Từ Nó gọi ra một trường hợp nhập và bao gồm hành vi khác - một điều kiện 'khi' trong đó các tác vụ trong tệp có thể thay đổi tiêu chí được sử dụng để xác định nhập . Với import_t Nhiệm vụ, mỗi tác vụ sẽ kiểm tra các tiêu chí, do đó hành vi thay đổi khi tiêu chí thay đổi. Với include_t Nhiệm vụ, các tác vụ có mặt hay không dựa trên việc điều kiện có được đánh giá là đúng hay không khi câu lệnh include_t Nhiệm vụ được thực thi. Nếu tôi hiểu rõ ...
Ethel Evans

Hành vi của là includegì? Nếu chúng ta đang sử dụng includesẽ import_taskslà tương đương?
Andy Shinn

includeđã static: yes(cư xử như import_tasks), và static: no(như include_tasks).
Konstantin Suvorov

Mặc định là staticgì?
Andy Shinn

staticNonetheo mặc định: Kể từ Ansible 2.0, nhiệm vụ bao gồm rất năng động và cư xử giống như nhiệm vụ thực sự. Điều này có nghĩa là chúng có thể được lặp, bỏ qua và sử dụng các biến từ bất kỳ nguồn nào. Ansible cố gắng tự động phát hiện điều này, nhưng bạn có thể sử dụng chỉ thị tĩnh (đã được thêm vào trong Ansible 2.1) để bỏ qua tự động phát hiện.
Konstantin Suvorov

15

Nhập khẩu là tĩnh, bao gồm là động. Nhập khẩu xảy ra tại thời điểm phân tích cú pháp, bao gồm tại thời gian chạy.

Nhập khẩu về cơ bản thay thế nhiệm vụ với các nhiệm vụ từ tệp. Không có import_taskthời gian chạy. Vì vậy, các thuộc tính như tagswhen(và rất có thể là các thuộc tính khác) được sao chép vào mọi tác vụ được nhập.

includes thực sự được thực thi. tagswhencủa một nhiệm vụ bao gồm chỉ áp dụng cho chính nhiệm vụ đó.

Các tác vụ được gắn thẻ từ một tệp đã nhập được thực thi nếu importtác vụ không được gắn thẻ. Không có tác vụ nào được thực thi từ một tệp được bao gồm nếu includetác vụ không được xử lý.

Tất cả các tác vụ từ một tệp đã nhập được thực thi nếu importtác vụ được gắn thẻ. Chỉ các tác vụ được gắn thẻ từ một tệp được bao gồm mới được thực thi nếu includetác vụ được gắn thẻ.

Hạn chế của imports:

  • không thể được sử dụng với with_*hoặc loopthuộc tính
  • không thể nhập tệp, tên nào phụ thuộc vào biến

Hạn chế của includes:

  • --list-tags không hiển thị thẻ từ các tệp được bao gồm
  • --list-tasks không hiển thị các tác vụ từ các tệp được bao gồm
  • bạn không thể sử dụng notifyđể kích hoạt một tên xử lý xuất phát từ bên trong một động bao gồm
  • bạn không thể sử dụng --start-at-taskđể bắt đầu thực thi tại một tác vụ bên trong động bao gồm

Thêm về nó ở đâyở đây .

Đối với tôi, về cơ bản, importchúng ta không thể sử dụng các thuộc tính vòng lặp.

importchắc chắn sẽ thất bại trong trường hợp như thế này :

# playbook.yml
- import_tasks: set-x.yml
  when: x is not defined

# set-x.yml
- set_fact
  x: foo
- debug:
  var: x

debugkhông được thực thi, vì nó kế thừa whentừ import_tasksnhiệm vụ. Vì vậy, không nhập khẩu file nhiệm vụ đó thay đổi các biến được sử dụng trong import's whenthuộc tính.

Tôi đã có một chính sách để bắt đầu với imports, nhưng một khi tôi cần includechắc chắn rằng không có gì được nhập bởi tệp bao gồm hoặc các tệp mà nó bao gồm. Nhưng đó là khá khó để duy trì. Và vẫn chưa rõ liệu nó có bảo vệ tôi khỏi những rắc rối không. Ý nghĩa, pha trộn includes và imports mà họ không đề xuất.

Tôi không thể chỉ sử dụng imports, vì thỉnh thoảng tôi cần lặp lại includecác tác vụ. Tôi có lẽ chỉ có thể chuyển sang includes. Nhưng tôi quyết định chuyển sang nhập hàng ở mọi nơi trừ trường hợp nhiệm vụ được cho là chạy nhiều lần. Tôi quyết định trải nghiệm tất cả những trường hợp khó khăn trong tầm tay. Có lẽ sẽ không có bất kỳ cuốn sách nào trong vở kịch của tôi. Hoặc hy vọng tôi sẽ tìm ra cách để nó hoạt động.

CẬP NHẬT Một thủ thuật có thể hữu ích để tạo một tệp tác vụ có thể được nhập nhiều lần, nhưng được thực hiện một lần :

- name: ...
  ...
  when: not _file_executed | default(False)

- name: ...
  ...
  when: not _file_executed | default(False)

...

- name: Set _file_executed
  set_fact:
    _file_executed: True

CẬP NHẬT Một tác dụng không thực sự được mong đợi của việc trộn bao gồm và nhập khẩu là bao gồm các vars ghi đè lên các mục nhập:

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

Có lẽ, bởi vì include_taskstrước tiên, tất cả các nhập khẩu tĩnh bổ sung, và sau đó thay đổi các biến được truyền qua varschỉ thị của nó .

Trên thực tế, nó không chỉ xảy ra với hàng nhập khẩu:

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

CẬP NHẬT Một trường hợp trộn khác bao gồm và nhập khẩu.

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

Chúng tôi nhận được truetrue, xem trường hợp trước (bao gồm các vars được ưu tiên hơn các vars nhập khẩu). Vì vậy, chúng tôi chuyển sang bao gồm trong 3.yml. Nhưng sau đó bao gồm đầu tiên 3.ymlđược bỏ qua. Vì nó kế thừa when: httpstừ nhiệm vụ mẹ và cái sau được cho là lấy httpstừ nhiệm vụ vars. Giải pháp là chuyển sang bao gồm cả 2.yml. Điều đó ngăn cản sự truyền bá when: httpsđến các nhiệm vụ con.


4
Câu trả lời chính xác!. Tôi đã thất vọng với tất cả mọi người trên internet chỉ lặp lại những gì tài liệu nói. Cảm ơn bạn.
Sergio Acosta
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.