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