Я использую программно сгенерированные 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: ...
? Если эта структура является чем-то, что может быть надежно сгенерировано только вручную, это в некоторой степени противоречит сути вопроса.