Melewati perintah bentuk bebas ke Ansible menggunakan formulir kompleks-args

9

Saya menggunakan buku pedoman yang dimungkinkan secara programatik. Secara umum, karena playbook hanya YAML, ini mudah. Namun, saat menggunakan key=valueformulir "sederhana" , playbook tidak murni YAML - mereka memasukkan konten yang disematkan shlexformulir yang dapat dipecah.

Untuk menghindari ambiguitas dalam formulir ini (apakah key=valuememasangkan argumen dengan perintah atau argumen untuk kemungkinan?), Dan hanya memiliki satu format untuk diuraikan dan dibuat, saya tanpa syarat menggunakan mekanisme argumen kompleks yang ditunjukkan dengan contoh dalam ansible repositori -contoh .

Ini menggunakan sintaks dari jenis berikut:

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

... yang bagus dan bagus. Namun, ketika mencoba menggunakan formulir ini untuk modul shellatau command( yang dokumentasinya menggambarkan perintah aktual yang diteruskan dalam argumen bernama free_form), ini tidak berfungsi dengan baik:

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

Ketika dipanggil, ini dijalankan sebagai berikut:

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

... yang bukan apa yang ingin saya capai.

Apa cara yang benar untuk menggunakan Modul yang memungkinkan mengambil perintah "bentuk bebas" menggunakan sintaks YAML murni?

Charles Duffy
sumber

Jawaban:

5

Jawaban singkat: Jangan menggunakan command, raw, script, atau shellmodul. Tulis modul Anda sendiri yang menerima perintah sebagai argumen "normal".

Jawaban panjang:

Dalam kebanyakan kasus, Anda dapat melakukan ini:

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

Namun, ini gagal dalam beberapa kasus tepi:

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

Saya tidak tahu cara umum untuk menangani ini, tetapi solusi spesifik bash adalah:

- shell: echo hello_world > "creates=something"
  args:
    creates: creates=something
Semakin bertambah
sumber
Apakah ada struktur data yang bisa saya berikan ke generator YAML yang sesuai untuk membuatnya dipancarkan - shell: ...? Jika struktur ini adalah sesuatu yang hanya dapat dihasilkan secara andal dengan tangan, itu agak mengalahkan inti pertanyaan.
Charles Duffy
@CharlesDuffy: Saya rasa Anda tidak bisa lepas dari ...peran secara umum. Jika Anda melihat library/commands/command, Anda akan menemukan regex yang cocok cukup murah hati creates=, removes=, chdir=, dan sebagainya. Jika Anda perlu memastikan perintah apa pun dapat dilewati, Anda harus menulis modul Anda sendiri.
Bola Salju
Adil. Ini adalah, dalam pikiran saya, kesalahan desain yang signifikan ... tapi, yah, memang begitu.
Charles Duffy
0

Ini dibahas dalam dokumentasi Ansible sekarang.

# 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

Perhatikan bahwa tidak ada parameter bernama 'free_form'.

Christian Long
sumber
Apakah kehadiran argsmencegahk=v pasangan tidak diuraikan command, haruskah ada? (Jika demikian, ini mengatasi ambiguitas dengan bersih; jika tidak, tampaknya masih ada).
Charles Duffy