Ansible parses strings as lists if the format is c

2020-04-21 05:27发布

问题:

Using ansible, I need to put a list of hosts in line in a file like so:

["127.0.0.1", "127.0.0.2", "127.0.0.3"]

But whenever I achieve this format, ansible interprets it as a list and the content of the file is this pythonic version:

['127.0.0.1', '127.0.0.2', '127.0.0.3']

Here's my attempts to get it out thus far:

---

- 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:

There are some filters that prevent Ansible template engine from doing string evaluation.
This list of filters is stored in STRING_TYPE_FILTERS setting.
In Ansible 2.1 it contains: string, to_json, to_nice_json, to_yaml, ppretty, json.

So, you can do this:

- lineinfile: line="{{ myhosts | to_json }}" dest=output.txt

This will add ["127.0.0.1", "127.0.0.2", "127.0.0.3"] line to the file.

And don't believe debug's output when dealing with exact string formatting.
Always use copy: content="{{ string_output_to_test | string }}" dest=test.txt and check file contents to be sure.

debug: var=myvar will always template with evaluation, so your string will always be printed as a list.
debug: msg="{{ myvar | string }}" will print myvar as JSON encoded string.



标签: ansible