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

时间:2013-09-02 11:24:48

标签: list variables ansible inventory

我需要类似(安全库存文件):

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

但是,ansible不会将“locales”识别为列表。

7 个答案:

答案 0 :(得分:78)

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

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

答案 1 :(得分:23)

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

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

timezone: Europe/Amsterdam
locales:
    - en_US
    - nl_NL

答案 2 :(得分:7)

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

[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"]'

答案 3 :(得分: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(',')

答案 4 :(得分:0)

我相信这种情况是您定义变量的地方。

如果它在一个

[主机:变量] var=["a", "b"]

否则:

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

答案 5 :(得分:0)

带有变量的 INI 文件看起来像这样

$ cat ./vars/vars.yml

lvol_names=['2g-1','2g-2','2g-3']

变量代表列表类型

 lvol_names:
       - 2g-1
       - 2g-2
       - 2g-3

可以通过查找从剧本中读取变量:

$ cat ./play.yml

- name: play1
  hosts: kub2_data_nodes
  become: yes


  vars:
 
     - lvol_names: "{{ lookup('ini', 'lvol_names type=properties file=./vars/vars.yml') }}"
     

答案 6 :(得分:-2)

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

Github ansible example显示了如何创建自定义过滤器。