运维,我想过一个没有故障的春节

在过五天就是春节了,估计心急的小伙伴早已经踏上了回家的火车或者已经吃上了家里的妈妈给做的团圆饭, 现在办公室已经没有干活的气氛了,到处洋溢着喜悦的气氛, 现在在岗位的同事我用手都可以数的过来,旁边的同事回家的箱子已经放到工位了,今天晚上的火车下班直接回家;前面的同事因为是明天走,现在在安静的看新闻打发时间; 还有几个在聊天的,也许每一年只有在这个时候大家才是真正的放松,因为除了工作本身压力减少外,还有马上要跟家里人团聚的喜悦心情,这就是春节的魅力,它跟一年中每个节日都不同。

在互联网公司里,运维岗位春节假期会稍有不同,因为它是一个没有严格意义上休假的概念,因为维护是公司生产环境,分分钟故障都会影响公司收入,必须有着时刻上战场的准备, 所以作为运维人每到节假日心里都总有些不是那么痛快,一方面想的是痛快的过个好假期,另一个方面却担心如果线上出问题,因为只要有问题就要花时间去解决,说个极端的例子:比如大年初一你在家里吃团圆饭,这时你收到一个报警短信告诉你某台机器宕机了,你是不是要马上去处理,等你处理完,估计好心情都没有了。但这是我们运维人的职责,我们不必抱怨,不必自责,要明白这才是我们作为一个运维人的基本价值:保障公司线上业务的稳定。

上面的例子也许太极端,但也反应出我们运维人日常的工作场景,有没有什么办法能减少这样的事情发生,当然最简单的办法就是防患于未然, 放假前检查工作提前做,别被动等问题发生, 那该检查什么呢? 在这里我总结一些点给大家参考:

线上生成环境检查

  • 监控报警可用性检查
  • 业务是否有备机,保证机器坏了可以及时找其他机器替换。
  • 有故障可能性的机器要提前更换,别等着它挂。
  • 如果有业务节假日更新,注意更新日期,别当天一高兴喝高了,给忘记了(这事貌似每年都有)
  • 业务相关人的联系方式,这个很重要,有时候出问题不是你一个人解决的,别到时候找不到人,耽误时间。
  • 了解故障汇报机制,出问题如果不在自己的控制范围内,要及时联系领导去解决,别等着,要知道每耽搁一分钟对公司来说都是致命的。

先总结这么多,欢迎小伙伴们补充,这就马上春节了,请春节期间小伙伴注意自身安全,饮酒适度, 未来二周我讲暂停更新,确保不骚扰大家,让大家过个好年, 最后在这里也祝大家新春快乐,阖家欢乐!

调用zabbix API获取主机

zabbix 作为企业级的系统和网络监控方案,对于中小型公司来说基本可以很好的满足对机器的监控需求,因为其部署方便,操作简单深受现在各个互联网公司喜爱,所以现在基本的互联网公司监控用zabbix的非常多,当你安装好zabbix服务端 后,如果启动自动注册功能,在所有客户机安装后会自动在zabbix平台上被监控到,但这里有个问题,如果你机器数量非常少,如果还能数的过来那基本没什么问题,但如果你机器上千台了,这个时候那些机器被监控中,那些没被监控,查起来就没那么方便了,所以日常运维中经常发现的问题就是某台机器故障了但没报警,经查发现这台机器zabbix客户端因为某种原因导致没有被服务端监控到,像这种问题怎么办呢?其实最简单的方案就是从zabbix里获取所有被监控的服务器列表,然后跟运维资产数据库去比对,如果数量一致,那说明监控没漏机器,如果比对不上,就把对不上的IP发出来再报个警就可以了,整体逻辑就是这样,我们今天用zabbix api获取被监控的所有机器列表,代码如下:

 

脚本一共分二部分,第一部分是用户登录,登录后然后获取主机列表,最后写到一个文件里去,所以脚本运行的结果是生成一个所有被监控的IP列表,通过这个列表你就可以去跟你的资产库信息去对比了,还有这个脚本用的requests,所以看起来要清爽很多,代码比较简单,就是二个post就不做太多解释了,今天就到这里,喜欢的小伙伴可以在此基础上修改成合适自己业务的脚本。

如何过好2017年?

2016匆匆就过去了,除了感叹时间的流逝, 我想我还应该做点什么, 人们都说每个人对待时间的态度最大的区别就是看这个人是否有自己的目标, 星爷也说过一句特别经典的台词“人若没有目标,跟咸鱼有什么区别”,我特别赞同这句话,因为每个人的时间是有限的,如何在有限的时间内完成更多的事而不是碌碌无为的过日子,目标在这里起了决定性作用,如果每天自己都不知道自己要什么的人,我想几年之后他很可能落后于有清晰目标的人,这就跟二个人在大森林里迷了路是一样的,其中一个找到了方向,始终朝着一个方向走,相信自己终有一天能走出去,另一个没有方向的一会东走走,一会西瞅瞅,时间就这么浪费了,自己却终其一生也无法走出自己生命的藩篱。

既然知道目标的重要性,那我接下来我们看怎么定目标,不得不说定目标是件非常复杂的工程,我相信如果有2个工作摆在你面前一个是定目标,一个是写python脚本,作为运维人一般都会选择后者,为什么? 因为我们会觉得它没什么技术含量,它却要花掉你很多时间,貌似也给我们带来不了成就感,但我认为这些投入是非常值得的,如果你不投入这些时间,那么在未来你会浪费掉更多的时间, 当然考虑到这是个复杂的系统工程,为更方便的让每个人能够设定好自己2017年的目标,我列出了几个问题,大家可以根据自己的情况回答这些问题:

第一,你在过去的一年里工作上有什么进步或成果?那在2017年你希望有那些进步?

第二,在过去一年里什么事一直想做没有做?那在新的一年你打算怎么启动?

第三,你家庭或父母在过去的一年你都做了那些事情?在新的一年打算怎么做?

第四,你在过去的一年身体状况如何?那在新的一年有什么打算和爱好,身体毕竟是革命的本钱。

第五,你个人的能力方面,不管是技术方面是否有提升?在新的一年如何去做?

第六,在过去的一年你交了那些新的朋友?人际关系如何?那在新的一年你打算如何去做?如何去混入你想进入的圈子?

为符合每个人的需求,我尽可能用通用的语言来表达,当然这些问题的答案需要抽练,因为目标越简练越好, 你不能把每个问题的答案都写成5000字的作文, 如果总结到最后这一年你要做的事很多,就要排优先级,可以按时间四象限法则来划分,另外最终形成目标的过程一定是要具体的,什么是具体的的目标,我先举个反例:

2017年我要学python

这个就是典型的不具体的目标,真的具体的的目标是我要把“”python运维技术“公众号所有代码例子搞懂并实现一遍,这才是目标。

经过上面抽练,我相信大家的目标也都定出来了,接下来在2017年可以实施了,每个认都知道行动最重要,但每次都不展开行动, 为什么? 除了懒还有你缺少方法, 当然限于篇幅方法问题就不展开说了,如果有兴趣的小伙伴欢迎留言探讨,另外这句话你可打印出来放到你经常能看到的地方: Do it,  Never give up!    这也许是实现目标的最好方法没有之一。

 

你应该学会的python列表去重

列表去重是写Python脚本时常遇问题,因为不管源数据来自哪里,当我们转换成列表的方式时,有可能预期的结果不是我们最终的结果,最常见的就是列表中元素有重复,这时候第一件事我们就要做去重处理,我们先来个最简单的方式,用python内置的数据类型set来实现。

假设我们的列表数据是这样的:

因为集合的元素是不能重复的,所以将列表转换成集合时,会自动去掉重复的元素,这就是基本原理,代码如下:

这种方式缺点是再转换成列表时无法保存之前的列表顺序,如果没这个要求,这种方式是最简答的, 也许有的小伙伴觉得好简单呀,这没什么技术含量吗,没错,所以一般面试题里让你列表去重一般会这么写:

