2019-05-30 Python+Jinja2+yaml 批量生成配置

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2019-05-30 Python+Jinja2+yaml 批量生成配置相关的知识,希望对你有一定的参考价值。

参考技术A 目前来看,Python+yaml+Jinja2是非常方便生成批量配置的组合,在运维工作中用于批量生成设备的基础配置。
这里我的案例是配置一批交换机,基础配置不同的地方有:loopback地址(IPV4和IPV6),设备名称,ISIS网络号,至于其他互联地址什么的因为情况比较复杂,还是手工做吧。
那么思路就有了。
1、生成yaml文件,类似于下面结构:

这里说明一下,loopback地址的V4网段是先规划好的,V6地址和ISIS网络号通过一定规则根据V4地址生成,这个yaml文件可以通过读取excel文件,按照算法生成yaml文件,这个在其他文章里再写。
2、读取yaml文件,生成一个由字典组成的列表。每个字典的信息就包含了每台设备需要的变量。
3、写一个函数,遍历列表里的字典,每读取一个字典,把其中变量取出来放进一个临时字典,渲染jinja2的模板,对每个字典输出不同的配置文件。这个临时字典每读取一次就清空,重新写入变量。
有一些细节比如文档取名,时间函数等要调用一些模块,总结一下涉及的知识点,有:yaml模块,jinja2模块,os模块,日期函数,条件循环,I/O操作。
附上python脚本:

模板文件放在‘templates’目录下,否则会报错找不到文件。
python新手,有不合理的地方请高手指点。

jinja2批量生成python脚本

? 在使用airflow的过程中需要大量的dag脚本进行性能测试,如果一个个去编写dag脚本未免太过麻烦,于是想到用python的jinja2模板引擎实现批量脚本生成。

先通过pip命令安装jinja2模块:

$ pip install jinja2

然后创建模板文件(模板可以是任何形式的文本格式,没有特定扩展名,甚至可以不要扩展名):

dag_template

from datetime import timedelta, datetime
import pytz
from airflow.operators.bash_operator import BashOperator
from airflow.operators.dummy_operator import DummyOperator
from airflow.models import DAG

default_args = {
    ‘owner‘: ‘cord‘,
    # ‘depends_on_past‘: False,
    ‘depends_on_past‘: True,
    # ‘start_date‘: airflow.utils.dates.days_ago(2),
    ‘wait_for_downstream‘: True,
    ‘execution_timeout‘: timedelta(minutes=3),
    ‘email‘: [‘[email protected]‘],
    ‘email_on_failure‘: False,
    ‘email_on_retry‘: False,
    ‘retries‘: 1,
    ‘retry_delay‘: timedelta(minutes=5),
}

tz = pytz.timezone(‘Asia/Shanghai‘)
dt = datetime(2018, 7, 19, 18, 20, tzinfo=tz)
utc_dt = dt.astimezone(pytz.utc).replace(tzinfo=None)
dag = DAG(
    ‘{{ dag_name }}‘,
    default_args=default_args,
    description=‘my DAG‘,
    schedule_interval=‘*/1 * * * *‘,
    start_date=utc_dt
)
root = DummyOperator(task_id=‘root‘, dag=dag)
for i in range(50):
    i = str(i)
    task = BashOperator(
        task_id=‘task‘+i,
        bash_command= ‘echo `date`‘,
        dag=dag)
    task.set_downstream(root)

jinja2中有两种分隔符: {% ... %}{{ ... }} ,其中{% ... %}用于执行for循环或者赋值语句,{{ ... }}负责将表达式的值填充到模板中。这里使用{{ ... }}用于填充dag文件的dag_id 。

通过该模板即可批量生成dag脚本文件,生成代码如下:

Tool.py

import os
from jinja2 import Environment, FileSystemLoader

#获取模板
env = Environment(loader = FileSystemLoader(searchpath=""))
template = env.get_template("dag_template")


#删除已有的生成文件
for f in os.listdir("./output"):
    path_file = os.path.join("./output", f)
    if os.path.isfile(path_file):
        os.remove(path_file)

#生成新的文件
for i in range(1, 101):
    output = template.render({‘dag_name‘ : "benchmark%d" % i})
    with open("./output/bm%d.py" % i, ‘w‘) as out:
        out.write(output)

通过执行Tool.py即可批量生成dag脚本文件了。

以上是关于2019-05-30 Python+Jinja2+yaml 批量生成配置的主要内容,如果未能解决你的问题,请参考以下文章

jinja2批量生成python脚本

python学习笔记-Day17(jinja2)

python--jinja2

Python jinja2

python 创建自定义函数Jinja2

GAE / Python / jinja2 / 如何在join语句中引用子目录