标签归档:Python

python批量给云主机配置安全组

这几年对运维人员来说最大的变化可能就是公有云的出现了,我相信可能很多小伙伴公司业务就跑在公有云上,  因为公司业务关系,我个人接触公有云非常的早,大概在12年左右就是开始使用亚马逊云,后来逐渐接触到国内的阿里,腾讯云等,随着公司业务往国内发展,这几年我们也使用了很多国内的公有云厂商,所以在云运维方面也积累了一些经验,从传统的物理机到公有云运维,我个人认为最大的问题就是你能不能用公有云的思路去思考去实现一个安全稳定、可伸缩和经济的业务构架,云运维是有别与传统运维的,比如说了解公有云的都知道安全组的概念,安全组跟防火墙功能很相似,那我的机器是要设置iptables还是要设置安全组呢?设置了安全组还要设置iptables吗?他们有什么区别?我相信很多人对这些有些困惑,以我个人经验(因为我接触亚马逊后就再也没有给云主机配置过iptables了),我给的建议是如果可以用安全组就不用iptables来管理机器,因为它们有本质的区别:

第一,安全组是在宿主上面的拦截,iptables是在系统层面的拦截,也就是说如果有人想攻击你,你采用的是安全组方式,这个攻击包根本就到不了你机器上。

第二,配置iptables是项复杂的工程,如果稍有不慎,后果是毁灭性的,我猜测有过2年运维经验小伙伴应该有把自己关在主机外面的经历,如果采用安全组这方面是可控的,即使有问题,你基本上也可以快速恢复。

第三,iptables是在每台服务器上写大量的重复规则,而且不可以分层去管理这些规则,安全组是按层来管理机器的安全配置,只需调整你需要改动的部分就可以实现批量去管理机器。

ok,概念就介绍到这里,接下来我们要上干货了,因为给几百条机器配置不同的安全组也是个大工程,如果你在控制台去操作,我想你会疯掉,所以这就说到如何去管理和操作这些安全组了,因为公有云都有自己的API接口,所以调用他们的API来实现一些自动化操作事非常方便的,今天我就分享下如何批量给大量机器添加和移除安全组,脚本本身是在qcloudcli的基础上封装了一层,脚本如下:

这个脚本支持批量增加和删除某个安全组,-f后面接一个文件,写入实例的id的列表,-g后面是要增加和删除的安全组Id,-m后面支持add 和remove操作,就是增加或删除,脚本整体思路是先找出实例的安全组列表,然后将新的安全组Id在列表中加入或移除,脚本就介绍到这里,欢迎小伙伴们留言交流。

这篇属于中间插入的一篇文章,下篇我们还要继续我们基础知识的讲解了,喜欢的小伙伴请帮忙转发。

python基础6-集合类型

今天我们要了解的是集合类型,也是我们要说的最后一个基本数据类型了,集合(set)数据类型很像字典的key,因为它不可以重复,而且无序, 但它不是映射对应关系,就像是没有value的字典,创建一个集合只能用函数set(),这些就是集合的基本特性,我们还是看几个例子来了解下set的使用:

集合的创建和值访问:

创建集合我们用set方法,我们传入一个字符串,就创建了一个集合类型, 可以看出生成的集合值是不重复的,helloworld有三个l,但集合自动删除重复,只保留一个元素,另外访问集合元素的方法我们可以用for循环来遍历一个集合的所有元素。

集合操作符:

集合的操作符跟我们上学时候的集合得概念一样,两个集合直接可以求交集,并集,对应到集合的操作符就是‘|’和‘&’,并集就是求出的新的集合每个元素都至少是其中一个集合中的成员,交集就是这个新集合同时属于这两个集合的成员,例如:

集合的基本操作就是这些,可能有的小伙伴不知道集合用在哪里合适,其实还是要根据自己的实际情况,千万不要觉得某些数据类型没用,只能说暂时没用到而已,发明python的大神也不傻子,他肯定不会创造一个每个人都不会用的数据类型出来,为让大家更容易理解并应用,下面我说两个集合的应用场景。

集合常用的就是列表去重, 假设你有个列表,这个列表里有很多重复元素,你想快速删除重复元素,得到一个没有重复元素的列表,用set是最快的,最后再将set转成列表,就生成了一个没有重复元素的列表,如下:

第二个应用场景是,假如你现在有两个比较大的列表A和B,现在的任务是找出包含在A列表但不在B列表中的元素,这个时候一般的做法可以用列表表达式来做:

(x for x in A if x not in B)

这个方法本身没什么问题,但前提就是如果列表的元素非常的多,这种方法就会非常慢,那我们可以换一种思路去解决,

set(A) – set(B)