请写出列表去重的方法(不能用set)

人家写明不能用set了,所以呢,这招有时候还不能用,那当然也难不倒我们,我们还有其他方法。

我们都知道列表可以遍历,能遍历问题也就简单了,我们再定义空列表,然后遍历有数据的列表,再遍历时加一个判断,如果在空列表里没有,就加进去,如果有了就丢掉,代码如下:

 

大家觉得这种方式是不是还可以,但这种方式对付一般的小列表是没问题的,但如果遇到一个超级大列表,也会力不从心,因为在the_list列表变的非常大,在判断时候会影响效率,因为列表是按索引顺序去查找的,当数据量很大时会变慢。

也许你要问了,那我遇到大的列表咋办? 有更牛掰点的方法吗?当然有,让我们继续,既然在判断时用列表会影响效率,那我们就转换一个思路,我们用集合,那你可能要问了,那集合就快了?没错,因为set使用的hash函数查找值,虽然set无序,但位置是固定的,只需一次就可以查到特定元素是否存在,网上有人做了列表和set的元素查找对比,相同的数据条件下,用list耗时16分钟,用set耗时是52秒,这一对比看出效果了吧,别的不多说了,贴代码:

列表去重的方法就介绍到这里,欢迎转发~

python按任意键继续程序

在windows下写bat的时候,通过pause命令,可以暂停程序运行,例如经常见的程序会在终端提示”按任意键继续……”,用户在终端回车后程序可以接着运行,这个功能有多大用途今天暂且不说,但我觉得应该有很多人也想在python下实现这个功能,这样当自己写的python程序运行时, 突然给出这么一个提示,然后自己再来个帅气的回车,我觉得肯定给人一种非常专业的感觉,最起码自己肯定被自己迷倒了,所以今天我们就学习下这段代码,这里定义了一个函数,所以你可以嵌入到你的程序中,在任何你希望调用的地方调用它即可,使用非常的方便,代码如下:

#!/usr/bin/env python

# -*- coding:utf-8 -*-

import os

import sys

import termios

def press_any_key_exit(msg):

# 获取标准输入的描述符

fd = sys.stdin.fileno()

# 获取标准输入(终端)的设置

old_ttyinfo = termios.tcgetattr(fd)

# 配置终端

new_ttyinfo = old_ttyinfo[:]

# 使用非规范模式(索引3是c_lflag 也就是本地模式)

new_ttyinfo[3] &= ~termios.ICANON

# 关闭回显(输入不会被显示)

new_ttyinfo[3] &= ~termios.ECHO

# 输出信息

sys.stdout.write(msg)

sys.stdout.flush()

# 使设置生效

termios.tcsetattr(fd, termios.TCSANOW, new_ttyinfo)

# 从终端读取

os.read(fd, 7)

# 还原终端设置

termios.tcsetattr(fd, termios.TCSANOW, old_ttyinfo)

if __name__ == “__main__”:

press_any_key_exit(“按任意键继续…”)

print ‘\n’

代码不多解释,看注释,这里要说一下termios模块,这个模块提供了一个接口可以控制tty终端的Io,它所有函数第一个参数需要一个文件描述符,可以是整型的文件描述符,也可以是个文件对象,因为它可以控制在终端的显示设置,常用场景就是用户在终端输入密码时不要显示出来,就跟我们用root登陆系统时系统给出输入密码提示符一样, 代码实现如下:

def getpass(prompt=”Password: “):

import termios, sys

fd = sys.stdin.fileno()

old = termios.tcgetattr(fd)

new = termios.tcgetattr(fd)

new[3] = new[3] & ~termios.ECHO

try:

termios.tcsetattr(fd, termios.TCSADRAIN, new)

passwd = raw_input(prompt)

finally:

termios.tcsetattr(fd, termios.TCSADRAIN, old)

return passwd

passwd = getpass()

print passwd

这个脚本运行会提示你输入密码,输入后会打印出刚输入的密码,给这个2个例子也是说明termios的简单用法,大家可以自己运行程序去体会下。