aws 通过boto3 python脚本打pach的实现方法
作者:Zhiming's Blog 时间:2021-09-14 23:33:19
脚本要实现的功能:输入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命令脚本中并未给出
来源:https://www.503error.com/2020/aws-通过boto3-python脚本打pach/1761.html
标签:aws,boto3,python,pach
0
投稿
猜你喜欢
实践Python的爬虫框架Scrapy来抓取豆瓣电影TOP250
2021-04-26 21:27:11
OpenCV实现图片亮度增强或减弱
2022-09-16 00:15:04
python设置环境变量的作用和实例
2021-07-03 05:03:17
详解在Anaconda环境下Python安装pydot与graphviz的方法
2021-01-27 23:24:24
Python包装之对象处理
2022-10-15 07:01:33
JavaScript调试之console.log调试的一个小技巧分享
2023-06-28 17:23:49
Go语言通过WaitGroup实现控制并发的示例详解
2023-06-29 01:04:27
python中while循环语句用法简单实例
2021-12-03 22:34:44
Python中更优雅的日志记录方案详解
2023-09-02 13:43:03
Python虚拟机字节码教程之控制流实现详解
2023-01-09 09:56:53
Go语言操作MySQL的知识总结
2024-01-26 01:43:17
关于utf-8格式中截取中英文字符串长度无效的问题
2008-11-25 14:00:00
利用Python和OpenCV库将URL转换为OpenCV格式的方法
2021-08-10 13:41:43
thinkPHP学习笔记之安装配置篇
2023-09-27 18:32:03
pandas实现一行拆分成多行
2021-09-19 16:22:37
两种与SQL Server数据库交换数据的方法
2008-12-10 15:39:00
php利用cookies实现购物车的方法
2023-07-23 08:32:37
vue实现价格日历效果
2023-07-02 17:01:14
一条select语句引起的瓶颈问题思考
2024-01-18 02:40:32
Pycharm 2to3配置,python2转python3方式
2021-07-05 21:39:50