2016-10-25 12 views
42

ngay bây giờ tôi đang sử dụng một kịch bản shell trong ansible đó sẽ là nhiều hơn nữa có thể đọc được nếu nó đã được trên nhiều dòngLàm thế nào để làm kịch bản shell multiline trong Ansible

- name: iterate user groups 
    shell: groupmod -o -g {{ item['guid'] }} {{ item['username'] }} ....more stuff to do 
    with_items: "{{ users }}" 

Chỉ cần không chắc chắn làm thế nào để cho phép kịch bản multiline trong Ansible mô-đun vỏ

+0

Cũng xem xét sử dụng lệnh ansible 'kịch bản' và sử dụng một tập tin bên ngoài – Jason

Trả lời

83

Ansible sử dụng cú pháp YAML trong playbooks của nó. YAML có một số toán tử khối:

  • > là toán tử khối gấp. Nghĩa là, nó nối nhiều đường với nhau bằng dấu cách. Cú pháp sau:

    key: > 
        This text 
        has multiple 
        lines 
    

    Chỉ định giá trị This text has multiple lines\n đến key.

  • Ký tự | là toán tử khối chữ. Đây có lẽ là những gì bạn muốn cho các kịch bản shell nhiều dòng. Cú pháp sau:

    key: | 
        This text 
        has multiple 
        lines 
    

    sẽ gán giá trị This text\nhas multiple\nlines\n-key.

Bạn có thể sử dụng cho các kịch bản shell multiline như thế này:

- name: iterate user groups 
    shell: | 
    groupmod -o -g {{ item['guid'] }} {{ item['username'] }} 
    do_some_stuff_here 
    and_some_other_stuff 
    with_items: "{{ users }}" 

Có một caveat: Ansible hiện một số thao tác janky các đối số cho lệnh shell, vì vậy trong khi ở trên thường sẽ làm việc như dự kiến, những điều sau sẽ không:

- shell: | 
    cat <<EOF 
    This is a test. 
    EOF 

Ansible sẽ thực sự hiển thị văn bản đó với không gian hàng đầu, có nghĩa là vỏ sẽ không bao giờ tìm thấy chuỗi EOF ở đầu dòng. Bạn có thể tránh chẩn đoán vô ích Ansible bằng cách sử dụng tham số cmd như thế này:

- shell: 
    cmd: | 
     cat <<EOF 
     This is a test. 
     EOF 
+4

Câu trả lời tuyệt vời –

8

https://support.ansible.com/hc/en-us/articles/201957837-How-do-I-split-an-action-into-a-multi-line-format-

đề cập đến dòng liên tục YAML.

Như một ví dụ (thử với 2.0.0.2 ansible):

--- 
- hosts: all 
    tasks: 
    - name: multiline shell command 
     shell: > 
     ls --color 
     /home 
     register: stdout 

    - name: debug output 
     debug: msg={{ stdout }} 

Các lệnh shell được thu nhỏ thành một dòng duy nhất, như trong ls --color /home

+2

Ừ nhưng trong vỏ '> 'có một ý nghĩa rất đặc biệt. Tôi đã thử điều này và nó không hoạt động như mong đợi. –

+3

Đó là lý do tại sao nó chỉ ở dòng đầu tiên, chứ không phải trong dòng tiếp theo. Nó làm việc tốt cho tôi với ansible 2.0 như tôi đã viết, mặc dù nó đã không in ra đầu ra ls đầy đủ với ansible 1.9.4. Bạn đã sử dụng phiên bản Ansible nào? –

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