Übergeben von Freiformbefehlen an Ansible mithilfe des Formulars für komplexe Argumente


9

Ich verwende programmgesteuert generierte Ansible-Playbooks. Da Playbooks nur YAML sind, ist dies im Allgemeinen unkompliziert. Bei Verwendung des "einfachen" key=valueFormulars sind Playbooks jedoch keine reine YAML- shlexDatei - sie enthalten Inhalte, die in ein analysierbares Formular eingebettet sind.

Um die Mehrdeutigkeit in dieser Form zu vermeiden (ist dieses key=valuePaar ein Argument mit dem Befehl oder ein Argument für ansible?) Und nur ein einziges Format zum Parsen und Generieren zu haben, verwende ich bedingungslos den komplexen Argumentmechanismus, der anhand eines Beispiels im Ansible demonstriert wird -Beispiele Repository .

Dies verwendet eine Syntax der folgenden Art:

action: module-name
args:
  key1: value1
  key2: value2

... was gut und schön ist. Wenn Sie jedoch versuchen, dieses Formular für die Module shelloder zu verwenden command( deren Dokumentation beschreibt, dass der eigentliche Befehl in einem Argument mit dem Namen übergeben wird free_form), funktioniert dies nicht so gut:

action: shell
args:
  free_form: echo hello_world >/tmp/something
  creates: /tmp/something

Beim Aufrufen wird Folgendes ausgeführt:

/bin/sh -c " free_form='echo hello_world >/tmp/something'  "

... was ich nicht erreichen will.

Was ist der richtige Weg, um Ansible-Module zu verwenden, die "Freiform" -Befehle mit reiner YAML-Syntax ausführen?

Antworten:


5

Kurze Antwort: Verwenden Sie nicht den command, raw, scriptoder shellModule. Schreiben Sie Ihr eigenes Modul, das den Befehl als "normales" Argument akzeptiert.

Lange Antwort:

In den meisten Fällen können Sie dies tun:

- shell: echo hello_world > /tmp/something
  args:
    creates: /tmp/something

Dies schlägt jedoch in einigen Randfällen fehl:

- shell: echo hello_world > creates=something
  args:
    creates: creates=something  # The file is named "creates=something"

Ich kenne keinen allgemeinen Weg, um damit umzugehen, aber eine bash-spezifische Lösung ist:

- shell: echo hello_world > "creates=something"
  args:
    creates: creates=something

Gibt es eine Datenstruktur, die ich an einen kompatiblen YAML-Generator übergeben kann, damit dieser ausgegeben wird - shell: ...? Wenn diese Struktur nur von Hand zuverlässig erzeugt werden kann, ist der Punkt der Frage etwas vereitelt.
Charles Duffy

@ CharlesDuffy: Ich glaube nicht, dass du dem ...Teil im Allgemeinen entkommen kannst . Wenn man sich anschaut library/commands/command, werden Sie einen ziemlich großzügig Regex Matching finden creates=, removes=, chdir=, und so weiter. Wenn Sie sicherstellen möchten, dass ein Befehl übergeben werden kann, müssen Sie Ihr eigenes Modul schreiben.
Schneeball

Fair 'nuff. Dies ist meiner Meinung nach ein bedeutendes Designfehler ... aber genau das ist es.
Charles Duffy

0

Dies wird jetzt in der Ansible-Dokumentation behandelt .

# 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

Beachten Sie, dass es keinen Parameter mit dem Namen 'free_form' gibt.


argsVerhindert das Vorhandensein von, dass k=vPaare analysiert werden command, sollte es welche geben? (Wenn ja, wird die Mehrdeutigkeit sauber angesprochen; andernfalls scheint sie noch zu existieren).
Charles Duffy
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.