複雑な引数のフォームを使用して自由形式のコマンドをAnsibleに渡す


9

プログラムで生成されたAnsibleプレイブックを使用しています。一般的に、プレイブックは単なるYAMLであるため、これは簡単です。ただし、「シンプルな」key=valueフォームを使用する場合、プレイブック純粋なYAML ではなくshlex解析可能なフォームに埋め込まれたコンテンツが含まれます。

この形式のあいまいさを回避し(key=valueコマンドの引数またはansibleの引数をペアにしていますか?)、解析および生成するフォーマットが1つしかないため、無条件に例で示されている複雑な引数メカニズムを無条件に使用しています-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'  "

...これは、私が達成しようとしていることではありません。

純粋なYAML構文を使用して「自由形式」のコマンドを取得するAnsibleモジュールを使用する正しい方法は何ですか?

回答:


5

短い答え:は使用しないcommandrawscript、または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: ...ますか?この構造が手作業でのみ確実に生成できるものである場合、それは問題の要点をいくらか無効にします。
Charles Duffy、2014年

@CharlesDuffy:...一般的にこの部分を脱出できるとは思いません。あなたが見ればlibrary/commands/command、あなたはかなり寛大な正規表現のマッチングを見つけることができますcreates=removes=chdir=、など。あなたが保証する必要がある場合は任意のコマンドが通過することができ、独自のモジュールを記述する必要があります。
スノーボール2014年

フェアナフ。これは、私の考えでは、設計上の重大な機能の誤りです...しかし、まあ、それはそれです。
Charles Duffy

0

これは現在、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'という名前のパラメーターがないことに注意してください。


んの存在argsを防止するk=vから解析されるのペアはcommand、任意の存在するべき?(もしそうなら、これは曖昧さをきれいに扱います;そうでなければ、それはまだ存在しているようです)。
Charles Duffy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.