Passando i comandi in formato libero ad Ansible usando il modulo complex-args


9

Sto usando i playbook Ansible generati programmaticamente. In generale, poiché i playbook sono solo YAML, questo è semplice. Tuttavia, quando si utilizza il key=valuemodulo "semplice" , i playbook non sono YAML puri, ma includono contenuti incorporati in un shlexmodulo consultabile.

Per evitare l'ambiguità in questa forma (quella key=valuecoppia è un argomento al comando o un argomento per ansible?), E ho solo un singolo formato per analizzare e generare, sto usando incondizionatamente il complesso meccanismo args dimostrato dall'esempio in ansible -expository repository .

Questo utilizza una sintassi del seguente tipo:

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

... che va bene. Tuttavia, quando si tenta di utilizzare questo modulo per i moduli shello command(la cui documentazione descrive il comando effettivo come passato in un argomento denominato free_form), questo non funziona così bene:

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

Quando viene richiamato, viene eseguito quanto segue:

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

... che non è quello che sto cercando di realizzare.

Qual è il modo giusto di utilizzare i moduli Ansible che prendono comandi "in formato libero" usando la sintassi YAML pura?

Risposte:


5

Risposta breve: non si utilizza il command, raw, script, o shellmoduli. Scrivi il tuo modulo che accetta il comando come argomento "normale".

Risposta lunga:

Nella maggior parte dei casi, puoi farlo:

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

Tuttavia, ciò non riesce in alcuni casi limite:

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

Non conosco un modo generale per gestirlo, ma una soluzione specifica per bash è:

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

Esiste una struttura di dati che posso trasmettere a qualsiasi generatore YAML conforme per emetterlo - shell: ...? Se questa struttura è qualcosa che può essere generato in modo affidabile solo a mano, ciò in qualche modo sconfigge il punto della domanda.
Charles Duffy,

@CharlesDuffy: non credo che tu possa sfuggire alla ...parte in generale. Se si guarda library/commands/command, troverete una bella generosa corrispondenza espressione regolare creates=, removes=, chdir=, e così via. Se devi garantire che qualsiasi comando possa essere passato, dovrai scrivere il tuo modulo.
Snowball,

Discreto. Questo è, a mio avviso, un significativo malfunzionamento del design ... ma, beh, è ​​quello che è.
Charles Duffy,

0

Questo è ora affrontato nella documentazione di Ansible .

# 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

Si noti che non esiste alcun parametro denominato "free_form".


La presenza di argsimpedisce k=vdi analizzare le coppie command, dovrebbe esistere? (In tal caso, questo risolve l'ambiguità in modo pulito; altrimenti, sembrerebbe esistere ancora).
Charles Duffy,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.