ich benutze python zusammen mit nornir um Konfigurationen (jinja template) für Router zu erstellen und anschließend auf die Geräte zu pushen.
Für die Berechnung der IP-Adressen habe ich die Funktion "def calc_ip" erstellt. Der Input (subnet)kommt aus einem yaml Dictianory. s. unten
Die Berechnung der IP Adressen klappt zwar ( wenn auch sehr umständlich..) aber ich bekomme es nur für ein von zwei Routerpärchen hin.
Ich würde die Funktion gern auch für das andere Routerpärchen verwenden.
Könnt ihr mich dazu mal in die richtige Richtung schubsen , habe schon einiges probiert, aber es klappt nicht so recht.
Für die Eingabe der Inputs möchte ich nicht die host oder group Datei verwenden (nornir inventory)
Hier mal die wesentlichen Infos:
Code: Alles auswählen
data_input.yaml
---
global_var_pe_rtr:
rt_id: 66666
global_var_pe_rtr_ab:
vrf_id: test1
vlan_id: 3281
rd_id: 14225
subnet: 172.23.130.0 -> wird für die Berechnung verwendet
static_routes: enable
prefix:
- prfx: 10.0.0.0/8
- prfx: 172.16.0.0/12
pe_rtr_ab:
rtr_1_a:
group:
- ios-xr_rtr
data:
loopback: 1.1.1.1
rtr_2_b:
group:
- ios-xr_rtr
data:
loopback: 2.2.2.2
global_var_pe_rtr_cd:
vrf_id: test2
rd_id: 14225
vlan_id: 204
subnet: 172.23.61.0 -> soll auch für die Berechnung verwendet werden
static_routes: enable
prefix:
- prfx: 10.0.0.0/8
pe_rtr_cd:
rtr_1_c:
group:
- ios_rtr
data:
loopback: 3.3.3.3
rtr_2_d:
group:
- ios_rtr
data:
loopback: 4.4.4.4
Code: Alles auswählen
***********************
python script:
***********************
def read_file(input_file):
with open(input_file) as f:
input_data = yaml.load(f)
return input_data
def calc_ip (sn):
subnet1 = sn['global_var_pe_rtr_ab']['subnet']
parts = subnet1.split('.')
oktet1 = int(parts[0])
oktet2 = int(parts[1])
oktet3 = int(parts[2])
oktet4 = int(parts[3])
hsrp_lst = [oktet1, oktet2, oktet3, oktet4+1]
rtr1_lst = [oktet1, oktet2, oktet3, oktet4+2]
rtr2_lst = [oktet1, oktet2, oktet3, oktet4+3]
fw_lst = [oktet1, oktet2, oktet3, oktet4+4]
ip_hsrp = '.'.join(str(x) for x in hsrp_lst)
ip_rtr1 = '.'.join(str(x) for x in rtr1_lst)
ip_rtr2 = '.'.join(str(x) for x in rtr2_lst)
ip_fw = '.'.join(str(x) for x in fw_lst)
return ip_hsrp,ip_rtr1,ip_rtr2,ip_fw
def render_configs(task, id, ipadd):
filename = task.host["j2_template_file"]
r = task.run(
task= template_file,
name="Base Template Configuration",
template=filename,
path="./templates",
**id,
ip=ipadd
)
task.host["config"] = r.result
if __name__ == "__main__":
input_data=read_file(input_file = "data_input.yaml")
pprint(input_data)
calc_task = calc_ip(sn = input_data)
#print(calc_task)
render_task = nr.run(task=render_configs, id=input_data, ipadd = calc_task )
print_result(render_task)