aws 通过boto3 python脚本打pach的实现方法


Posted in Python onMay 10, 2020

脚本要实现的功能:输入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的实现方法的文章就介绍到这了,更多相关aws 通过boto3 python脚本打pach内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
详细介绍Python语言中的按位运算符
Nov 26 Python
python编写暴力破解FTP密码小工具
Nov 19 Python
python中xrange用法分析
Apr 15 Python
Python操作MongoDB详解及实例
May 18 Python
Python实现多并发访问网站功能示例
Jun 19 Python
Python单例模式的两种实现方法
Aug 14 Python
python自动截取需要区域,进行图像识别的方法
May 17 Python
python 划分数据集为训练集和测试集的方法
Dec 11 Python
numpy中的ndarray方法和属性详解
May 27 Python
Python浮点数四舍五入问题的分析与解决方法
Nov 19 Python
Python多线程操作之互斥锁、递归锁、信号量、事件实例详解
Mar 24 Python
在 Python 中使用 7zip 备份文件的操作
Dec 11 Python
Django 设置admin后台表和App(应用)为中文名的操作方法
May 10 #Python
基于python实现上传文件到OSS代码实例
May 09 #Python
使用python创建生成动态链接库dll的方法
May 09 #Python
浅析python 动态库m.so.1.0错误问题
May 09 #Python
Python实现常见的几种加密算法(MD5,SHA-1,HMAC,DES/AES,RSA和ECC)
May 09 #Python
Python发送邮件封装实现过程详解
May 09 #Python
pycharm第三方库安装失败的问题及解决经验分享
May 09 #Python
You might like
php使用curl代理实现抓取数据的方法
2017/02/03 PHP
PHP调用API接口实现天气查询功能的示例
2017/09/21 PHP
ModelDialog JavaScript模态对话框类代码
2011/04/17 Javascript
修改jQuery Validation里默认的验证方法
2012/02/14 Javascript
原生js ActiveXObject获取execl里面的值
2013/11/01 Javascript
JavaScript的String字符串对象常用操作总结
2016/05/26 Javascript
javascript的document中的动态添加标签实现方法
2016/10/24 Javascript
vue.js移动端tab组件的封装实践实例
2017/06/30 Javascript
ionic3+Angular4实现接口请求及本地json文件读取示例
2017/10/11 Javascript
angular中不同的组件间传值与通信的方法
2017/11/04 Javascript
vue-router路由懒加载和权限控制详解
2017/12/13 Javascript
redux-saga 初识和使用
2018/03/10 Javascript
基于Axios 常用的请求方法别名(详解)
2018/03/13 Javascript
ES6 中可以提升幸福度的小功能
2018/08/06 Javascript
Vue自定义组件双向绑定实现原理及方法详解
2020/09/03 Javascript
Python实现的计数排序算法示例
2017/11/29 Python
Python魔法方法功能与用法简介
2019/04/04 Python
python移位运算的实现
2019/07/15 Python
python修改FTP服务器上的文件名
2019/09/11 Python
python文件处理fileinput使用方法详解
2020/01/02 Python
PyTorch 解决Dataset和Dataloader遇到的问题
2020/01/08 Python
python如何通过pyqt5实现进度条
2020/01/20 Python
基于Python3读写INI配置文件过程解析
2020/07/23 Python
浅析Python打包时包含静态文件处理方法
2021/01/15 Python
python实现马丁策略回测3000只股票的实例代码
2021/01/22 Python
HTML5的结构和语义(1):前言
2008/10/17 HTML / CSS
IE10 Error.stack 让脚本调试更加方便快捷
2013/04/22 HTML / CSS
Origins加拿大官网:雅诗兰黛集团高端植物护肤品牌
2017/11/19 全球购物
餐饮主管岗位职责
2013/12/10 职场文书
工程专业毕业生自荐信范文
2013/12/25 职场文书
小学岗位竞聘方案
2014/01/22 职场文书
语文教师个人工作总结
2015/02/06 职场文书
学年个人总结范文
2015/03/05 职场文书
酒店收银员岗位职责
2015/04/07 职场文书
解决linux下redis数据库overcommit_memory问题
2022/02/24 Redis
利用正则表达式匹配浮点型数据
2022/05/30 Java/Android