1. 程式人生 > 程式設計 >aws 通過boto3 python指令碼打pach的實現方法

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,instanceId):
  response = client.register_instances_with_load_balancer(
    LoadBalancerName= elb,]
  )
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,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,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,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,'i-abcasdfa111122',client_elb)

注意,本指令碼並未包含連結機器並執行命令的部分,僅僅是打印出命令,需要手動執行 take_screenshotOfProcess 已經patch的命令,此部分也參考之前的文章,完全自動化,不需要手動執行

另外Patch命令指令碼中並未給出

總結

到此這篇關於aws 通過boto3 python指令碼打pach的實現方法的文章就介紹到這了,更多相關aws 通過boto3 python指令碼打pach內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!