【发布时间】:2013-09-05 11:54:37
【问题描述】:
我需要类似(ansible 库存文件):
[example]
127.0.0.1 timezone="Europe/Amsterdam" locales="en_US","nl_NL"
但是,ansible 不会将“语言环境”识别为列表。
【问题讨论】:
标签: list variables ansible inventory
我需要类似(ansible 库存文件):
[example]
127.0.0.1 timezone="Europe/Amsterdam" locales="en_US","nl_NL"
但是,ansible 不会将“语言环境”识别为列表。
【问题讨论】:
标签: list variables ansible inventory
你可以像这样传递一个列表或对象:
[example]
127.0.0.1 timezone="Europe/Amsterdam" locales='["en_US", "nl_NL"]'
【讨论】:
{"user":["user1","user2"]}?
with_items: nginx_auth,然后以{{item.user}} 和{{item.pass}} 的身份访问。在您的示例中,我看不到在使用 with_items 的上下文中迭代您的值列表的任何自然方式。也许您可以使用 Jinja2 过滤器在模板中进行额外的“列表”处理。
对于复杂变量,最好在 host_vars 文件中而不是在清单文件中定义它们,因为 host_vars 文件支持 YAML 语法。
尝试创建一个包含以下内容的host_vars/127.0.0.1 文件:
timezone: Europe/Amsterdam
locales:
- en_US
- nl_NL
【讨论】:
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"]'
【讨论】:
你可以试试拆分
#inventory file
[example]
127.0.0.1 timezone="Europe/Amsterdam" locales="en_US","nl_NL"
#role file
---
- debug: msg="{{ item }}"
with_items: locales.split(',')
【讨论】:
我相信这种情况是您定义变量的地方。
如果它在a下
[主机:变量] var=["a", "b"]
否则:
[主持人] host1 var='["a", "b"]'
【讨论】:
带有变量的 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') }}"
【讨论】:
您可以自定义过滤器,将字符串拆分为列表
Github ansible example 展示如何创建自定义过滤器。
【讨论】: