Назад | Перейти на главную страницу

Передача команд произвольной формы в Ansible с использованием формы со сложными аргументами

Я использую программно сгенерированные пьесы 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'.