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
  • asp之家 网络编程 m.aspxhome.com