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