aws 通过boto3 python脚本打pach的实现方法
脚本要实现的功能:输入instanceid
1:将所有的volumetakesnapshot
2: 获取publicip并登陆机器执行ps命令记录patch前进程状态已经端口状态
3:获取机器所在的elb
4: 从elb中移除当前机器
5:检查snapshots是否完成
6:snapshots完成后patching
7: patching完成后将instance加回到elb
#!/usr/bin/python #vim:expandtab:tabstop=4:shiftwidth=4 '''scripttogetecrinfo''' #Reason:disableinvalid-namebecausepylintdoesnotlikeournamingconvention #pylint:disable=invalid-name importtime importboto3 importsys importargparse defget_volume(ec2,instanceId): result=[] instance=ec2.Instance(instanceId) volumes=instance.volumes.all() forvolumeinvolumes: print("Volumeattachedtothisinstanceis:"+volume.id) result.append(volume.id) returnresult deftake_snapByInstance(client,instanceId): response=client.create_snapshots( Description='string', InstanceSpecification={ 'InstanceId':instanceId, 'ExcludeBootVolume':False }, TagSpecifications=[ { 'ResourceType':'snapshot', 'Tags':[ { 'Key':'orginName', 'Value':'patchbackup'+instanceId }, ] }, ], DryRun=False, CopyTagsFromSource='volume' ) print("Creatingnewsnapshotsforinstances:"+response['Snapshots'][0]['SnapshotId']) returnresponse['Snapshots'][0]['SnapshotId'] defget_publicIp(ec2,instanceId): instance=ec2.Instance(instanceId) publicIp=instance.public_ip_address returnpublicIp deftake_screenshotOfProcess(public_ip): print("Pleaserunthiscommandonyourlocalmachine") print('ssh-t'+public_ip+'"sudonetstat-tnpl>disk.listen"') print('ssh-t'+public_ip+'"sudopsauxf>disk.ps"') defget_elbInfo(client_elb,ec2,instanceId): bals=client_elb.describe_load_balancers() forelbinbals['LoadBalancerDescriptions']: #print('ELBDNSName:'+elb['DNSName']) #checkiftheelbistheelbofinstance ifinstanceIdinelb['Instances']: print("foundelb"+elb['DNSName']) else: pass defremove_fromElb(client_elb,elb,instanceId): response=client_elb.deregister_instances_from_load_balancer( LoadBalancerName='elb', Instances=[ { 'InstanceId':instanceId }, ] ) defadd_backElb(client_elb,elb,instanceId): response=client.register_instances_with_load_balancer( LoadBalancerName=elb, Instances=[ { 'InstanceId':instanceId }, ] ) defcheck_snapStatus(ec2,snaps): snapshot=ec2.Snapshot(snaps) snapshot.load() print(snapshot.state) returnsnapshot.state defmain(ec2,client,instanceId,client_elb): print("goingtopachinginstanceid:"+instanceId) #getvolumes volumes=get_volume(ec2,instanceId) #getpublicip public_ip=get_publicIp(ec2,instanceId) #takesnapshot snaps=take_snapByInstance(client,instanceId) #takescreenshotofprocssandport take_screenshotOfProcess(public_ip) #getelbinfo elb=False #elb=get_elbInfo(client_elb,ec2,instanceId) #removefromelb ifelb: ans_remove=input("Areyousuretoremovetheinstancefromtheelbnow?Yes/No") ifans_remove=='Yes': #removefrominstance remove_fromElb(client_elb,elb,instanceId) #checksnapshotstatus snapshotStatus='' check_snapStatus(ec2,snaps) print("checkingstausofsnapshots") whileTrue: snapshotStatus=check_snapStatus(ec2,snaps) print(snapshotStatus) ifsnapshotStatus=='completed': break else: time.sleep(10) #paching paching_cmd='Yourpachingcommand' print(paching_cmd) #addtoelb ifelb: ans_add=input("pleaseconfirmthepatchingisover,inputyestocontinue") ifans_add=='Yes': add_backElb(client_elb,elb,instanceId) if__name__=="__main__": ec2=boto3.resource('ec2',region_name='us-east-1') client=boto3.client('ec2',region_name='us-east-1') client_elb=boto3.client('elb',region_name='us-east-1') main(ec2,client,'i-abcasdfa111122',client_elb)
注意,本脚本并未包含链接机器并执行命令的部分,仅仅是打印出命令,需要手动执行take_screenshotOfProcess已经patch的命令,此部分也参考之前的文章,完全自动化,不需要手动执行
另外Patch命令脚本中并未给出
总结
到此这篇关于aws通过boto3python脚本打pach的实现方法的文章就介绍到这了,更多相关aws通过boto3python脚本打pach内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!