Добавить цитаты в элементы списка в 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(',')}}