小编这次要给大家分享的是aws如何通过boto3 python脚本打pach,文章内容丰富,感兴趣的小伙伴可以来了解一下,希望大家阅读完这篇文章之后能够有所收获。
脚本要实现的功能:输入instance id
1:将所有的volume take snapshot
2: 获取public ip 并登陆机器执行 ps 命令记录patch前进程状态已经端口状态
3:获取机器所在的elb
4: 从elb中移除当前机器
5:检查snapshots是否完成
6:snapshots完成后patching
7: patching完成后将instance加回到elb
#!/usr/bin/python
# vim: expandtab:tabstop=4:shiftwidth=4
''' script to get ecr info '''
# Reason: disable invalid-name because pylint does not like our naming convention
# pylint: disable=invalid-name
import time
import boto3
import sys
import argparse
def get_volume(ec2, instanceId):
result = []
instance = ec2.Instance(instanceId)
volumes = instance.volumes.all()
for volume in volumes:
print("Volume attached to this instance is :" + volume.id)
result.append(volume.id)
return result
def take_snapByInstance(client, instanceId):
response = client.create_snapshots(
Description='string',
InstanceSpecification={
'InstanceId': instanceId,
'ExcludeBootVolume': False
},
TagSpecifications=[
{
'ResourceType': 'snapshot',
'Tags': [
{
'Key': 'orginName',
'Value': 'patch backup'+ instanceId
},
]
},
],
DryRun=False,
CopyTagsFromSource='volume'
)
print("Creating new snapshots for instances:" + response['Snapshots'][0]['SnapshotId'])
return response['Snapshots'][0]['SnapshotId']
def get_publicIp(ec2, instanceId):
instance = ec2.Instance(instanceId)
publicIp = instance.public_ip_address
return publicIp
def take_screenshotOfProcess(public_ip):
print("Please run this command on your local machine")
print('ssh -t ' + public_ip + ' "sudo netstat -tnpl > disk.listen"')
print('ssh -t ' + public_ip + ' "sudo ps auxf > disk.ps"')
def get_elbInfo(client_elb, ec2, instanceId):
bals = client_elb.describe_load_balancers()
for elb in bals['LoadBalancerDescriptions']:
#print('ELB DNS Name : ' + elb['DNSName'])
#check if the elb is the elb of instance
if instanceId in elb['Instances']:
print("found elb " + elb['DNSName'])
else:
pass
def remove_fromElb(client_elb, elb, instanceId):
response = client_elb.deregister_instances_from_load_balancer(
LoadBalancerName='elb',
Instances=[
{
'InstanceId': instanceId
},
]
)
def add_backElb(client_elb, elb, instanceId):
response = client.register_instances_with_load_balancer(
LoadBalancerName= elb,
Instances=[
{
'InstanceId': instanceId
},
]
)
def check_snapStatus(ec2, snaps):
snapshot = ec2.Snapshot(snaps)
snapshot.load()
print(snapshot.state)
return snapshot.state
def main(ec2, client, instanceId, client_elb):
print("going to paching instanceid: " + instanceId)
#get volumes
volumes = get_volume(ec2, instanceId)
#get public ip
public_ip = get_publicIp(ec2, instanceId)
#take snapshot
snaps = take_snapByInstance(client, instanceId)
#take screenshot of procss and port
take_screenshotOfProcess(public_ip)
#get elb info
elb = False
#elb = get_elbInfo(client_elb, ec2, instanceId)
#remove from elb
if elb:
ans_remove = input("Are you sure to remove the instance from the elb now? Yes/No")
if ans_remove == 'Yes':
#remove from instance
remove_fromElb(client_elb, elb, instanceId)
#check snapshot status
snapshotStatus = ''
check_snapStatus(ec2, snaps)
print("checking staus of snapshots")
while True:
snapshotStatus = check_snapStatus(ec2, snaps)
print(snapshotStatus)
if snapshotStatus == 'completed':
break
else:
time.sleep(10)
#paching
paching_cmd = 'Your paching command'
print(paching_cmd)
#add to elb
if elb:
ans_add = input("please confirm the patching is over , input yes to continue")
if ans_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如何通过boto3 python脚本打pach的文章,如果觉得文章内容写得不错的话,可以把它分享出去给更多人看到。