2017-01-28 13 views
14

Tôi gặp khó khăn trong việc hiểu được logic của cú pháp withsubelements không thể gửi được, chính xác những gì with_subelements làm? tôi đã xem xét tài liệu ansible trên with_subelements ở đây http://docs.ansible.com/ansible/playbooks_loops.html#looping-over-subelements và không phải là rất hữu ích. Tôi cũng đã xem một sách bài hát có ví dụ with_subelements trên blogAnsible with_subelements

--- 
- hosts: cent 
    vars: 
    users: 
    - name: jagadish 
     comments: 
     - 'Jagadish is Good' 

    - name: srini 
     comments: 
     - 'Srini is Bad' 

    tasks: 
    - name: User Creation 
    shell: useradd -c "{{ item.1 }}" "{{ item.0.name }}" 
    with_subelements: 
     - users 
     - comments 

mục item.1 và item.0 là gì?

Trả lời

28

Đây thực sự là ví dụ tồi về cách hoạt động của tra cứu subelements. (Và cũng có cú pháp cũ, không được hỗ trợ).

Nhìn vào cái này:

Danh sách
--- 
- hosts: localhost 
    gather_facts: no 
    vars: 
    families: 
     - surname: Smith 
     children: 
      - name: Mike 
      age: 4 
      - name: Kate 
      age: 7 
     - surname: Sanders 
     children: 
      - name: Pete 
      age: 12 
      - name: Sara 
      age: 17 

    tasks: 
    - name: List children 
     debug: 
     msg: "Family={{ item.0.surname }} Child={{ item.1.name }} Age={{ item.1.age }}" 
     with_subelements: 
     - "{{ families }}" 
     - children 

công tác trẻ em cũng giống như một vòng lặp lồng nhau trên families danh sách (vòng ngoài) và hơn children subelement trong mỗi gia đình (vòng trong).
Vì vậy, bạn nên cung cấp danh sách các dicts làm đối số đầu tiên cho subelements và tên của subelement bạn muốn lặp lại bên trong mỗi mục bên ngoài.

Bằng cách này item.0 (gia đình trong ví dụ của tôi) là một mục bên ngoài và item.1 (trẻ em trong ví dụ của tôi) là một mục bên trong.

Trong ví dụ về tài liệu ansible subelements được sử dụng để lặp qua người dùng (bên ngoài) và thêm một số khóa công cộng (bên trong).

+2

đây là giải thích tốt hơn một triệu lần so với tài liệu Ansible, bây giờ là câu hỏi tiếp theo, nếu tôi muốn có một vòng lặp bên trong khác nói cháu, làm cách nào các phần phụ sẽ hoạt động trên một kịch bản như vậy? – ahmedjaad

+0

Không có cách nào cho vòng lặp lồng nhau thứ ba, afaik. Tùy thuộc vào nhiệm vụ của bạn 'map' hoặc' json_query' có thể hữu ích. –