Передача команд вільної форми до Ansible, використовуючи складну форму args


9

Я використовую програматично створені іграшки Ansible. Взагалі, оскільки ігрові книги - це лише YAML, це прямо. Однак, використовуючи "просту" key=valueформу, ігрові книжки не є чистою YAML - вони містять вміст, вбудований у shlexформу, що є частковою.

Щоб уникнути неоднозначності в цій формі (це 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?

Відповіді:


5

Коротка відповідь: Не використовуйте 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

Чи є структура даних, яку я можу передати будь-якому сумісному генератору YAML, щоб змусити її випромінювати - shell: ...? Якщо ця структура є чимось, що можна надійно генерувати лише вручну, це дещо перемагає суть питання.
Чарльз Даффі

@CharlesDuffy: Я не думаю, що ти можеш уникнути ...частини взагалі. Якщо ви подивіться на library/commands/command, ви знайдете досить щедрий відповідність регулярних виразів creates=, removes=, chdir=і так далі. Якщо вам потрібно гарантувати, що будь-яка команда може бути передана, вам доведеться написати власний модуль.
Сніжок

Справедливий нюх. Це, на мій погляд, значна дизайнерська невдача… але, ну, це є.
Чарльз Даффі

0

Про це йдеться у відповідної документації зараз.

# 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".


Чи має наявність пар, які argsперешкоджають k=vрозбору пар command, повинні існувати? (Якщо так, це чітко вирішує двозначність; інакше, здавалося б, вона все ще існує).
Чарльз Даффі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.