Передача команд свободной формы в 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".

Другие вопросы по тегам