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

List 如何在ansible库存文件中将列表值指定为变量?,list,variables,ansible,inventory,List,Variables,Ansible,Inventory,我需要类似(ansible库存文件)的东西: 但是,ansible不将“区域设置”识别为列表 对于复杂变量,最好在host_vars文件而不是清单文件中定义它们,因为host_vars文件支持YAML语法 尝试创建一个包含以下内容的host\u vars/127.0.0.1文件: timezone: Europe/Amsterdam locales: - en_US - nl_NL 您可以自定义筛选器,以将字符串拆分为列表 演示如何创建自定义筛选器。您可以传递如下列表或对象:

我需要类似(ansible库存文件)的东西:


但是,ansible不将“区域设置”识别为列表

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

尝试创建一个包含以下内容的
host\u vars/127.0.0.1
文件:

timezone: Europe/Amsterdam
locales:
    - en_US
    - nl_NL

您可以自定义筛选器,以将字符串拆分为列表


演示如何创建自定义筛选器。

您可以传递如下列表或对象:

[example]
127.0.0.1 timezone="Europe/Amsterdam" locales='["en_US", "nl_NL"]'
你可以试试拆分

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

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

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

[example]
127.0.0.1 timezone="Europe/Amsterdam" locales='["en_US", "nl_NL"]'
是他的原创范例,效果很好

以下变体适用于模板。基本上,如果是字符串,您必须记住使用内部双引号,或者将整个结构解析为单个字符串。如果只是数字或“真”或“假”(不是“是”),那么你很好。在这个变体中,如果模板有外部引号,我无法使它与模板一起工作

除了模板模块之外,我还没有对哪些内部用例进行彻底检查

[example]
127.0.0.1 timezone="Europe/Amsterdam" locales='["en_US", "nl_NL"]'
我使用的是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"]'

我相信情况就是你定义变量的地方

如果是在

[主持人:vars] var=[“a”,“b”]

否则:

[主持人]
host1 var='[“a”,“b”]'

谢谢,这是我当前的工作方式:)您的回答是否意味着您不能在清单文件中指定列表变量(以及--extra vars)?@rmuller我不知道是否可以在ini文件或命令行中指定列表变量。如果你在ansible邮件列表上询问,你可能会得到更快的回复。@rmuller我还建议你跳上#ansible IRC频道,那里的人通常很快就能提供帮助:-)我认为库存中不可能有这种情况。我尝试使用下面带有破折号前缀列表的xyz=时,出现了错误“错误:分配给组的变量必须是key=value形式”。我也想过使用这个方法,但这是一个乏味的方法。尤其是当你有很多站点需要配置时。@ryanyyu它不仅与问题中的代码不同,而且也是OP想要的确切解决方案。你测试过了吗?赖勒做到了,我也做到了:而且它起作用了。这应该是被接受的答案,而不是被否决。是的,也可以证实这是有效的。例如,这适合与“with_items”语句一起使用。您甚至可以像这样创建类似dict的对象。我使用它来定义清单文件中的nginx身份验证用户和密码:nginx_auth='[{“user”:“user1”,“pass”:“pass1”},{“user”:“user2”,“pass”:“pass2”}]'这是ini文件最可能的解决方案吗?如果您有20多个项目和5台主机要配置,该怎么办?我很乐意知道,但这暂时有效。@WillHarris您能在一把钥匙中放入多个项目吗?例如:
{“user”:[“user1”、“user2”]}
?@JohnnyQ取决于您希望如何处理该值。在我的示例中,我将对_items使用
:nginx_auth
,然后作为
{{item.user}
{{item.pass}
访问。在您的示例中,我看不到任何自然的方法可以在将使用
和_items
的上下文中迭代您的值列表。也许您可以使用Jinja2过滤器在模板中进行额外的“列表”处理。这些额外的信息帮助我解决了令人烦恼的任意变量解析问题。谢谢一点额外的信息:我认为这些差异是由于不同的解析路径造成的。在[group:vars]中,所有内容都直接作为INI\u PARSER->YAML\u PARSER传递,包括双引号。因此YAML解析器将其解释为字符串。在一个主机名之后,它经过一个与模块的“equals style”参数类似的解析器:INI\u parser->ANSIBLE\u ARG\u parser->YAML\u parser。在后一种情况下,ANSIBLE_ARG_解析器解释双引号字符串,并将内容(不带引号)传递给YAML解析器。