如果格式兼容,Ansible会将字符串解析为列表,如何逃避?

时间:2016-10-18 17:23:10

标签: ansible

使用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

1 个答案:

答案 0 :(得分:2)

有些过滤器会阻止Ansible模板引擎进行字符串评估 此过滤器列表存储在STRING_TYPE_FILTERS设置中 在Ansible 2.1中,它包含:stringto_jsonto_nice_jsonto_yamlpprettyjson

所以,你可以这样做:

- 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编码的字符串。