Ansible анализирует строки как списки, если формат совместим, как экранировать?

#ansible

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

Есть некоторые фильтры, которые не позволяют движку шаблонов 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.