2016-02-18 24 views
16

Ansible 1.9.4. Tôi cố gắng thực hiện một số tác vụ chỉ dành cho máy chủ, khi một số biến được xác định, nó hoạt động tốt, nhưng không làm việc với câu lệnh with_items.Ansible with_items khi mục được xác định

- debug: var=symlinks 
    when: symlinks is defined 

- name: Create other symlinks 
    file: src={{ item.src }} dest={{ item.dest }} state=link 
    with_items: "{{ symlinks }}" 
    when: symlinks is defined 

Nhưng tôi nhận được:

TASK: [app/symlinks | debug var=symlinks] ********************* 
skipping: [another-host-yet] 

TASK: [app/symlinks | Create other symlinks] ****************** 
fatal: [another-host-yet] => with_items expects a list or a set 

Có lẽ tôi làm sai điều gì? xin lỗi vì tiếng

+0

giá trị là gì của 'symlinks'? – helloV

+0

Vấn đề là cùng một máy chủ, biến này không được xác định –

Trả lời

24
with_items: "{{ symlinks | default([]) }}" 
19

Lý do của tôi cho hành vi này là điều kiện làm việc khác nhau bên trong vòng lặp. Nếu một vòng lặp được xác định, điều kiện được đánh giá cho mỗi mục trong khi lặp lại trên các mục. Nhưng bản thân vòng lặp yêu cầu một danh sách hợp lệ.

này cũng được đề cập in the docs:

Lưu ý rằng khi kết hợp khi với with_items (xem Loops), lưu ý rằng khi tuyên bố được xử lý riêng cho từng hạng mục. Đây là do thiết kế:

tasks: 
    - command: echo {{ item }} 
    with_items: [ 0, 2, 4, 6, 8, 10 ] 
    when: item > 5 

Tôi nghĩ rằng đây là một sự lựa chọn thiết kế xấu và cho chức năng này họ tốt hơn nên tôi đã giới thiệu một cái gì đó giống như with_when.

Như bạn đã tự tìm ra, bạn có thể đặt mặc định thành danh sách trống.

with_items: "{{ symlinks | default([]) }}" 

Cuối cùng nếu danh sách là tự động nạp từ một var, nói x, sử dụng:

with_items: "{{ symlinks[x|default('')] | default([])}}" 

này sẽ mặc định một danh sách trống khi 'x' là undefined

Các vấn đề liên quan