2017-10-04 3 views
0

Donc, je n'arrive pas à contourner ce problème frustrant et je me demande si quelqu'un ici a des idées. J'ai un modèle Jinja qui crache une longue liste d'adresses IP dans un format de fichier de configuration. Cela fonctionne bien. Le problème est que lorsque j'ai un client avec plus d'une adresse IP stockée à son nom, le modèle, plutôt que d'enregistrer cette nouvelle adresse IP sur une nouvelle ligne, ajoute simplement le deuxième IP sur le premier et met une ligne avec deux Adresses IP jointes ensemble. Ce n'est bien sûr pas idéal. Voici le modèle Jinja J'utilise:Utilisation des variables YAML listées pour les templates de Jinja

{% for cust, config in customers.items()%} 
{% raw %}#{% endraw %} {{ cust }} - {{ config['type'] }} 
-A INPUT -s {{ config['ipaddr'] }} -p tcp -m state --state NEW -m tcp --dport {{config['accept']}} ACCEPT 
{% endfor %} 

Et voici les variables fichier à partir de laquelle le modèle prend les valeurs:

BTG-VELOCITY: 
    type: PBSTP 
    accept: 32500 
    connect: 33500 
    ipaddr: 
     196.167.203.65 
     192.167.203.65 
    subtype: OUTBOUND 
GFAM: 
    type: SPOT 
    accept: 32501 
    connect: 33501 
    ipaddr: 192.168.563.20 
    subtype: AMOUNT 
GUANFABANK: 
    type: SPOT 
    accept: 32503 
    connect: 33503 
    ipaddr: 192.168.563.40 
    subtype: STACKED 
MAINBANK: 
    type: FWD 
    accept: 32504 
    connect: 33504 
    ipaddr: 192.167.203.02 
    subtype: TIERED 
TEST-BANK: 
    type: PBSTP 
    accept: 32506 
    connect: 33506 
    ipaddr: 192.167.203.92 
    subtype: INBOUND 
SESH: 
    type: SPOT 
    accept: 32508 
    connect: 33508 
    ipaddr: 192.167.203.63 
    subtype: TIERED 

Le problème est avec le client BTG-VELOCITY ' . Le modèle recrache une ligne comme celui-ci

-A INPUT -s 192.168.563.20 196.168.563.20 -p tcp -m state --state NEW -m tcp --dport 32501 ACCEPT 

Plutôt que les deux lignes désirées comme celui-ci:

-A INPUT -s 192.168.563.20 -p tcp -m state --state NEW -m tcp --dport 32501 ACCEPT 
-A INPUT -s 196.168.563.20 -p tcp -m state --state NEW -m tcp --dport 32501 ACCEPT 
+0

Pourquoi ne pas ajouter une boucle imbriquée pour itérer sur des adresses IP? –

+0

J'ai essayé mais j'ai peut-être mal fait. Quand je l'ai fait, j'ai fini par faire un énorme fichier de sortie avec beaucoup trop d'entrées et chaque client ayant la même valeur d'adresse IP sur chaque ligne. Est-il possible que vous puissiez suggérer comment le faire correctement? –

Répondre

0

On ne sait pas pourquoi vous attendez votre modèle de sortie deux lignes. Vous n'avez qu'une seule boucle, et elle boucle une fois par "client". Si vous voulez générer plusieurs lignes de sortie pour chaque bloc client, vous aurez besoin d'une autre boucle.

Dans la plupart des cas, vous avez quelque chose comme:

ipaddr: 192.167.203.63 

Pour votre client BTG-chement, vous avez:

ipaddr: 196.167.203.65 192.167.203.65 

Donc, si vous divisez la valeur de ipaddr sur les espaces, vous aurez obtenir une liste d'adresses. Cela vous permettrait de faire quelque chose comme ceci:

{% for cust, config in customers.items()%} 
{% raw %}#{% endraw %} {{ cust }} - {{ config['type'] }} 
{% for ipaddr in config['ipaddr'].split() %} 
-A INPUT -s {{ ipaddr }} -p tcp -m state --state NEW -m tcp --dport {{config['accept']}} ACCEPT 
{% endfor %} 
{% endfor %} 

Vous obtiendrez ce que vous voulez.

Du point de vue de la structure de données, vous pouvez faire ipaddr une liste, comme dans:

BTG-VELOCITY: 
    type: PBSTP 
    accept: 32500 
    connect: 33500 
    ipaddr: 
     - 196.167.203.65 
     - 192.167.203.65 
    subtype: OUTBOUND 
GFAM: 
    type: SPOT 
    accept: 32501 
    connect: 33501 
    ipaddr: 
192.168.563.20 
    subtype: AMOUNT 

Cela rend évident est un attribut à valeurs multiples, et cela signifie que vous ne devez plus split la valeur:

{% for cust, config in customers.items()%} 
{% raw %}#{% endraw %} {{ cust }} - {{ config['type'] }} 
{% for ipaddr in config['ipaddr'] %} 
-A INPUT -s {{ ipaddr }} -p tcp -m state --state NEW -m tcp --dport {{config['accept']}} ACCEPT 
{% endfor %} 
{% endfor %} 
+0

Merci! Désolé pour les questions stupides. Toujours nouveau à Jinja. –