Я использую программно сгенерированные пьесы Ansible. В общем, поскольку playbook - это просто YAML, это просто. Однако при использовании «простого» key=value
форма, пьесы не чистый YAML - они включают контент, встроенный в shlex
-разборная форма.
Чтобы избежать двусмысленности в этой форме (это что key=value
связать аргумент команды или аргумент для возможности?) и иметь только один формат для синтаксического анализа и генерации, я безоговорочно использую сложный механизм аргументов, продемонстрированный на примере в репозиторий ansible-examples.
Здесь используется синтаксис следующего вида:
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?
Короткий ответ: Не используйте command
, raw
, script
, или shell
модули. Напишите свой собственный модуль, который принимает команду как «нормальный» аргумент.
Длинный ответ:
В большинстве случаев это можно сделать:
- shell: echo hello_world > /tmp/something
args:
creates: /tmp/something
Однако в некоторых крайних случаях это не удается:
- shell: echo hello_world > creates=something
args:
creates: creates=something # The file is named "creates=something"
Я не знаю общего способа справиться с этим, но решение для bash:
- shell: echo hello_world > "creates=something"
args:
creates: creates=something
Это рассматривается в 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
Обратите внимание, что нет параметра с именем 'free_form'.