网络工程师网络工程师学习笔记

Python+YAML+Jinja2批量生成华为交换机配置

2019-06-13  本文已影响2人  爱看时事的通信崔

一、YAML简介

YAML是一种简洁的非标记语言,通过空白、缩进、分行组织数据,从而使数据表达清晰易懂。

YAML文件,其实就是后缀名为yaml或yml的文本文件。

文件以三道杠表示开头

---
#这三道杠表示文件的开始
#井号是注释

列表的表示

# Python列表:[a,b,c,1,2]

# 用YAML表示如下:
---
- a
- b
- c
- 1
- 2
# 列表单独元素在YAML中用一个横杠加空格表示
# 不用写引号

字典的表示

# Python字典:{'China':'Beijing', 'Japan':{'Tokyo':[1,2,3]}, 'South Korean':{'Soul':['A','B','C']}}

# 用YAML表示如下:
---
China: Beijing:
Japan:
  Tokyo:
    - 1
    - 2
    - 3
South Korean:
  Soul:
    - A
    - B
    - C
# 字典的键值在YAML中用冒号和空格表示

二、Jinja2简介

Jinja2是一种Python模板语言,速度快、使用广泛。

下面是一个简单的华为交换机配置:

#
sysname SWName01
#
vlan 10
 description to CWK
#
vlan 20
 description to RLK
#
interface Vlanif1
 ip address 192.168.1.10 255.255.255.0
#
interface GigabitEthernet0/0/1
 port link-type access
 port default vlan 10
#
interface GigabitEthernet0/0/2
 port link-type access
 port default vlan 20
#
interface GigabitEthernet0/0/24
 port link-type trunk
 port trunk allow-pass vlan 2 to 4094
#
user-interface vty 0 4
 user privilege level 3
 set authentication password cipher 123456
#

接下来,我们把它改造成Jinja的模板

#
sysname {{ switch_name }}
#
vlan {{ first_vlan }}
 description {{ first_vlan_name }}
#
vlan {{ second_vlan }}
 description {{ second_vlan_name }}
#
interface {{ Vlanif_id }}
 ip address {{ Vlanif_id_ip }} {{ Vlanif_id_mask }}
#
interface GigabitEthernet0/0/1
 port link-type access
 port default vlan {{ first_vlan }}
#
interface GigabitEthernet0/0/2
 port link-type access
 port default vlan {{ second_vlan }}
#
interface GigabitEthernet0/0/24
 port link-type trunk
 port trunk allow-pass vlan 2 to 4094
#
user-interface vty 0 4
 user privilege level 3
 set authentication password cipher 123456
#

三、Python调用简介

Python就是读取YAML和Jinja2文件,生成最终配置的关键语言。

这一过程一共分四步:

  1. 载入YAML文件
  2. 载入Jinja2模板
  3. 将YAML内容写入Jinja2模板,产生配置
  4. 输出配置到文件

四、批量生成配置

第一步:根据上面的简单配置,首先整理出如下必须配置信息:

将配置信息整理成YAML文件如下

---
# 第一台交换机
- host: SWName01
  vlans:
    10:
      description: to CWK
    20:
      description: to RLK
    30:
      description: to YWK
  interface:
    GigabitEthernet 0/0/1:
      mode: access
      vlan: 10
    GigabitEthernet 0/0/2:
      mode: access
      vlan: 20
    GigabitEthernet 0/0/24:
      mode: trunk
      vlan:
  interface vlanif1:
    ip: 192.168.0.10
    mask: 255.255.255.0

# 第二台交换机
- host: SWName02
  vlan:
    10:
      description: toCWK
    20:
      description: toRLK
    30:
      description: toYWK
  interface:
    GigabitEthernet0/0/1:
      mode: access
      vlan: 20
    GigabitEthernet0/0/2:
      mode: access
      vlan: 10
    GigabitEthernet0/0/24:
      mode: trunk
      vlan:
  vlanif1:
    ip: 192.168.0.20
    mask: 255.255.255.0

第二步:搞定Jinja2的配置模板

#
sysname {{ host }}
#
{% for key, value in vlan.items() %}
vlan {{ key }}
 description {{ value.description }}
{% endfor %}
#
{% for key, value in interface.items() %}
{% if value.mode == 'trunk' %}
interface {{ key }}
  port link-type trunk
  port trunk allow vlan all
{% elif value.mode == 'access' %}
interface {{ key }}
  port link-type acess
  port defaut vlan {{ value.vlan }}
{% endif %}
{% endfor %}
#
interface Vlanif1
 ip address {{ vlanif1.ip }} {{ vlanif1.mask }}

第三步:得用Python组合YAML文本和Jinja2配置文件,批量生成配置

# 导入Jinja2和YKML模块
import jinja2
import yaml

# 载入YAML文件到message
file = open('./huawei.yaml','r')
messageYaml = yaml.load(file)
file.close()

# 载入jinja2文件
jinjaFile = jinja2.FileSystemLoader('./') # 文件路径在当前文件夹
jinjaEnv = jinja2.environment(loader=jinjaFile) # 定义jinja2环境
messageJinja = jinjaEnv.get_template('huawei.j2')

for h in messageYaml:
    conFile = open('./'+h[host]+'txt','w') # 每个交换机保存成一个文件
    tempCon = messageJinja.render(each)  # 把每个配置信息导入到模板中
    conFile.write(tempCon)
    conFile.close()

第四步:接下来就是验证了,把YAML文件、Jinja2模板文件和Python代码放到同一个目录下,运行后,就自动生成配置了。

#
sysname SWName01
#
vlan 10
 description to CWK
#
vlan 20
 description to RLK
#
interface Vlanif1
 ip address 192.168.1.10 255.255.255.0
#
interface GigabitEthernet0/0/1
 port link-type access
 port default vlan 10
#
interface GigabitEthernet0/0/2
 port link-type access
 port default vlan 20
#
interface GigabitEthernet0/0/24
 port link-type trunk
 port trunk allow-pass vlan 2 to 4094
#
user-interface vty 0 4
 user privilege level 3
 set authentication password cipher 123456
#
上一篇 下一篇

猜你喜欢

热点阅读