- 论坛徽章:
- 59
|
本帖最后由 renxiao2003 于 2021-12-15 17:04 编辑
(1)谈谈你所了解的Ansible源码极其内部模块的运行机制,以及使用Ansible时的依赖和限制。
ansible运行是不需要客户端的,其依赖底层通信系统软件,linux系统下基于openssh通信,windows系统下基于powershell,管理端必须是Linux系统,使用者认证通过后在管理节点通过ansible工具调用各应用模块将指令推送至管理端执行,并在执行完毕后自动删除产生的临时文件.ansible具体的工作机制官方有专栏介绍https://www.ansible.com/how-ansible-works,写的比较简单.
ansible的工作机制
如上图:根据ansible使用过程中的不同角色,我们将其分为:
使用者:
使用者来源多种维度:
CMDB(Configuration Management Database, 配置管理数据库),CMDB存储和管理着企业IT架构中的各项配置信息,是构建ITIL项目的核心工具,运维人员可组合CMDB和ansible,通过CMDB直接下发指令调用ansible工具集完成操作者下发任务
PUBLIC?PRIVATE方式,ansible除了丰富的内置模块外,同时提供丰富的API语言接口,如PHP,python,perl等多种语言,基于公有云/私有云,ansible以api调用的方式运行
用户直接使用ad-hoc临时命令集调用ansible工具集来完成任务执行
用户预先编写好ansible playbooks,通过执行playbooks中预先编排好的任务集按序完成任务执行.
ansible工具集
ansible命令是ansible的核心工具,ansible命令并非自身完成所有的功能集,其只是ansible执行任务的调用入口,可以理解为"指挥部",所有命令的执行通过其"下达指令"来完成.ansible主要模块如上图:inventory(目的管理终端的配置文件),api(供第三方程序调用的应用程序编程接口),modules(丰富的内置模块,ansible完成任务的大部分管理工作都是通过Modules里的模块来完成的),plugins(内置和可自定义的插件).
作用对象
ansible的作用对象,不仅仅是linux和非linux操作系统的主机(HOSTS),同样也可以作用于各类公有云/私有云,商业和非商业设备的网络设施.
ansible的工具集主要由以下部分组成
playbooks: 任务剧本,编排定义ansible任务集的配置文件,由ansible就顺序执行,通常是json格式的yml文件:当然你也可以通过自己写strategy来自定义任务集通过怎么顺序或者方式来运行
inventory: 管理主机清单
modules: ansible执行命令的功能模块,多数为内置 的核心模块,也可自定义
plugins:模块功能的补充,如连接类型插件,循环插件,变量插件,过滤插件等,
api: 供第三方程序调用的接口
ansible执行任务,这些组件相互调用关系如下图:
使用者使用ansible或ansible-playbook(会额外读取playbook文件)时,在服务器终端输入ansilbe的ad-hoc命令集或playbook后,ansible会遵循预先编排的规则将playbooks逐条拆解为play,再将play组织成ansible可识别的任务(task),随后调用任务涉及的所有模块(module)和插件(plugin),根据inventory中定义的主机列表通过ssh将任务集以临时文件或命令的形式传输到远程客户端执行并返回执行结果,如果临时文件则执行完毕后自动删除.
ansible通信发展史
ansible主推的卖点是其无需任何daemon维护进程即可实现相互间的通信,且通信方式是基于业内统一标准的安全可靠的ssh安全连接.同时因为ssh是每台linux主机系统必装的软件,所以ansible夫需在远程主机端安装任何额外进程,即可实现agentless(无客户端),进而助力其实现去中心化的思想.尽管稳定,快速,安全的ssh连接是ansible通信能力的核心,但ssh的连接效率一直被诟病,所以ansible的通信方式和效率在过去的数年中也在不停地改变和提高.基于以上认识,我们先来了解ansible ssh 的工作机制,再来回顾其发展史.
1)ansible ssh工作机制
ansible执行命令时,通过其底层传输连接模块,将一个或数个文件,或者定义一个play或command命令传输到远程服务器/tmp目录的临时文件,并在远程执行这些play/comman命令,然后删除这些临时文件,同时回传整体命令执行结果.这一系列操作在未来的ansible版本中会越来越简单,直接,同时快速,稳定,安全.通过了解其工作机制及其一直以来秉承的去中心化思想,我们可以总结,ansible是非c/s架构,自身没有client端,其主要特点如下:
无客户端,只需安装ssh,python即可,其中python建议版本为2.6.6以上.
基于openssh通信,底层基于ssh协议(windows基于powershell)
支持密码和ssh认证,因可通过系统账户密码认证或公私钥方式认证,所以整个过程简单,方便,安全.建议使用公私钥方式认证,因为密码认证方式的密码需明文写配置文件,虽然配置文件可加密,但会增加ansible使用的复杂度.
支持windows,但仅支持客户端,服务端必须是linux系统.
clear(简易): yaml语法,python语言编写,易于管理,api简单明了
fast(敏捷):快速学习,设置简单,无需任何第三方软件
complete(全面):配置管理,应用部署,任务编排等功能集于一身,丰富的内置模块满足日常功能所需
efficient(高效):没有额外软件包消耗系统性能
secure(安全):没有客户端,底层基于openssh,保证通信的安全可靠性
ansible通信方式发展历程
ansible底层基于安全可靠的ssh协议通信,但一直被人们诟病于效率,通信功能作为ansible最核心的功能之一,官方也一直在做改进.
1)paramiko通信模块
最初,ansible只使用paramiko实现底层通信功能,但是paramiko只是python语法的一个第三方库,发展速度远不及openssh.
在后续发布的新版本中,ansible仍断续兼容paramiko,甚至在诸如RHEL 5/6等不支持ControlPersist(只在openssh 5.6+版本中支持)的系统中封装其为默认通信模块.
2)openssh
从ansible 1.3版本开始,ansible默认使用openssh连接实现各服务器间通信,以支持ControlPersist(持续管理).ansible从0.5版本起即支持openssh功能,但直到1.3版本开始才将其设置为默认.
多数本地ssh配置参数,诸如Hosts,公私钥文件等是默认支持的,但如果希望通过非默认的22端口运行命令等操作则需要在inventory文件中配置ansible_ssh_port的值.openssh相比paramiko更快,更可靠.
3)加速模式
据官网介绍:开启加速模式后ansible通信速度 有质的提升,是开启ControlPersist后的ssh的2~6倍,是paramiko通信速度的10倍.
尽管加速模式对ad-hoc命令不友好,但是playbook通过加速模式会收到更高的性能.加速模式摒弃ssh多次连接的方式,通过ssh初始化后,带着AES key的初始化连接信息通过特定的端口(默认5099,但可配置)执行命令传输文件.使用加速模式唯一需要的额外包是python-keyczar,如此一来,几乎所有的常规模块openssh/paramiko均工作在加速模式,但如下使用sudo的情况:
1. sudoers文件需要关闭其中的requiretty功能,注释掉或者设置每个用户的默认值为usrename !requiretty. sudoers的man文档说明如下.
2. 开启加速模块必须事先设置sudo文件NOPASSWD配置,禁用sudo后的PASSWORD交互认证过程.加速模式相对openssh可以提供2~4倍的性能提升(尤其对于文件传输功能),在playbook的应用中可以通过增加配置开关来实现
其中的端口也可以在ansible.cfg中单独配置.
加速模式是现在已经被刻度的Fireball模式的进化版,类似于ansible加速通信方式,但需控制机事先安装ZeroMQ服务(这与ansible简单,无依赖,无Daemon的理念是相违背的),并且一点也不支持sudo操作.
4) Faster openssh in ansible 1.5+
ansible 1.5+版本中的openssh有了非常大的改进,旧版本中实现方式是复制文件至远程服务器后运行,然后删除这些临时文件,而新版本的替代方案是通过openssh发送扫行命令,将所有操作附带在ssh连接过程中同步实现.该方式只在ansible 1.5+版本有效,且需在/etc/ansible/ansible.cfg的[ssh_connection]区域开启pipelining=True功能.
关于加速模式我们还需要关注如下内容:
pipeling=True需结合sudo的requiretty配置方可生效,请确保/etc/sudoers的defaults requiretty为注释状态.绝大多数现有流行系统默认开启该选项.
在 Mac OSX,Ubuntu,Windows的Cygwin或其他流行OS最好选择5.6以上的openssh版本,这些版本对ControlPersist额更友好的支持.
如ansible运行的主机系统是RHEL或CentOS,然而希望升级当前openssh到最新版本以支持Faster/Persistent连接模式,可以通过yum update openssh升级最新版本.
(2)如何高效地学习一个开源项目的源码?
1.首先,查找和阅读该项目的博客和资料,通过google你能找到某个项目大体介绍的博客,快速阅读一下就能对项目的目的、功能、基本使用有个大概的了解。
2.阅读项目的文档,重点关注类似Getting started、Example之类的文档,从中学习如何下载、安装、甚至基本使用该项目所需要的知识。
3.如果该项目有提供现成的example工程,首先尝试按照开始文档的介绍运行example,如果运行顺利,那么恭喜你顺利开了个好头;如果遇到问题,首先尝试在项目的FAQ等文档里查找答案,再次,可以将问题(例如异常信息)当成关键词去搜索,查找相关的解决办法,你遇到了,别人一般也会遇到,热心的朋友会记录下解决的过程;最后,可以将问题提交到项目的邮件列表,请大家帮你看看。在没有成功运行example之前,不要尝试修改example。
4.运行了第一个example之后,尝试根据你的理解和需要修改example,测试高级功能等。
5. 在了解基本使用后,需要开始深入的了解该项目。例如项目的配置管理、高级功能以及最佳实践。通常一个运作良好的项目会提供一份从浅到深的用户指南,你并不 需要从头到尾阅读这份指南,根据时间和兴趣,特别是你自己任务的需要,重点阅读部分章节并做笔记(推荐evernote)。
6. 如果时间允许,尝试从源码构建该项目。通常开源项目都会提供一份构建指南,指导你如何搭建一个用于开发、调试和构建的环境。尝试构建一个版本。
7. 如果时间允许并且有兴趣,可以尝试阅读源码:
(1)阅读源码之前,查看该项目是否提供架构和设计文档,阅读这些文档可以了解该项目的大体设计和结构,读源码的时候不会无从下手。
(2)阅读源码之前,一定要能构建并运行该项目,有个直观感受。
(3)阅读源码的第一步是抓主干,尝试理清一次正常运行的代码调用路径,这可以通过debug来观察运行时的变量和行为。修改源码加入日志和打印可以帮助你更好的理解源码。
(4)适当画图来帮助你理解源码,在理清主干后,可以将整个流程画成一张流程图或者标准的UML图,帮助记忆和下一步的阅读。
(5)挑选感兴趣的“枝干”代码来阅读,比如你对网络通讯感兴趣,就阅读网络层的代码,深入到实现细节,如它用了什么库,采用了什么设计模式,为什么这样做等。如果可以,debug细节代码。
(6)阅读源码的时候,重视单元测试,尝试去运行单元测试,基本上一个好的单元测试会将该代码的功能和边界描述清楚。(7)在熟悉源码后,发现有可以改进的地方,有精力、有意愿可以向该项目的开发者提出改进的意见或者issue,甚至帮他修复和实现,参与该项目的发展。
8.通常在阅读文档和源码之后,你能对该项目有比较深入的了解了,但是该项目所在领域,你可能还想搜索相关的项目和资料,看看有没有其他的更好的项目或者解决方案。在广度和深度之间权衡。
以上是我个人的一些习惯,我自己也并没有完全按照这个来,但是按照这个顺序,基本上能让你比较高效地学习和使用某个开源项目。
(3)相比C++和Go语言,阅读基于Python的开源项目源码有何优势?
1. 简单 Python的语法非常优雅,甚至没有像其他语言的大括号,分号等特殊符号,代表了一种极简主义的设计思想。阅读Python程序像是在读英语。2. 易学 Python入手非常快,学习曲线非常低,可以直接通过命令行交互环境来学习Python编程。
3. 免费/开源 Python的所有内容都是免费开源的,这意味着你不需要花一分钱就可以免费使用Python,并且你可以自由地发布这个软件的拷贝、阅读它的源代码、对它做改动、把它的一部分用于新的自由软件中。4. 可以移植 由于Python是开源的,它已经被移植到了大多数平台下面,例如:Windows、MacOS、Linux、Andorid、iOS等等。
5. 解释性 大多数计算机编程语言都是编译型的,在运行之前需要将源码编译为操作系统可以执行的二进制格式(0110格式的),这样大型项目编译过程非常消耗时间,而Python语言写的程序不需要编译成二进制代码。你可以直接从源代码运行程序。在计算机内部,Python解释器把源代码转换成称为字节码的中间形式,然后再把它翻译成计算机使用的机器语言并运行。
6. 面向对象 Python既支持面向过程,又支持面向对象,这样编程就更加灵活。
7. 可扩展 Python除了使用Python本身编写外,还可以混合使用像C语言、Java语言等编写。
(4)你有哪些给相关项目的开源社区提交Bug记录甚至贡献过代码的经历?
曾经给阿里云的PolarDB数据库,基于PGAdmin(Python)做过管理插件开发(原生PGAdmin不支持PolarDB)。
(5)如果你想成为社区的代码贡献者,你觉得需要从哪些方面着手?
你要是真正想从事一方面,不要在那抱怨没有机会,你真正对那一方向感兴趣,你就去自己做,甚至成为那方面的开源项目的积极贡献者,你都不需要怎么证明自己,你再去找这方面的工作,业内也自然会认可你。你首先去做出一些成绩出来,不要在那抱怨没机会。
哪怕是写了一些很好的博客,拍了一些很好的视频,你真正有实力而且做出了一些东西,互联网不会埋没你的。
你真正对无人机,SLAM感兴趣,你就去做这方面的嘛,包括积极参与GAAS的建设。你一直坚持弄下去就好了。
而不是今天东弄一下这个明天弄一下那个,也没做说明项目,就看了下原理想面试胡弄下人,这样肯定是走不远的
你想弄异常检测就真正去深钻做出点成果出来,而不是看两篇论文,糊弄过关,为了简历上好写写项目,这样是不行的。
我觉得你不要在那抱怨没有机会,你很多时候就没有真正去深钻一个东西并且做出点成功出来。应该是让企业来找你而不是你找企业。你自己好好体会一下。你真正去在一个领域做出建设性成果。业内不会忽视你的存在的。
但你很多时候不是这么想的,你很多时候是想着怎么简历上写些好看的项目,怎么面试好些,尽想这些去了。你都没有真正去深钻一个项目。要从你找工作转变为工作找你。
|
|