web-dev-qa-db-ja.com

Ansible Inventoryファイルで変数としてリスト値を指定するにはどうすればよいですか?

次のようなものが必要です(ansible inventory file):

[example]
127.0.0.1 timezone="Europe/Amsterdam" locales="en_US","nl_NL"

ただし、ansibleは「ロケール」をリストとして認識しません。

40
rmuller

次のようなリストまたはオブジェクトを渡すことができます。

[example]
127.0.0.1 timezone="Europe/Amsterdam" locales='["en_US", "nl_NL"]'
81

Host_varsファイルはYAML構文をサポートしているため、複雑な変数では、インベントリファイルではなくHost_varsファイルで定義するのが最適です。

次の内容のHost_vars/127.0.0.1ファイルを作成してみてください。

timezone: Europe/Amsterdam
locales:
    - en_US
    - nl_NL
23
Lorin Hochstein

Rylerの答えはこの特定のケースでは良いのですが、テンプレートモジュールで他のバリエーションを使用すると問題が発生しました。

[example]
127.0.0.1 timezone="Europe/Amsterdam" locales='["en_US", "nl_NL"]'

彼の元の例であり、正常に動作します。

次のバリエーションがテンプレートで機能します。基本的に、文字列の場合は、内部二重引用符を使用することを忘れないでください。そうしないと、構造全体が単一の文字列として解析されます。数字のみ、または「True」または「False」(「yes」ではない)の場合は、問題ありません。このバリエーションでは、外部引用符がある場合、テンプレートで動作させることができませんでした。

テンプレートモジュール以外の、どの内部ユースケースが実行し、破損しないかを徹底的に確認したことはありません。

Ansible 2.2.1を使用しています。

[example:vars]
# these work
myvar1=["foo", "bar"]
myvar2=[1,2]
myvar3=[True,False]

# These fail, they get interpreted as a single string.
myvar4=[yes, no]
myvar5=[foo,bar]
myvar6='["foo", "bar"]'
10
Sparky

あなたは分割してみることができます

#inventory file
[example]
127.0.0.1 timezone="Europe/Amsterdam" locales="en_US","nl_NL"

#role file
---
- debug: msg="{{ item }}"
  with_items: locales.split(',')
6
jollychang