54

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

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

但是,ansible 不会将“语言环境”识别为列表。

4

7 回答 7

100

You can pass a list or object like this:

[example]
127.0.0.1 timezone="Europe/Amsterdam" locales='["en_US", "nl_NL"]'
于 2015-03-20T20:03:56.303 回答
30

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

尝试创建一个host_vars/127.0.0.1包含以下内容的文件:

timezone: Europe/Amsterdam
locales:
    - en_US
    - nl_NL
于 2013-09-02T21:34:30.690 回答
17

在这种特定情况下,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"]'
于 2017-01-26T14:18:01.097 回答
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(',')
于 2015-05-06T09:52:13.427 回答
0

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

如果它在一个

[主机:vars] var=["a", "b"]

否则:

[主机] host1 var='["a", "b"]'

于 2021-01-29T12:19:38.627 回答
0

带有变量的 INI 文件如下所示

$ cat ./vars/vars.yml

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

变量代表列表类型

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

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

$猫./play.yml

- name: play1
  hosts: kub2_data_nodes
  become: yes


  vars:
 
     - lvol_names: "{{ lookup('ini', 'lvol_names type=properties file=./vars/vars.yml') }}"
     
于 2021-07-03T22:26:47.990 回答
-2

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

Github ansible 示例展示了如何创建自定义过滤器。

于 2014-04-04T12:01:09.657 回答