如何在ansible库存文件中将列表值指定为变量?

rmu*_*ler 42 variables list inventory ansible

我需要像(安全库存文件)这样的东西:

[example]
127.0.0.1 timezone="Europe/Amsterdam" locales="en_US","nl_NL"
Run Code Online (Sandbox Code Playgroud)

但是,ansible不会将"locales"识别为列表.

Ryl*_*ury 85

您可以传递这样的列表或对象:

[example]
127.0.0.1 timezone="Europe/Amsterdam" locales='["en_US", "nl_NL"]'
Run Code Online (Sandbox Code Playgroud)

  • @ryanyuyu它不仅与问题中的代码不同,它也是OP寻找的确切解决方案.你测试过吗?莱勒做了,我也这样做了.它有效.这应该是公认的答案,而不是投票. (11认同)
  • 是的,也可以确认这是有效的.例如,这适用于使用"with_items"语句.你甚至可以像这样创建类似dict的对象.我使用它来定义库存文件中的nginx身份验证用户和密码:nginx_auth ='[{"user":"user1","pass":"pass1"},{"user":"user2","pass": "PASS2"}]" (6认同)

Lor*_*ein 24

对于复杂变量,最好在host_vars文件而不是清单文件中定义它们,因为host_vars文件支持YAML语法.

尝试host_vars/127.0.0.1使用以下内容创建文件:

timezone: Europe/Amsterdam
locales:
    - en_US
    - nl_NL
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这是我当前的工作方式:)您的答案是否意味着您无法在库存文件(和 --extra-vars)中指定列表变量? (2认同)

Spa*_*rky 11

Ryler在这个具体案例中的答案很好,但我在使用模板模块的其他变体时遇到了问题.

[example]
127.0.0.1 timezone="Europe/Amsterdam" locales='["en_US", "nl_NL"]'
Run Code Online (Sandbox Code Playgroud)

是他原来的例子并且工作正常.

以下变体适用于模板.基本上如果它是一个字符串,你必须记住使用内部双引号或整个结构被解析为一个字符串.如果它只是数字或"真"或"假"(不是"是")那么你就没事了.在此变体中,如果它具有外部引号,则无法使其与模板一起使用.

我没有详细检查他们做了哪些内部用例,除了模板模块之外没有破坏.

我正在使用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"]'
Run Code Online (Sandbox Code Playgroud)


小智 6

你可以试试拆分

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

#role file
---
- debug: msg="{{ item }}"
  with_items: locales.split(',')
Run Code Online (Sandbox Code Playgroud)