aws 通过boto3 python脚本打pach的实现方法
作者:Zhiming's Blog 发布时间:2021-09-14 23:33:19
标签: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命令脚本中并未给出
来源:https://www.503error.com/2020/aws-通过boto3-python脚本打pach/1761.html


猜你喜欢
- pycharm中光标变粗,如下:原因:光标进入了改写状态。解决方法:按一下键盘中的Insert键就好了。
- 一、背景(正)地理编码指的是:将地理位置名称转换成经纬度;逆地理编码指的是:将经纬度转换成地理位置信息,如地名、所在的省份或城市等百度地图提
- 生产者代码:# -* coding:utf8 *- from pykafka import KafkaClient host = '
- 这段时间因为要做个网站,而空间又不支持ASP,所以又拿起JavaScript教程看了下,看能不能在静态的空间里实现动态,当然,这个动态不是真
- JSON 基础简单地说,JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在函数之间轻松地传递这个字符串,
- 前言图像分割在医学成像、自动驾驶汽车和卫星成像等方面有很多应用,本质其实就是图像像素分类任务,也就是使用深度学习模型为输入图像的每个像素分配
- 需求分析:项目中根据测得的数据在界面上实时绘制运行环境:Python 3.7 + Matplotlib 3.0.2 + PyQt 5matp
- 前言做前端开发几年,在项目中用到数组去重的机会倒不是很多,但是在面试的时候却经常被问到,个人理解,这道题真正考的是对JavaScript的基
- 本文实例讲述了pymssql数据库操作MSSQL2005的方法。分享给大家供大家参考。具体如下:使用的MSSQL2005,通过pymssql
- 代码使用方法:0001:判断一个计算结果是不是无穷大:if(isFinite(999999999*999999999) == true)--
- 如下所示:解读: transpose( ) 方法的参数是一个 由 轴编号(轴编号自0 开始) 序列构成的 元组。开始时,数组的轴编号序列是默
- var tipsWidth = $(".Loading").css("width").replace
- 从python2到python3,这两个版本可以说是从语法、编码等多个方面上都有很大的差别。为了不带入过多的累赘,Python 3.0在设计
- Windows下ORACLE完全卸载:使用OUI可以卸载数据库,但卸载后注册表和文件系统内仍会有部分残留。这些残留不仅占用磁盘空间,而且影响
- 1. 背景在软件需求、开发、测试过程中,有时候需要使用一些测试数据,针对这种情况,我们一般要么使用已有的系统数据,要么需要手动制造一些数据。
- 如何编写CSS代码才能更有效率?这是许多网页制作者与开发者都关心的问题。大概没有什么魔法,可以保证一下就把你的样式表缩小到百分之多少,但合理
- 如下所示:function makeAcquire($nUsers,$nAwards) { &
- 本文实例讲述了ThinkPHP5.0框架控制器继承基类和自定义类。分享给大家供大家参考,具体如下:继承系统控制器基类:<?phpnam
- MySQL安装程序为您所有的MySQL软件需求提供了一个易于使用,基于向导的安装体验。产品中包含以下最新版本:MySQL服务器MySQL连接
- 最近在学习python网络编程这一块,在写简单的socket通信代码时,遇到了struct这个模块的使用,当时不太清楚这到底有和作用,后来查