Làm thế nào để thực hiện multiline shell script trong Ansible


125

ngay bây giờ tôi đang sử dụng một tập lệnh shell ở dạng ansible sẽ dễ đọc hơn nhiều nếu nó nằm trên nhiều dòng

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

Chỉ không chắc chắn về cách cho phép tập lệnh nhiều dòng trong mô-đun Ansible shell


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

Câu trả lời:


273

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

  • Đây >là một nhà điều hành khối gấp. Nghĩa là, nó nối nhiều dòng với nhau bằng dấu cách. Cú pháp sau:

    key: >
      This text
      has multiple
      lines

    Sẽ gán giá trị This text has multiple lines\ncho key.

  • |tự là một toán tử khối theo nghĩa đen. Đây có thể là những gì bạn muốn cho các tập lệnh 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\ncho key.

Bạn có thể sử dụng điều này cho các tập lệnh shell đa dòng như sau:

- 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 cảnh báo: Ansible thực hiện một số thao tác linh hoạt đối với shelllệnh, do đó, mặc dù những điều trên thường hoạt động như mong đợi, nhưng 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 khoảng trắng ở đầu, có nghĩa là trình bao sẽ không bao giờ tìm thấy chuỗi EOFở đầu dòng. Bạn có thể tránh những kinh nghiệm vô ích của Ansible bằng cách sử dụng cmdtham số như sau:

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

27
Fantastic câu trả lời
bryan săn

18

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

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

Ví dụ (thử với ansible 2.0.0.2):

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

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

Lệnh shell được thu gọn thành một dòng, như trong ls --color /home


3
Vâng, nhưng trong vỏ >có một ý nghĩa rất cụ thể. Tôi đã thử điều này và nó không hoạt động như mong đợi.
Edgar Martinez

6
Đó là lý do tại sao nó chỉ nằm ở dòng đầu tiên, không phải ở những dòng tiếp theo. Nó hoạt động tốt với tôi với ansible 2.0 như tôi đã viết, mặc dù nó không in ra toàn bộ đầu ra ls với ansible 1.9.4. Bạn đã sử dụng phiên bản Ansible nào?
Marcello Romani

Liên kết đã chết.
kenorb

Đó là từ năm 2016, những điều này xảy ra.
Marcello Romani

3

Thêm khoảng trắng trước dấu phân tách EOF cho phép tránh cmd:

- shell: |
    cat <<' EOF'
    This is a test.
    EOF
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.