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内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!