这个思路是用集合的概念去解决,‘-’号是集合中的差补,就是求出的新集合只能属于集合A,但不属于集合B,这种方式要比第一种要快很多,有喜欢的小伙伴可以做个测试,给大家分享下测试结果,这篇就到这里,关于Python的数据类型我们就全部介绍完了,在这些基础上我们接下来要了解语句结构例如If/else,for循环语句等。

如果喜欢这系列文章,请大家帮忙转发,您的转发是我继续写的动力,谢谢。

python基础5-字典

字典是python中的映射数据类型,映射类型对象里哈希值key,指向对象value,如果value是多个,就是一对多关系,字典是以键值对的形式存在的,在Python的数据类型中,字典数据类型算是比较重要的数据类型,在后续web编程中经常会用到字典数据类型去传递数据和渲染模板,所以这个数据类型是我们要花时间必须熟练掌握的数据类型,往下我们介绍字典常见操作。

1、创建字典,字典是{}形式的,所以{}就表示是个空字典,当然我们也可以给赋值给一个字典,例如:

这里建了三个字典,第一个表示是空字典,创建字典是注意,Key必须是不可变对象,必须是可hash,以为访问字典是通过key的hash值去访问的,所以像字符串,元组就可以做为Key,列表是可变对象,就不可以做为key,字典的值可以是字符,数字,列表等数据类型。

我们还可以用内置函数dict()来创建字典:

 

另外我们还可以通过表达式的方式创建一个字典:

 

2、字典的值访问,可以通过key去访问字典中的某个值,如果要遍历一个字典就用for循环,如下:

还有一种方式是用Item()函数:

3、字典更新和增加元素,如果字典中的键已经存在就更新这个键对应的值,如果没有就会新增一个键值对数据,例如:

4、删除字典元素和字典,日常脚本中最多的是删除某指定个元素,这是我们可以用pop()函数,如果要任意删除一个可以用popitem()函数,这个函数官方文档说的是删除任意元素,返回key,value,但实际运行的时候发现还是顺序一个一个来删的,测试了几个没有找到具体原因,有了解的可以探讨下, clear()函数会删除所有的条目,如下:

5、字典排序,前面我们说了,因为字典是无序的,但我们平时编写脚本时经常要对生成的字典进行排序, 方法如下:

itertems()函数得到字典的key,value, d[1]是字典的值,意思就是按值来排序,如果是d[0]那就是按键来排序,reverse默认是从小到大排列,True表示翻转就是从大到小排列。

6、其它常用的方法

items():返回字典的key,value

keys(): 返回字典的key

get(key[,d]) :返回key对应的值,如果不存在返回None

update(d2): 将一个字典添加到现在字典中

len():  返回字典长度

values() :返回字典的value

setdefault(key[,d]) : 如果字典中不存在这个键就给它设置成默认值。

关于字典就介绍到这里,欢迎小伙伴帮忙转发。

python基础4-列表操作

上篇我们学习了python的字符串类型,了解了字符串的不变性,今天我们接着学习新的数据类型-列表,列表也是序列式的数据类型,跟字符串一样,支持下标和切片操作,但列表跟字符串不同的是它是可变类型,就是它是可以改变的,这个数据类型在后续我们编程中用的非常的多,比如将读出的IP放到列表中,然后读取执行,这些后续我们写实际脚本时再说,我们先从最基础的,如何创建列表开始:

1、创建列表方式,一种是用[],一种是用list()函数,这二种方法都可以创建一个列表,如下:

如果[]里什么都没有,就创建了一个空列表,在列表里的内容称为列表元素,元素类型可以使python支持的标准类型。

2、列表的元素数据访问,刚开始我们也说了,列表是序列类型,所以它支持切片和下标的访问,例子如下:

因为这个跟字符串操作非常类似,所以我们不在多说。

3、列表操作函数

关于列表的操作有很多的方便可用的函数,这里我们跟字符串一样,也挑一些比较常用的来举例说明下,其它函数如果后续用到我们再说。

append()函数: 作用是添加列表的元素在尾部,接收一个参数,然后将改元素加入列表的尾部,举例如下:

extend()函数:作用是扩展一个列表,这个函数类似把两个列表相加,例如:

remove() : 作用根据指定的值删除一个元素,当列表元素被删除后,位于它后面的元素自动迁移,然后列表长度减一,举例:

pop():这个函数会返回指定下标位置的元素,如果不给指定下标,它默认使用-1,例如pop(0)返回列表的头元素,pop()返回列表的尾部元素,但这个函数在获取后就会自动将这个元素在列表中删除,例如:

