2017-06-07 4 views
-1

J'ai un fichier texte brut routers dans le système de versioning qui contient les noms d'hôte séparés par des sauts de ligne:Comment préparer un inventaire, un playbook et un fichier de configuration utilisables par Ansible module en utilisant Ansible/Jinja2?

$ cat routers 
r1 
r2 
r3 
$ 

J'ai aussi des modèles de configuration des routeurs dans le système versioning comme fichiers texte. Par exemple:

$ cat system:syslog                                            
system { 
    syslog { 
     host 10.10.10.153 { 
      any notice; 
      daemon info; 
     } 
    } 
} 
$ 

Je ne peux pas modifier le format de ces deux types de fichiers car ils sont utilisés par d'autres systèmes. Maintenant, ce dont j'ai besoin, est de créer un fichier d'inventaire Ansible à partir de ce fichier routers, fichier de configuration pour le module Ansible junos_config du modèle de configuration des routeurs et enfin playbook Ansible dans YAML. En ce moment j'utilise un script bash pour ça. Simplifié, il faut quatre arguments:

  1. fichier routers
  2. fichier modèle de configuration
  3. (par exemple system:syslog décrit ci-dessus)
  4. nombre de billets dans le système de billetterie (entier)
  5. chaîne de commentaire (ceci est utilisé dans routeur pour décrire le changement)

Basé sur les exemples ci-dessus, le fichier routers est converti en inv suivant fichier entory:

junipers ansible_connection=local 
[junipers] 
r1 
r2 
r3 

fichier system:syslog est converti en un nom de fichier <ticket_nr>.cfg avec le contenu suivant:

groups { 
    replace: system:syslog { 
     system { 
      syslog { 
       host 10.10.10.153 { 
        any notice; 
        daemon info; 
       } 
      } 
     } 
    } 
} 

Fondamentalement, le script bash fait quelque chose comme ceci:

cat << EOF 
groups { 
    replace: ${templatefile##*/} { 
EOF 
sed 's/^/  /' "$templatefile" 
cat << EOF 
    } 
} 
EOF 

Et PlayBook enfin fichier est généré:

- hosts: junipers 
    remote_user: admin 
    tasks: 
    - name: Change routers conf. 
     ignore_errors: yes 
     junos_config: 
     comment: "<comment>" 
     timeout: 60 
     port: 22 
     src: <ticket_nr>.cfg 
     src_format: text 
     replace: yes 

<comment> et <ticket_nr> sont des arguments donnés au script bash. En outre, ce script bash vérifie la dernière révision des fichiers et modèles de configuration routers mentionnés.

Maintenant, est-il une meilleure façon de faire tout cela sans bash? Bien que cela fonctionne, je pense que je me trompe et je compte beaucoup sur bash. Est-il possible de faire tout cela dans Ansible/Jinja2?

Répondre

0
$ cat system:syslog 
system { 
    syslog { 
     host 10.10.10.153 { 
      any notice; 
      daemon info; 
     } 
    } 
} 
$ cat replace_sys_syslog.j2 
groups { 
    replace: system:syslog { 
{{ conf }} 
    } 
} 
$ cat example.py 
from jinja2 import Template 


tmpl = Template(open('replace_sys_syslog.j2').read()) 
conf = tmpl.render(conf=open('system:syslog').read()) 
print conf 
$ python example.py 
groups { 
    replace: system:syslog { 
system { 
    syslog { 
     host 10.10.10.153 { 
      any notice; 
      daemon info; 
     } 
    } 
} 

    } 
} 

Maintenant, en utilisant ce fichier modèle, une tâche Ansible peut générer une configuration.