Używam generowanych programowo instrukcji Ansible. Ogólnie rzecz biorąc, ponieważ podręczniki są po prostu YAML, jest to proste. Jednak w przypadku korzystania z „prostej” key=value
formy podręczniki nie są czystym YAML - zawierają treści osadzone w shlex
formie możliwej do przygotowania.
Aby uniknąć dwuznaczności w tej formie (czy jest to key=value
parowanie argumentu z poleceniem czy argumentem ansible?) I posiadanie tylko jednego formatu do parsowania i generowania, bezwarunkowo używam złożonego mechanizmu args pokazanego na przykładzie w ansible -przykładowe repozytorium .
Używa następującej składni:
action: module-name
args:
key1: value1
key2: value2
... co jest dobre i dobre. Jednak podczas próby użycia tego formularza dla modułów shell
lub command
( których dokumentacja opisuje faktyczne polecenie przekazane w argumencie o nazwie free_form
), to nie działa tak dobrze:
action: shell
args:
free_form: echo hello_world >/tmp/something
creates: /tmp/something
Po wywołaniu uruchamia to:
/bin/sh -c " free_form='echo hello_world >/tmp/something' "
... co bardzo nie jest tym, co staram się osiągnąć.
Jaki jest właściwy sposób korzystania z modułów Ansible przyjmujących polecenia „w dowolnej formie” przy użyciu czystej składni YAML?
- shell: ...
? Jeśli ta struktura jest czymś, co można wiarygodnie wygenerować tylko ręcznie, to w pewien sposób przeczy to pytaniu....
w ogóle. Jeśli spojrzećlibrary/commands/command
, znajdziesz dość hojne dopasowanie regexcreates=
,removes=
,chdir=
, i tak dalej. Jeśli chcesz zagwarantować, że jakiekolwiek polecenie zostanie przekazane, musisz napisać własny moduł.Zostało to teraz rozwiązane w dokumentacji Ansible .
Zauważ, że nie ma parametru o nazwie „free_form”.
źródło
args
zapobiegak=v
analizowaniu parcommand
, czy powinna istnieć? (Jeśli tak, to czysto rozwiązuje to dwuznaczność; w przeciwnym razie wydaje się, że nadal istnieje).