如果这个函数不带参数会比较有意思,因为它跟append()函数的作用相反,一个是从尾部加,一个是从尾部减,这个结构就是大学数据结构课程中的-栈,即后进先出,可以假设有个空列表,运行append()就是压栈的操作,pop()就是出栈的操作,那如果加入下标0,即pop(0),那这样列表就形成了一个队列,跟去公园买票排队一样,先进来的先出去,即先进先出,这也是一种队列方式,这两种方式在后续编程中非常有用,如果后续我们有用到,我们会详细说。

count()函数用来统计列表中元素的重复个数,如果我们生成了一个列表,想要获取某元素在列表中出现的次数,可以用这个函数,例如:

len()函数,跟字符串的len函数功能一样,返回列表的长度,这个比较简单就不多说了。

基本函数我们就说讲这么多,后续有特殊的我们详细再谈,接下来我们说一下列表的一些关系操作

4、列表关系操作,in, not in

关系操作就是检查判断一个对象是不是一个列表的成员,如果存在返回True, 否则返回False, 一般常用与条件语句中,例如:

具体的条件语句我们后续会单独详细说,在这里就不展开了,这种关系操作后续编程中也非常有用。

5、列表转字符串操作

在日常处理列表中,有一个比较常见的操作就是要求将一个列表转成一个字符串,这里我们可以用join()函数实现,例如:

6、列表解析,这部分内容我们在讲循环的语句的时候会单独说,它在编程中也比较常用,这个功能可以让我们动态的生成列表。

写到这我们也基本把列表也说完了,除了这些数据类型,理解python的赋值语句(等于号)也非常关键,在最后我给出一个例子,请大家一起理解下这些语句的意义,如果有问题可以留言交流。

关于列表的学习就到这里,欢迎大家留言交流,如果觉得还不错,请帮忙转发。

python基础3-字符串操作(2)

这篇我们接上一篇把字符串类型没有说的完的接着说完,我们先说字符串的不变性,在Python中字符串类型是一种不可变的数据类型,就是说它的值不能被改变或修改,那什么意思呢,就是我们如果要想修改一个字符串就只能通过生成一个新字符串的方式来操作,也许有的小伙伴会说,不是呀,字符串是能修改的呀,比如这个例子:

这看起来像是字符串可变,但实际上在Python内部自动为你创建了一个新的字符串,这2个语句是赋值语句,后者覆盖了前者,那你可能会问,那字符串的不变性体现在哪里呢?我们接着看下一个例子:

目前看没什么问题,我们都可以理解,下面我修改foo的值,在输出ba的值:

结果跟你想的一样吗?是不有人说,应该输出"hanging on in spam”才对呀,因为我重新给foo赋值了呀, 抱歉,即使你跟foo重新赋了值,但ba的值仍然不变,因为ba是一个新的字符串,这就是字符串的不变性,它一旦被创建就不再改变。

关于字符不变性我们就说到这里,接下来我们开始了解一些字符串内建操作函数,因为字符串内建函数非常的多,我不可能全部写出来,所以就挑了一些相对比较常用的来说了:

1、len():这个最简单,统计字符床长度的(包括空格),一般用于我们条件判断中,比如我们看下ba的长度:

2、strip():这个函数用来去掉字符串左右空格,这个函数比较有用,一般我们从文本中读出来的字符都要先strip(),确保它没带特殊字符,除了strip(),还有lstrip(),rstrip(),就是去掉字符串的左空格和有空格,如下:

3、join(seq):这个函数用来把一个序列的元素合并成一个新的字符串,比如我们要将一个列表中的元素合并成一个字符串,关于列表数据类型我们下篇会说,例子如下:

4、split(seq,num):这个函数用来把字符串分割成一个列表,其中seq是分隔符,num是分割的次数(可省),例如:

5、replace(s1,s2,num): 这个函数需要三个参数,num参数非必须,s1将会替换成s2, 这个在做字符串替换时非常有用,例如:

6、encode(encoding,errors):字符串的编码,这个函数让我们轻松应对字符串的编码问题,其中encoding可以有很多中,例如常见的有gb2312 gbk gb18030 bz2 zlib big5 bzse64等,最场景的应用就是在写入文件之前统一将字符串编码格式进行转换为utf-8类型,然后写入文件中:

7、startswith(s,start,end):这个函数判断字符串的开头是否以s开始,如果是返回True,否则返回False,记住这个函数返回的是一个bool值,不是返回字符串,你要实现类似shell中的grep功能,就需要自己加个判断,然后print输出,例如:

想对于的还有endswith,用法基本类似,就不在举例了。

关于字符串的内建函数部门就暂时说这么多吧,后续如果有用到其它函数我们单独在说,最后我再强调一下,python中字符串对象是不可改变的,我们一旦创建一个字符串后,我们在上面用任何函数的改变都会返回一个新的字符串,原串并没有变,所以在日后的编程中要注意这一点。

写在最后:码字不易,如果觉得不错,还请大家帮忙转发。