Я использую программно сгенерированные Ansible playbooks. В общем, потому что пьесы просто YAML, это просто. Однако при использовании «простой» key=valueформы playbooks не являются чистым YAML - они включают в себя контент, встроенный в shlexформу -parsable.
Чтобы избежать неоднозначности в этой форме (это key=valueпара аргумент команды или аргумент для ansible?), И иметь только один формат для анализа и генерации, я безоговорочно использую механизм сложных аргументов, продемонстрированный на примере в 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?
- shell: ...? Если эта структура является чем-то, что может быть надежно сгенерировано только вручную, это в некоторой степени противоречит сути вопроса.