automatisierte Erstellung einer Konfigurationsdatei mit Ansible (oder etwas anderem)

automatisierte Erstellung einer Konfigurationsdatei mit Ansible (oder etwas anderem)

Ich muss eine Pipeline erstellen, um die Erstellung, Bereitstellung und Aktualisierung von Konfigurationsdateien für Netzwerkgeräte (Switch-Router-Firewall, meistens Cisco) zu automatisieren. Ich denke, es gibt viele Möglichkeiten, diese Aufgabe zu erledigen, aber ich zögere. Der Vorgang würde darin bestehen, eine Datendatei zu lesen, nach einer Zeichenfolge zu suchen (Beispiel: Hostname enthält „NR“) und, wenn alles in Ordnung ist, die geeignete Vorlage in einer Bibliothek auszuwählen, um die Konfigurationsdatei zu erstellen.

Ich habe es mit Ansible versucht, aber mir ist nicht ganz klar, was ich damit anfangen soll. Die andere Möglichkeit ist die Jinja-Bibliothek und ich habe so etwas ausprobiert

#! /usr/bin/python

import sys


from jinja2 import Template
template = """ hostname {{hostname}}

no ip domain lookup
ip domain name local.lab
ip name-server {{name_server_pri}}
ip name-server {{name_server_sec}}

ntp server  {{ntp_server_pri}} prefer
ntp server {{ntp_server_sec}} """

data= {
        "hostname": "core-test-01",
        "name_server_pri": "1.1.1.1",
        "name_server_sec": "8.8.8.8",
        "ntp_server_pri": "0.pool.ntp.org",
        "ntp_server_sec": "1.pool.ntp.org",

}
j2_template = Template(template)

print(j2_template.render(data))

Wie kann ich in diesem Fall eine Vorlagendatei aus einer Bibliothek laden (und zwar unter Berücksichtigung der Zeichenfolge, die ich in meiner Datendatei finden möchte)?

Antwort1

Q:"Lesen Sie eine Datendatei, suchen Sie nach einer Zeichenfolge (Beispiel: Hostname enthält „NR“) … wählen Sie die passende Vorlage in einer Bibliothek aus, um die Konfigurationsdatei zu erstellen."

Wenn man beispielsweise die Datendateien

> ssh admin@test_11 cat /tmp/hostname
hostname-NR

> ssh admin@test_12 cat /tmp/hostname
hostname-NS

> ssh admin@test_13 cat /tmp/hostname
hostname-NX

und die Vorlagen

> cat templates/nr.j2 
# template nr.j2

> cat templates/ns.j2 
# template ns.j2

> cat templates/nt.j2 
# template nt.j2

> cat templates/default.j2 
# template default.j2

das Spiel unten

- hosts: test_11,test_12,test_13
  vars:
    templates_lib:
      - {contains: "{{ my_hostname is search('NR') }}", template: nr.j2}
      - {contains: "{{ my_hostname is search('NS') }}", template: ns.j2}
      - {contains: "{{ my_hostname is search('NT') }}", template: nt.j2}
  tasks:
    - command: cat /tmp/hostname
      register: result
    - template:
        src: "{{ my_template) }}"
        dest: /tmp/test.conf
      vars:
        my_hostname: "{{ result.stdout }}"
        my_template: "{{ templates_lib|
                         selectattr('contains')|
                         map(attribute='template')|
                         first|default('default.j2') }}"

gibt

> ssh admin@test_11 cat /tmp/test.conf
# template nr.j2

> ssh admin@test_12 cat /tmp/test.conf
# template ns.j2

> ssh admin@test_13 cat /tmp/test.conf
# template default.j2

verwandte Informationen