วิธีทำมัลติไลน์เชลล์สคริปต์ใน Ansible


126

ตอนนี้ฉันใช้เชลล์สคริปต์ใน ansible ซึ่งจะอ่านได้ง่ายขึ้นมากถ้ามันอยู่ในหลายบรรทัด

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

ไม่แน่ใจว่าจะอนุญาตสคริปต์แบบหลายบรรทัดในโมดูล Ansible เชลล์ได้อย่างไร


1
ลองพิจารณาใช้คำสั่ง 'สคริปต์' ที่ตอบได้และใช้ไฟล์ภายนอก
Jason

คำตอบ:


274

Ansible ใช้ไวยากรณ์ YAML ใน Playbooks YAML มีตัวดำเนินการบล็อกจำนวนมาก:

  • >เป็นผู้ประกอบการพับบล็อก นั่นคือมันรวมหลายบรรทัดเข้าด้วยกันโดยเว้นวรรค ไวยากรณ์ต่อไปนี้:

    key: >
      This text
      has multiple
      lines
    

    จะกำหนดค่าการThis text has multiple lines\nkey

  • |ตัวละครที่เป็นผู้ประกอบการบล็อกตัวอักษร นี่อาจเป็นสิ่งที่คุณต้องการสำหรับเชลล์สคริปต์แบบหลายบรรทัด ไวยากรณ์ต่อไปนี้:

    key: |
      This text
      has multiple
      lines
    

    จะกำหนดค่าการThis text\nhas multiple\nlines\nkey

คุณสามารถใช้สิ่งนี้สำหรับสคริปต์เชลล์หลายบรรทัดเช่นนี้:

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

มีข้อแม้อย่างหนึ่ง: Ansible ทำการจัดการกับอาร์กิวเมนต์ที่ไม่ดีต่อshellคำสั่งดังนั้นแม้ว่าโดยทั่วไปจะทำงานตามที่คาดไว้ แต่สิ่งต่อไปนี้จะไม่:

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

Ansible จะแสดงข้อความนั้นด้วยช่องว่างนำหน้าซึ่งหมายความว่าเชลล์จะไม่พบสตริงEOFที่จุดเริ่มต้นของบรรทัด คุณสามารถหลีกเลี่ยงการวิเคราะห์พฤติกรรมที่ไม่เป็นประโยชน์ของ Ansible ได้โดยใช้cmdพารามิเตอร์ดังนี้:

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

27
คำตอบที่ยอดเยี่ยม
bryan hunt

18

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

กล่าวถึงความต่อเนื่องของสาย YAML

ดังตัวอย่าง (ลองกับ ansible 2.0.0.2):

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

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

คำสั่งเชลล์ถูกยุบเป็นบรรทัดเดียวเช่นเดียวกับใน ls --color /home


3
ใช่ แต่ในเปลือก>มีความหมายที่เฉพาะเจาะจงมาก ฉันลองแล้ว แต่มันไม่ได้ผลตามที่คาดไว้
Edgar Martinez

6
นั่นคือเหตุผลที่มันอยู่ในบรรทัดแรกไม่ใช่ในบรรทัดถัดไป มันใช้งานได้ดีสำหรับฉันด้วย ansible 2.0 ตามที่ฉันเขียนแม้ว่ามันจะไม่ได้พิมพ์เอาต์พุต ls แบบเต็มด้วย ansible 1.9.4 คุณใช้ Ansible เวอร์ชันใด
Marcello Romani

ลิงค์ตายแล้ว
kenorb

ตั้งแต่ปี 2559 สิ่งเหล่านี้เกิดขึ้น
Marcello Romani

3

การเพิ่มช่องว่างก่อนตัวคั่น EOF ช่วยให้หลีกเลี่ยง cmd:

- shell: |
    cat <<' EOF'
    This is a test.
    EOF
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.