Добавить цитаты в элементы списка в jinja2 (возможно)
У меня очень простая строка в шаблоне:
ip={{ip|join(', ')}}
И у меня есть список для ip:
ip:
- 1.1.1.1
- 2.2.2.2
- 3.3.3.3
Но приложение хочет IP-адреса с кавычками (ip = '1.1.1.1', '2.2.2.2').
Я могу сделать это вот так:
ip:
- "'1.1.1.1'"
- "'2.2.2.2'"
- "'3.3.3.3'"
Но это очень уродливо. Есть ли хороший способ добавить кавычки к каждому элементу списка в недоступном?
Спасибо!
Ответы
Ответ 1
На самом деле существует очень простой способ достижения этого:
{{ mylist | map('quote') | join(', ') }}
Фильтр map
выполняет итерацию по каждому элементу и позволяет quote
обрабатывать его. Впоследствии вы можете легко join
их вместе.
Ответ 2
Это будет работать:
ip={{ '\"' + ip|join('\", \"') + '\"' }}
Пользовательский плагин фильтра также будет работать. В ansible.cfg раскомментируйте filter_plugins и дайте ему путь, куда мы помещаем это
def wrap(list):
return [ '"' + x + '"' for x in list]
class FilterModule(object):
def filters(self):
return {
'wrap': wrap
}
в файле с именем core.py. Как это Тогда вы можете просто использовать
ip|wrap|join(', ')
И он должен создать разделенный запятыми список с каждым ip, заключенным в кавычки.
Ответ 3
попробовать:
- hosts: localhost
tags: s20
gather_facts: no
vars:
ip:
- 1.1.1.1
- 2.2.2.2
- 3.3.3.3
joined_ip: "'{{ \"', '\".join(ip)}}'"
tasks:
- debug: msg="(ip={{joined_ip}})"
PS: ansible поддерживает немного выполнения кода python в {{}}
, что я и неправильно использую здесь.
Ответ 4
Я разработал собственный wrap
фильтр
def wrap(value, wrapper = '"'):
return wrapper + value + wrapper
class FilterModule(object):
def filters(self):
return {
'wrap': wrap
}
Как вы видите, оболочка настраивается и по умолчанию имеет значение "
Вы можете использовать его таким образом
ip={{ ip | map('wrap') | join(', ') }}
Отказ от ответственности: я питон и незаменимый новичок
Ответ 5
Следующее сработало для меня
('{{ iplist | join('\',\'') }}')
Пример:
Inventory
[ips]
1.1.1.1
2.2.2.2
3.3.3.3
#cat temp.sh.j2
"ips": (ip='{{ groups['zoo'] | join('\',\'') }}')
result:
#cat temp.sh
"ips": (ip='1.1.1.1','2.2.2.2','3.3.3.3')
Надеюсь, это кому-нибудь поможет.
Ответ 6
ПРИМЕЧАНИЕ Это похоже на ответ Kashyap, но мне нужна была немного другая версия: использование его для двойных кавычек каждого элемента в массиве bash), например. Результат должен быть:
SOME_LIST=( "Johnny" "Joey" "Dee Dee" "Tommy" )
Проекты/анзибль/expand_list.yml
---
- hosts: localhost
connection: local
vars:
some_list:
- Johnny
- Joey
- Dee Dee
- Tommy
tasks:
- name: "Expand the ramones band members list."
template:
src: "templates/expand_list.conf.j2"
dest: "/var/tmp/ramones.conf"
проекты/анзибль/шаблоны/expand_list.conf.j2
SOME_LIST=( "{{ '" "'.join(some_list) }}" )
Ответ 7
Я обнаружил, что самый простой способ сделать это с помощью существующего фильтра Ansible - использовать regex_replace
.
{{ ip | map("regex_replace","(.+)","\'\\1\'") | join(',')}}