web-dev-qa-db-fra.com

Ajouter des guillemets aux éléments de la liste dans jinja2 (ansible)

J'ai une ligne très simple dans le modèle:

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

Et j'ai la liste pour ip:

ip:
 - 1.1.1.1
 - 2.2.2.2
 - 3.3.3.3

Mais l'application veut des IP avec des guillemets (ip = '1.1.1.1', '2.2.2.2').

Je peux le faire comme ça:

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

Mais c'est très moche. Existe-t-il un moyen agréable d’ajouter des guillemets sur chaque élément de la liste en ansible?

Merci!

11
George Shuklin

En réalité, il existe une méthode très simple pour y parvenir:

{{ mylist | map('quote') | join(', ') }}

Le filtre map parcourt chaque élément et laisse quote le traiter. Ensuite, vous pouvez facilement join les réunir.

5
Max

Cela fonctionnera:

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

Un plugin de filtre personnalisé fonctionnera également. Dans ansible.cfg décommentez filter_plugins et donnez-lui un chemin,

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

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

dans un fichier appelé core.py. Comme ça . Ensuite, vous pouvez simplement utiliser

ip|wrap|join(', ')

Et il devrait produire une liste séparée par virgule avec chaque adresse IP entourée de guillemets.

13
Zasz

essayer:

- 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 prend en charge un peu d’exécution de code python dans {{}}, ce que j’utilise mal ici.

11
Kashyap

J'ai développé un filtre personnalisé wrap

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

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

Comme vous pouvez le constater, le wrapper est personnalisable et sa valeur par défaut est "

Vous pouvez l'utiliser de cette façon

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

Disclaimer : Je suis un novice ansible et python

1

NOTECeci est similaire à la réponse de Kashyap, mais j'avais besoin d'une version légèrement différente: l'utiliser pour mettre entre guillemets chaque élément d'un tableau bash), par exemple. le résultat devrait être:

SOME_LIST=( "Johnny" "Joey" "Dee Dee" "Tommy" )

projects/ansible/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"

projects/ansible/templates/expand_list.conf.j2

SOME_LIST=( "{{ '" "'.join(some_list) }}" )
0

Suivre a travaillé pour moi

('{{ iplist | join('\',\'') }}')

Ex:

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')

J'espère que ça aiderait quelqu'un.

0
f-society