การส่งคำสั่งแบบฟรีฟอร์มไปยัง Ansible โดยใช้แบบฟอร์ม args แบบซับซ้อน


9

ฉันใช้เพลย์บุ๊ค Ansible ที่สร้างขึ้นโดยใช้โปรแกรม โดยทั่วไปเนื่องจาก playbooks เป็นเพียง YAML นี่เป็นเรื่องง่าย อย่างไรก็ตามเมื่อใช้key=valueแบบฟอร์ม" แบบง่าย" playbooks จะไม่ใช่ YAML ที่แท้จริง - ซึ่งรวมถึงเนื้อหาที่ฝังอยู่ในshlexรูปแบบ -parsable

เพื่อหลีกเลี่ยงความคลุมเครือในรูปแบบนี้ (เป็นkey=valueคู่ที่โต้แย้งกับคำสั่งหรืออาร์กิวเมนต์สำหรับ ansible?) และมีเพียงรูปแบบเดียวในการแยกและสร้างฉันไม่มีเงื่อนไขโดยใช้กลไก args ซับซ้อนแสดงตัวอย่างในansible พื้นที่เก็บข้อมูลตัวอย่าง

สิ่งนี้ใช้ไวยากรณ์ของชนิดต่อไปนี้:

action: module-name
args:
  key1: value1
  key2: value2

... ซึ่งดีและดี อย่างไรก็ตามเมื่อพยายามที่จะใช้แบบฟอร์มนี้สำหรับโมดูลshellหรือcommand( ซึ่งเอกสารอธิบายคำสั่งที่แท้จริงว่าถูกส่งผ่านในการโต้แย้งชื่อfree_form) สิ่งนี้ทำงานได้ไม่ดี:

action: shell
args:
  free_form: echo hello_world >/tmp/something
  creates: /tmp/something

เมื่อเรียกใช้สิ่งนี้จะทำงานต่อไปนี้:

/bin/sh -c " free_form='echo hello_world >/tmp/something'  "

... ซึ่งไม่ใช่สิ่งที่ฉันพยายามจะทำ

อะไรคือวิธีที่เหมาะสมในการใช้โมดูล Ansible ที่ใช้คำสั่ง "รูปแบบอิสระ" โดยใช้ไวยากรณ์ YAML บริสุทธิ์

คำตอบ:


5

คำตอบสั้น:อย่าใช้command, raw, scriptหรือshellโมดูล เขียนโมดูลของคุณเองที่ยอมรับคำสั่งเป็นอาร์กิวเมนต์ "ปกติ"

คำตอบยาว:

ในกรณีส่วนใหญ่คุณสามารถทำสิ่งนี้:

- shell: echo hello_world > /tmp/something
  args:
    creates: /tmp/something

อย่างไรก็ตามสิ่งนี้ล้มเหลวในบางกรณีของขอบ:

- shell: echo hello_world > creates=something
  args:
    creates: creates=something  # The file is named "creates=something"

ฉันไม่ทราบวิธีทั่วไปในการจัดการสิ่งนี้ แต่โซลูชันเฉพาะของ bash คือ:

- shell: echo hello_world > "creates=something"
  args:
    creates: creates=something

มีโครงสร้างข้อมูลที่ฉันสามารถส่งต่อไปยังตัวสร้าง YAML ที่เป็นไปตามมาตรฐานเพื่อให้ปล่อยออกมาได้- shell: ...หรือไม่? หากโครงสร้างนี้เป็นสิ่งที่สามารถสร้างขึ้นด้วยมือได้อย่างน่าเชื่อถือซึ่งจะเอาชนะประเด็นของคำถามได้
Charles Duffy

@CharlesDuffy: ฉันไม่คิดว่าคุณจะสามารถหลบหนี...ส่วนนี้ได้ ถ้าคุณดูที่library/commands/commandคุณจะได้พบกับการจับคู่ regex ใจกว้างสวยcreates=, removes=, chdir=และอื่น ๆ หากคุณต้องการรับประกันว่าคำสั่งใด ๆสามารถส่งผ่านได้คุณจะต้องเขียนโมดูลของคุณเอง
สโนว์บอล

พอใช้ ' นี่คือความคิดของฉันการออกแบบที่สำคัญผิดพลาด แต่ที่จริงแล้วมันคืออะไร
Charles Duffy

0

สิ่งนี้ได้รับการแก้ไขในเอกสารประกอบการบรรยายในขณะนี้

# You can also use the 'args' form to provide the options. This command
# will change the working directory to somedir/ and will only run when
# /path/to/database doesn't exist.
- command: /usr/bin/make_database.sh arg1 arg2
  args:
    chdir: somedir/
    creates: /path/to/database

โปรดทราบว่าไม่มีพารามิเตอร์ชื่อ 'free_form'


การปรากฏตัวของการargsป้องกันk=vคู่จากการแยกออกจากcommandควรมีอยู่หรือไม่? (หากเป็นเช่นนั้นสิ่งนี้จะจัดการกับความคลุมเครืออย่างหมดจดมิฉะนั้นจะยังคงมีอยู่)
Charles Duffy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.