Я использую программно сгенерированные 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: ...
? Если эта структура является чем-то, что может быть надежно сгенерировано только вручную, это в некоторой степени противоречит сути вопроса....
. Если вы посмотрите наlibrary/commands/command
, вы найдете довольно щедр соответствие регулярных выраженийcreates=
,removes=
,chdir=
и так далее. Если вам нужно гарантировать, что любая команда будет пропущена, вам придется написать свой собственный модуль.Об этом говорится в документации Ansible сейчас.
Обратите внимание, что нет параметра с именем «free_form».
источник
args
препятствует анализуk=v
парcommand
, должны ли они существовать? (Если это так, то это решает проблему неоднозначности; в противном случае, похоже, она все еще существует).