
对于一个开发人员来讲,可能运维并不是自己的职责所在。但是作为一名开发人员,却不能不了解自动化运维的整个流程。因为对于一个信息系统而言,开发和运维本质是一体的,尤其对于一些小公司来讲,可能运维人员本身就是开发人员抽空兼任的。
而自动化运维,本质上是介于开发和运维之间的,是运维和开发的交集,甚至很多时候都要写不少代码。因此,任何一个开发人员,都需要有自动化运维的相关知识。
一个了解好的开发人员,即使自己不做运维相关的工作,也能够知道自己在将项目交付给运维人员的时候,哪些东西是重要的,那些是必须配置的等等。然而在实际工作中,往往开发人员会给运维人员留下一些坑,一些只有他自己知道,而运维人员不知道的东西。导致运维人员自己试了很多次发现不行的时候,找到开发人员,开发人员研究了一下才会告诉他,在某某环境中必须用哪个端口之类的。这样不仅白白浪费了运维人员的时间,也增加了很多沟通的工作量。
反过来也是如此,一些现场的问题如果运维人员不能现场给出问题的定位。对于开发人员来讲是非常难以复现的。比如之前有某家企业,运维人员在客户现场发现问题。费了很大力气从客气的内网里面把日志导出来,发给开发人员,结果开发人员仔细研究了日志之后,发现是网不通的问题。开发人员显然是不可能知道为啥网不通的,搞不好是压根没连网线。
所以今天我们来聊一聊,对于一个程序员来讲,需要了解的自动化运维的那些事。
一、自动化运维的概念
随着信息时代的持续发展,初期的几台服务器已经发展成为了庞大的数据中心,单靠人工已经无法满足在技术、业务、管理等方面的要求。一个运维人员手工配置几台服务器还可能。配置几百上千台服务器那就累死了,还容易出错。那么就需要对运维工作进行标准化、自动化、架构优化、过程优化等。从面降低运维服务成本。其中,自动化最开始作为代替人工 *** 作为出发点的诉求被广泛研究和应用。
所谓自 动化运维,即在最少的人工干预下,结合运用脚本与第三方工具,保证业务系统7*24小时高效稳定运行 。这是所有业务系统运维的终极目标。
按照运维的发展成熟度来看, 运维大致可分为三个阶段 :
(1)依靠纯手工,重复地进行软件的部署与运维;
(2)通过编写脚本,方便地进行软件的部署与运维;
(3)借助第三方工具,高效地进行软件的部署与运维;
二、自动化运维需要解决的问题
自动化运维通常来讲,需要解决以下几个问题: 自动部署配置、风险事前预警、故障事中解决、和故障事后管理 。
三、自动化运维的常用工具
自动化运维常用的工具包括以下几种:
1、Ansible
ansible是基于Python开发的自动化运维工具,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
ansible具有如下一些特性:
(1)模块化:调用特定的模块,完成特殊的任务。
(2)Paramiko(python对ssh的实现),PyYaml,jinja2(模块语言)三个关键模块。
(3)支持自定义模块,可使用任何编程语言写模块。
(4)基于python语言实现。
(5)部署简单,基于python和SSH(默认已安装),agentless,无需代理不依赖KPI(无需SSL)。
(6)安全,基于OpenSSH
(7)幂等性:一个任务执行一次和执行n遍效果一样,不因重复执行带来意外情况。
(8)支持playbook编排任务,YAML格式,编排任务,支持丰富的数据结构。
(9)较强大的多层解决方案role。
2、Chef
Chef是一个功能强大的自动化工具,可以部署,修复和更新以及管理服务器和应用程序到任何环境。
Chef 主要分为三个部分 Chef Server、Workstation 以及 Chef Client。用户在 Workstation 上编写 Cookbook。然后,通过 knife 命令上传到 Chef Server。最后,在 Chef Client 上面实施安装和部署工作。所以,对于 Cookbook 地编写在整个自动化部署中起到了重要的作用。
Chef Server 包含所有配置数据,并存储描述Chef-Client中每个Nodes的Recipe,Cookbook和元数据。配置详细信息通过Chef-Client提供给Nodes。所做的任何更改都必须通过Chef Server进行部署。在推送更改之前,它通过使用授权密钥来验证Nodes和Workstations是否与服务器配对,然后允许Workstations和Nodes之间进行通信。
Workstations 用于与Chef-server进行交互,还用于与Chef-nodes进行交互。它还用于创建Cookbook。Workstations是所有交互发生的地方,在这里创建,测试和部署Cookbook,并在Workstations中测试代码。
Chef命令行工具 是创建,测试和部署Cookbook的地方,并通过此策略将其上载到Chef Server。
Knife 用于与ChefNodes进行交互。
Test Kitchen 用于验证Chef代码
Chef-Repo 是一个通过Chef命令行工具在其中创建,测试和维护Cookbook的存储库。
Nodes 由Chef管理,每个Nodes通过在其上安装Chef-Client进行配置。 ChefNodes 是一台机器,例如物理云,云主机等。
Chef-Client 负责注册和认证Nodes,构建Nodes对象以及配置Nodes。Chef-Client在每个Nodes上本地运行以配置该Nodes。
Cookbook 是Chef 框架的重要基础功能之一。在 Chef Server 对目标机器做安装部署的时候,是通过 Runlist。而 Runlist 里面又包含了一个一个具体的 Cookbook,所以,最终对一个目标机器的部署任务就落到了 Cookbook 上。而对于 Cookbook 来说,其中包含了多个组件,我们可以将 Cookbook 简单地理解成一个容器或者可以理解为一个包,里面包含了 recipes、files、templates、libraries、metadata 等信息。这些信息用于配置我们的目标机器。
3、Puppet
puppet是一种Linux、Unix平台的集中配置管理系统,所谓配置管理系统,就是管理其里面诸如文件、用户、进程、软件包等资源。它可以运行在一台服务器端,每个客户端通过SSL证书连接到服务端,得到本机器的配置列表,然后根据列表来完成配置工作,所以如果硬件性能比较高,维护管理上千上万台机器是非常轻松的,前提是客户端的配置、服务器路径、软件需要保持一致。
客户端Puppet会调用本地facter,facter探测出该主机的常用变量,例如主机名、内存大小、IP地址等。然后Puppetd把这些信息发送到Puppet服务端;
Puppet服务端检测到客户端的主机名,然后会检测manifest中对应的node配置,并对这段内容进行解析,facter发送过来的信息可以作为变量进行处理;
Puppet服务器匹配Puppet客户端相关联的代码才能进行解析,其他的代码不解析,解析分为几个过程,首先是语法检查,然后会生成一个中间的伪代码,之后再把伪代码发给Puppet客户端;
Puppet客户端接收到伪代码之后就会执行,执行完后会将执行的结果发送给Puppet服务器;
Puppet服务端再把客户端的执行结果写入日志。
4、Saltstack
SaltStack是基于python开发的一套C/S自动化运维工具。部署轻松,扩展性好,很容易管理上万台服务器,速度够快。与服务器之间的交流,以毫秒为单位。SaltStack提供了一个动态基础设施通信总线用于编排,远程执行、配置管理等等。它的底层使用ZeroMQ消息队列pub/sub方式通信,使用SSL证书签发的方式进行认证管理,传输采用AES加密。
在saltstack架构中服务器端叫Master,客户端叫Minion。
在Master和Minion端都是以守护进程的模式运行,一直监听配置文件里面定义的ret_port(接受minion请求)和publish_port(发布消息)的端口。当Minion运行时会自动连接到配置文件里面定义的Master地址ret_port端口进行连接认证。
saltstack除了传统的C/S架构外,其实还有一种叫做masterless的架构,其不需要单独安装一台 master 服务器,只需要在每台机器上安装 Minion端,然后采用本机只负责对本机的配置管理机制服务的模式。
saltstack提供如下一些功能:
(1)远程执行:(批量执行命令)在master上执行命令时,会在所有的minion上执行。
(2)配置管理/状态管理 :(描述想到达到的状态,saltstack就会去执行)
(3)云管理(cloud):用于管理云主机
(4)事件驱动:被动执行,当达到某个值会自动触发
这四种自动化运维工具的比较如下,现在主流的基本上ansible和saltstack用的多一些:
一、代码的最大长度。
虽然在Java的编译器中对于代码的最大长度没有硬性的规定。但是如果代码的长度太长,超过了编译器的最当行宽,显然阅读起来比较麻烦。为此根据笔者的经验,通常情况下Java源代码的行长度不应该大于80个字符。如果超过这个长度的话,在一些开发工具和编辑器上就无法很好的显示。如需要通过滚动条来显示后面部分的代码。当其他项目成员阅读这超长的代码时,就会看得眼花缭乱。当人的温饱问题解决了之后,就需要开始注意美观方面的问题。所以程序开发人员在开发应用程序的时候,要尽量避免书写长的代码。如果代码的每行长度确实需要超过80个字符的话(最好将每行代码的长度控制在70个字符左右),那么就需要对代码进行分行。
二、在恰当的地方对代码进行分行。
笔者建议将Java源代码每行的长度控制在70个字符、最大不超过80个字符。当超过这个字符长度的时候,开发人员就需要考虑在恰当的地方对他们进行分行处理。不过这个分行也不是说开发人员想在哪里进行分行就在哪里进行分行。这个分行是有一定技巧的。虽然这些技巧大部分并不是强制性的规定,但是都是一些专家们的经验总结,可以提高代码的阅读性。为此笔者希望各位程序开发能够严格的遵守。
技巧一:高层折行优于低层折行。
这个技巧是说,在考虑对代码进行折行处理的时候,需要注意代码的层次性。如某段代码涉及到混合四则运算,而四则运算又有明显的运算顺序,此时对代码进行折行时就最好能够在四则运算的关键顺序上进行折行处理。如现在有如下的一段代码:
Mynum=mynum1*(mynum1+mynue2+mynum3-mynum4)+8*mynum5
如果要对这段代码进行折行的话,该在哪个地方加入一个折行符号呢?如果是笔者处理的话,笔者会按如下的格式对代码进行折行处理。
Mynum=mynum1*(mynum1+mynue2+mynum3-mynum4)+8*mynum5
这主要是根据四则运算的运算层次来进行折行的。显然,*符号的优先级要比+符号要高。所以在+号前面对其进行折行处理,那么就可以一目了然的反应出代码的运算层次。可以大幅度的提高代码的阅读性。所以代码折行的第一个技巧就是高层折行优于低层折行。如此的话,可以使得应用程序的结构代码更加的清晰,更容易被团队成员所理解。
技巧二:在运算符前面进行折行处理。
其实在如上的折行技巧中,还隐藏着一个规则,即在运算符之前进行折行。如上例所示,笔者就是在+号前面进行折行,而不是在+号后面进行折行处理。这主要也是考虑到代码的可读性。如上面这个例子中,如果在+号后面进行折行处理的话,则下一行就会给人一种凭空多出来的感觉,显得代码很不连贯。跟这个规则类似,如果在折行处理的时候遇到逗号时,那么最好能够在逗号后面进行折行。如在一个方法中,需要传入5个参数。此时如果代码行比较长,那么就需要在几个参数之间进行折行处理。此时最理想的折行位置,就是在某个参数的逗号后面。注意,使在逗号后面进行折行,而不是在逗号前面。因为一个参数一个逗号是匹对的。而如果一个逗号加一个参数,则让人看起来很不舒服。
技巧三:这行代码的对起方式。
当不得已对代码进行折行处理时,下一行的代码应该与其同等级的代码行左对齐。如上例所示,在+号前面将某一段四则运算公式进行折行处理的时候,其+号符号已经采取缩进处理。其缩进后的效果就是要与其同等级的代码行左对齐。如此的话,明眼人一看就知道这段代码采取过折行处理而且跟上一行代码的层次关系。当一段代码被分割成三行甚至跟更多行数的时候,这个规则会非常的有用。如果能够严格遵守这个规则,即使将代码分割成多行,看起来也不会觉得那么混乱。反而给人一种比较有层次的感觉。
另外在采取缩进处理的时候,可以利用Tab键来提高缩进处理的效率。因为直接按空格的话,有可能空格字符数量不一致,会让人觉得层次不起,产生比较大的混乱。一般情况下,当代码行两侧距离页边的距离比较大,看其来不怎么舒服时,可以在代码行中通过插入TAB键(会在代码行中连续插入8个字符)来提高代码的阅读性,让代码的缩进实现统一。
技巧四:为变量寻找一个合适的位置。
在编写应用程序时,尽量将变量声明放置在一个代码块的开始处,也就是说{}花括号的开始位置。虽然说可以在需要使用变量的时候再对其进行声明。但是笔者不同义如此 *** 作。因为如果在的呢感到使用变量的时候再来声明变量时,会降低代码的可读性。同理,也需要避免低层声明与高层声明重复,这样会引起代码混乱并可能引发程序功能性错误。而且这种错误在后续的排错中很难被发现。为此要在应用程序开发的时候就要尽量避免这种错误。
在声明变量的时候,有时候可能代码很简单,生命变量的行总共加起来也不会超过十个字符。此时能否把多个变量的声明写在同一行呢?从就技术上来说,这是可行的。也就是说,Java编译器允许将多个变量定义在同一行上。但是从阅读性上来说,这并不是很好的做法。笔者的建议是,即使变量定义再简单,或者变量比较多,也最好分行进行变量的声明。也就是说,一行声明一个变量。这可以提高代码的可阅读性。而且有时候往往需要对变量加一个注释说明变量的用途,如果以行定义一个变量,添加行注释也相对简单许多。
总之,以上的这些折行的规则基本上不会影响到代码的运行。但是,对于代码的维护与后续的排错、升级、二次开发等等具有不可忽视的作用。而且现在基本上应用程序开发式团队开发,故大家都遵守同样的代码编写规范是非常重要的。笔者在开发一个应用程序的时候,事先都会花一定的时间,跟项目成员强调这些折行的规则。目的只有一个,就是提高代码的可读性,便于后续代码的共享与维护。毕竟后续面对这些代码的,并不是客户,而是我们自己。我们程序员在编写代码的时候,不能够搬起石头砸自己的脚。笔者认为,现在一个合格的程序人员,不仅技术功底上要过得硬,而且还必须要遵守这些无形规则的约束。难怪现在这么多企业在挑选程序开发人员的时候,都会注明良好的编码规范。现在对于这些无形中的条条框框,项目经理已经开始重视起来。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)