我有一个 ansible 列表值:
hosts = ["site1", "site2", "site3"]
如果我尝试这个:
hosts | join(", ")
我得到:
site1, site2, site3
但我想得到:
"site1", "site2", "site3"
您只需将其加上引号即可。只需确保整个表达式用引号引起来即可获得左外引号和右外引号。根据您的情况:
"{{ hosts | join('", "') }}"
或
'"' + hosts | join('", "') + '"'
或
"'\"' + hosts | join('\", \"') + '\"'"
此解决方案的缺点是,如果列表为空,则外部引号将保留。
如果列表为空,则先前的答案将留下
""
。还有另一种方法可能更稳健,例如用于将连接列表作为字符串分配给不同的变量(带单引号的示例):
{{ hosts | map("regex_replace","(.+)","\'\\1\'") | join(',')}}
Ansible 的过滤器中有
to_json
、to_nice_json
或 to_yaml
:
{{ some_variable | to_json }}
{{ some_variable | to_yaml }}
如果您输出 JSON/YAML 甚至(这有点厚颜无耻,但 JSON 大多数情况下都有效)Python 配置文件(即 Django 设置),这很有用。
来自 json 文件 file_name.json 数组,如下所示
"hosts": [
"site1",
"site2",
"site3"
]
从 json 文件设置_fact
- name: Set variables from parameters file
set_fact:
vars_from_json: "{{ lookup('file', 'file_name.json') | from_json }}"
使用带双引号和逗号的连接,并用双引号括起来
- name: Create host list
set_fact:
host_list: "{{ '\"' + vars_from_json.hosts | join('\"'', ''\"') + '\"' }}"