2015-04-09 10 views
7

Mam bardzo prostą linię w Szablon:Dodaj cytaty do elemens wykazu w jinja2 (ansibl)

ip={{ip|join(', ')}} 

I mam listy dla IP:

ip: 
- 1.1.1.1 
- 2.2.2.2 
- 3.3.3.3 

Ale aplikacja chce IP z cytaty (ip = "1.1.1.1", "2.2.2.2").

mogę zrobić to tak:

ip: 
- "'1.1.1.1'" 
- "'2.2.2.2'" 
- "'3.3.3.3'" 

Ale to jest bardzo brzydka. Czy jest jakiś fajny sposób na dodanie cudzysłowów do każdego elementu listy w ansiblisku?

Dzięki!

Odpowiedz

10

try:

- 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: ansibl obsługuje trochę wykonanie kodu Pythona wewnątrz {{}}, co jest, co ja tu nadużywania.

+0

Niesamowite! Dziękuję Ci! –

11

to będzie działać:

ip={{ '\"' + ip|join('\", \"' + '\"')}} 

Niestandardowy filtr plugin będzie również działać. W ansible.cfg Odkomentuj filter_plugins i nadać mu ścieżkę, gdzie umieścić ten

def wrap(list): 
    return [ '"' + x + '"' for x in list] 

class FilterModule(object): 
    def filters(self): 
     return { 
      'wrap': wrap 
     } 

w pliku o nazwie core.py. Like this. Następnie można po prostu użyć

ip|wrap|join(', ') 

I powinien produkować oddzielone przecinkami listy z każdego IP owinięte w cudzysłowach.

+0

Działa to jak urok. A jeśli chcesz tego tylko dla jednego projektu/playbooka, po prostu umieść folder "filter_plugins" w swoim projekcie i wywołaj plik, jak już wspomniano, "core.py". – incredibleholg

+1

Czy nie powinno to być 'ip = {{'\"' + ip | join ('\ ", \"') + '\ "'}}'? – LoicAG

1

Mam opracowany własny wrap filtr

def wrap(value, wrapper = '"'): 
    return wrapper + value + wrapper 

class FilterModule(object): 
    def filters(self): 
    return { 
     'wrap': wrap 
    } 

Jak widać wrapper jest konfigurowalny i domyślne do "

można go używać w ten sposób

ip={{ ip | map('wrap') | join(', ') }} 

Zastrzeżone : Jestem pytonem i ansible newbie