可能是最强网工ansible入门及深入教程之 ansible杂谈
ansible杂谈
最近为了写网工视角的ansible最强入门教程,我已经深入到了源码级别。越是去看源码,试图清楚的讲解其原理以及一些配置选项,越是发现其伟大与其局限之处。网上的很多教程都会想办法告诉你ansible如何强大,如何能够去自动化网络设备,隐隐感觉其实这是很不负责人的。因为你发现他配置的设备都是思科、juniper、华为、F5等等,且上去就能配置就能交互,世间那么多如意的事情,在运维的道路上,坑永远比你想象的多,尤其是在网络方面。ansible也是如此。
我的这个系列也视图带你从源代码角度去看看ansible的强,放心,源代码我也就大概其一讲,帮助你更加理解ansible。
今天不去细谈技术,我们聊聊几个话题
- 网络自动化能不能用ansible
- ansible有哪些局限性
- ansible适用于或者不适用于哪些场景环境
- 我应不应该学ansible
- 我应该学习到什么程度
- 批量配置设备的几种思路
网络自动化究竟能不能用ansible?
网络自动化能不能用ansible:
1、网络环境中,设备平台相对单一,且都支持ansible(有此网络平台的模块)。无需掌握Python,即可完成批量操作。
2、有一定的研发能力。针对无法适配的设备通过研读官方文档甚至源码,进行配置,以实现自动化。甚至是深度的开发。
1、2 满足任何一个条件,这个答案才是肯定的。
hard模式
比如你有一些上古设备或者国内某些设备,看样子能ssh到设备,借助于ssh或者paramiko_ssh的connection方式和raw模块,你可以在远端设备执行命令,但是实际上配置的时候有可能出现保存失败,因为网络的配置设计到很多yes no或者其他意向不到的提示符出现。这个时候你需要去看浩瀚的官方文档或者在源代码里翻翻,发现有一个模块叫cli,可能满足你的需求。或者你研发能力足够,基于别人家的去改改。
这是hard模式,hard模式下你可以使用ansible。
easy 模式
你的设备都是思科、华为、F5、Juniper的新设备,软件版本够新,恭喜你,出生就有金汤匙,直接用ansible的对应网络模块去操作即可,通过描述性的yaml语言(中端稍微结合jinja2,高端结合python),就可以进行很多常规的配置,也可以通过对应的command模块执行基于命令行的配置同时无视wr save等命令的交互。
ansible有哪些局限性?
易学难精
通过描述语言简单上手没问题,但是实际配置的参数和注意的问题非常多,比如你在连接网络设备的时候,connection参数究竟用什么?你知道local、ssh、paramiko、network_cli等等的区别吗?一个华三设备在没有官方支持的情况下如何用ansible去自动化(二次开发还是原生解决)?
debug困难
命令行,debug也只能是在console里打印出来,这个就很局限。
当然你也可以通过Python脚本调用,那就是得自己写脚本传入参数然后结合IDE操作了。这样就能实现真正的debug了。但是多线程的执行,也会让debug困难重重,不可控的地方太多。网工里以我的技术水平实现都苦难,更别提很多不会或者初学Python的额人了。
底层调用链复杂 ,即使用上述方法debug也很困难。
执行速度慢
虽然是多进程,可以调整并发数,可以基于ssh的一些新特性短期持久化共享ssh隧道,但是ansible的执行速度,就是慢,不争的事实。
针对复杂变更 可读性有限
复杂变更的playbook可读性我觉得是非常非常差的,很多参数、模块要在不同的地方去看,审配置其实挺麻烦的。运维人员关注了参数、流程顺序、调用模块,其中还涉及到判断循环。不精通ansible可能一脸懵圈。
所以原生的ansible对于网络的复杂变更,我觉得可读性差,可能 需要二次开发。提取一些信息,封装一些功能 。所以 有些人说NetDevOps借助ansible没有编程能力也可以。。。我是持反对态度的。
变更的过程,基于console的输出,我觉得当设备数量特别多的时候看起来也是不方便。真要用,肯定要可视化封装或者买ansible tower。设备数量少是没问题的。
权限管理有限
所以在一些大型运维公司的时候,肯定还是得封装或者买ansible tower。要明确谁能用那些ansible模板,执行那些ansible实例,审查记录,版本管理等等。
部分场景网络设备认证对接有难度
抛开密钥的方式,网络设备很少用,咱们还是用户名密码认证。
用静态账号涉及到保密和动态修改,总要有地方落地,存在安全风险,当然你可以用ansible自身加密模块加密。安全安全安全,说三遍!涉及到静态密码,我就觉得不安全,哪怕你把密码改的它爸妈都不认识, 也是有风险的。
动态密码,批量变更ansible几乎就废了。
我的思路是可能需要改写底层代码,对接认证系统,每次给一个临时可用的权限足够的密码。又是二次开发。
审计困难
审计人员来了,看你ansible的playbook。。。。我觉得。。。你给他一段段讲吧。。。除非你又有专门的系统记录用户行为调用等等,可以简化审计,审计人员过过一条条记录,随便看看playbook就过了,如果真的是raw的ansible。。。你想象一下,估计要解释半天。没有审计的地方请忽略我。
ansible适用于或者不适用于哪些场景环境 ?
适用
适用的就是网络环境简单单一的地方。拥有众多支持ansible的网络设备(华为、思科、Juniper、F5),这些设备的软件版本估计还有要求。设备量多了,你还是得上ansible tower或者自己开发或者其他第三方产品。
这几家的模块我也强烈大家看看,很有营养,每个支持ansible的设备都各有各的办法,比如华为,好像比较统一,是基于Netconf。有的是基于API,有的是基于命令行配置(nxos部分模块),囊括了网络自动化的集中方式,很多代码我觉得可以复用。
不适用
不适用的就是网络环境复杂,上古设备众多,不支持ansible设备众多,开发能力有限,认证体系完善(适用动态密钥,几乎很少静态密码)
我应不应该学ansible?
所有网络运维人员都应该学习ansible,因为这是趋势,他符合讲业务参数与底层命令脱离的趋势。而且它会一直火下去。
网络设备制造商在紧贴ansible,现在不行不代表以后不行。
你的运维环境适用ansible,那你一定要学要用!减少你的工作量!
你的运维环境复杂,有研发实力,可以参考ansible,二次开发那肯定要学的对吧?不二次开发的情况下,ansible也很多优秀的思想,可以借鉴,甚至很多网络的模块可以直接复用,爽歪歪!
我应该学习到什么程度
能往深了学,就往深了学,这东西确实是宝藏。
NetDevOps技术堆栈里没有ansible,都不好意思出去和别人打招呼!
量力而行,先是命令行调用,yaml描述playbook,后期Python调用,再后期看看优秀的模块怎么写,能不能自己也写写,最后,造轮子吧少年!
ansible批量配置设备的几种思路
- 基于各厂商模块的对应command或者config模块调用命令执行程序
- 基于各厂商的模块,指向性的配置某个功能(比如端口、vlan、acl)
- 基于cli模块,写一些playbook,通过cli里的prompt和answer自己去适配上古设备或者国产不支持的设备
- 基于Netconf模块,发送Netconf协议
- 基于httpapi模块,发送RESTful请求。
- 大招,造轮子!
以上很多问题,其实有的已经有答案,有的需要我们共同去克服。这个系列文章下来,我估计3 5篇打不住了,很多网络自动化模块源代码,我觉得非常优秀,特别有分享的价值,大家真可以拿来用或者按照这个思想去自己造轮子!欢迎大家持续关注,我有信心,把这个系列写成每个网工想要入门甚至精通ansible绕不开所必须看的一个系列文章!不要再去看那些从系统运维角度写ansible的文章了,也不要去看那些写了几篇文章都在简单讲怎么配一个端口的入门文章了!
上车吧少年!