使用ansible,我需要将一个主机列表放在一个文件中,如下所示:
["127.0.0.1", "127.0.0.2", "127.0.0.3"]
但每当我实现这种格式时,ansible会将其解释为列表,文件内容为此pythonic版本:
['127.0.0.1', '127.0.0.2', '127.0.0.3']
到目前为止,我尝试了解它:
---
- hosts: all
gather_facts: False
tasks:
- set_fact:
myhosts:
- 127.0.0.1
- 127.0.0.2
- 127.0.0.3
# This comes out as a list, I need a string
- set_fact:
var: "[ \"{{ myhosts | join('\", \"')}}\" ]"
- debug: var=var
# This comes out as a string, but I need no underscore on it
- set_fact:
var: "_[ \"{{ myhosts | join('\", \"')}}\" ]"
- debug: var=var
# This also comes out as a list
- set_fact:
var: >
[ "{{ myhosts | join('", "')}}" ]
- debug: var=var
# Also parsed as a list
- set_fact:
var: "{{ myhosts | to_json }}"
- debug: var=var
# ansible-playbook -i "localhost," this_file.yml
答案 0 :(得分:2)
有些过滤器会阻止Ansible模板引擎进行字符串评估
此过滤器列表存储在STRING_TYPE_FILTERS设置中
在Ansible 2.1中,它包含:string
,to_json
,to_nice_json
,to_yaml
,ppretty
,json
。
所以,你可以这样做:
- lineinfile: line="{{ myhosts | to_json }}" dest=output.txt
这会将["127.0.0.1", "127.0.0.2", "127.0.0.3"]
行添加到文件中。
在处理确切的字符串格式时,不要相信debug
的输出。
始终使用copy: content="{{ string_output_to_test | string }}" dest=test.txt
并检查文件内容以确定。
debug: var=myvar
将始终使用评估模板,因此您的字符串将始终打印为列表
debug: msg="{{ myvar | string }}"
会将myvar
打印为JSON编码的字符串。