【问题标题】:Python traceback and attribute errors for AWS and Boto3AWS 和 Boto3 的 Python 回溯和属性错误
【发布时间】:2017-07-28 03:52:10
【问题描述】:

致力于让这个脚本从早期版本 2 开始在 Python 3 上运行,但仍然遇到一些回溯和属性错误。下面是错误,下面是当前状态的脚本:特别感谢 @Madlania Kalunder 对打印问题进行排序。现在我知道事情已接近尾声,但需要一些帮助。

Traceback (most recent call last):
File "ec2-instances.py", line 97, in <module> sys.exit(main())
File "ec2-instances.py", line 78, in main hosts=(list_instances)(filter)
File "ec2-instances.py", line 18, in list_instances
name = (item for item in i.tags if item ["Key"] == "Name" ).next()
AttributeError: 'generator' object has no attribute 'next'

下面是代码。很抱歉在这里出现格式问题,并提前感谢您的帮助。

#!/usr/bin/env python
import boto3
import sys
import argparse
import paramiko


def list_instances(Filter):
   ec2 = boto3.resource('ec2')
   instances = ec2.instances.filter(Filters=Filter)
   (columns_format) = ("%-3s %-26s %-16s %-16s %-20s %-12s %-12s %-16s")
print ((columns_format) % ("num", "Name", "Public IP", "Private IP", "ID", "Type", "VPC", "Status"))
  num = 1
  hosts = [] 
  name = {}  
  for i in instances:
  try:
     name = (item for item in i.tags if item ["Key"] == "Name" ).next()
  except StopIteration:
     name['Value'] = ''

  print (columns_format) % (
                           num,
                           name['Value'], 
                           i.public_ip_address,
                           i.private_ip_address,
                           i.id,
                           i.instance_type,
                           i.vpc_id,
                           i.state['Name']
                         )
  num = num + 1
  item={'id': i.id, 'ip': i.public_ip_address, 'hostname': name ['Value'], 'status': i.state['Name'],}
  hosts.append(item)
  return hosts

  def execute_cmd(host,user,cmd):
  ssh = paramiko.SSHClient()
  ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  try:
   ssh.connect(host, username=user)
   stdin, stdout, stderr = ssh.exec_command(cmd)
   stdout=stdout.read()
   stderr=stderr.read()
   ssh.close()
   return stdout,stderr
except paramiko.AuthenticationException as exception: 
   return "Authentication Error trying to connect into the host %s with the user %s. Plese review your keys" % (host, user), e 

 def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('-n', '--name',
                    help="Filter result by name.")
    parser.add_argument('-t', '--type',
                    help="Filer result by type.")
    parser.add_argument('-s', '--status',
                    help="Filter result by status." )
    parser.add_argument('-e', '--execute',
                    help="Execute a command on instances")
    parser.add_argument('-u', '--user', default="ubuntu",
                    help="User to run commands if -e option is used.\
                          Ubuntu user is used by default")

arg = parser.parse_args()

# Default filter if no options are specified
filter=[]

if arg.name:
    filter.append({'Name': 'tag-value', 'Values': ["*" + arg.name + "*"]})

if arg.type:
    filter.append({'Name': 'instance-type', 'Values': ["*" + arg.type + "*"]})

if arg.status:
    filter.append({'Name': 'instance-state-name', 'Values': ["*" + arg.status + "*"]})

hosts=list_instances(filter)
names = ""

if arg.execute:
   for item in hosts:
      names = names + " " + item["hostname"] + "(" + item["id"] + ")"
   print ("\nCommand to execute: %s") % arg.execute
   print ("Executed by: %s") % arg.user
   print ("Hosts list: %s\n") % names 
   for item in hosts:
      if item["status"] == 'running':
         print ("::: %s (%s)") % (item["hostname"], item["id"])
         stdout,stderr = execute_cmd(item["ip"], arg.user, arg.execute)
         print (stdout) 
         print (stderr)
      else:
         print ("::: %s (%s) is not running (command execution skiped)") % (item["hostname"], item["id"])

if __name__ == '__main__':
sys.exit(main())

【问题讨论】:

    标签: python-3.x amazon-ec2 boto3


    【解决方案1】:

    从同事那里得到了一些帮助,这是现在正确/工作的版本。更多打印问题需要使用 () 修复以包含 % 并删除特定的异常规则。还更正了 .next 以包含生成器。

    #!/usr/bin/env python
    import boto3
    import sys
    import argparse
    import paramiko
    
    
    def list_instances(Filter):
    ec2 = boto3.resource('ec2')
    instances = ec2.instances.filter(Filters=Filter)
    (columns_format) = ("%-3s %-26s %-16s %-16s %-20s %-12s %-12s %-16s")
    print ((columns_format) % ("num", "Name", "Public IP", "Private IP", "ID", "Type", "VPC", "Status"))
    num = 1
    hosts = [] 
    name = {}  
    for i in instances:
      try:
         name = next(item for item in i.tags if item["Key"] == "Name")
      except: 
         name['Value'] = ''
    
      print ((columns_format) % (
                               num,
                               name['Value'], 
                               i.public_ip_address,
                               i.private_ip_address,
                               i.id,
                               i.instance_type,
                               i.vpc_id,
                               i.state['Name']
                             ))
      num = num + 1
      item={'id': i.id, 'ip': i.public_ip_address, 'hostname': name ['Value'], 'status': i.state['Name'],}
      hosts.append(item)
    return hosts
    
    def execute_cmd(host,user,cmd):
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    try:
       ssh.connect(host, username=user)
       stdin, stdout, stderr = ssh.exec_command(cmd)
       stdout=stdout.read()
       stderr=stderr.read()
       ssh.close()
       return stdout,stderr
    except paramiko.AuthenticationException as exception: 
       return "Authentication Error trying to connect into the host %s with the user %s. Plese review your keys" % (host, user), e 
    
    def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('-n', '--name',
                        help="Filter result by name.")
    parser.add_argument('-t', '--type',
                        help="Filer result by type.")
    parser.add_argument('-s', '--status',
                        help="Filter result by status." )
    parser.add_argument('-e', '--execute',
                        help="Execute a command on instances")
    parser.add_argument('-u', '--user', default="ubuntu",
                        help="User to run commands if -e option is used.\
                              Ubuntu user is used by default")
    
    arg = parser.parse_args()
    
    # Default filter if no options are specified
    filter=[]
    
    if arg.name:
        filter.append({'Name': 'tag-value', 'Values': ["*" + arg.name + "*"]})
    
    if arg.type:
        filter.append({'Name': 'instance-type', 'Values': ["*" + arg.type + "*"]})
    
    if arg.status:
        filter.append({'Name': 'instance-state-name', 'Values': ["*" + arg.status + "*"]})
    
    hosts=list_instances(filter)
    names = ""
    
    if arg.execute:
       for item in hosts:
          names = names + " " + item["hostname"] + "(" + item["id"] + ")"
       print (("\nCommand to execute: %s") % arg.execute)
       print (("Executed by: %s") % arg.user)
       print (("Hosts list: %s\n") % names) 
       for item in hosts:
          if item["status"] == 'running':
             print (("::: %s (%s)") % (item["hostname"], item["id"]))
             stdout,stderr = execute_cmd(item["ip"], arg.user, arg.execute)
             print (stdout) 
             print (stderr)
          else:
             print (("::: %s (%s) is not running (command execution skiped)") % (item["hostname"], item["id"]))
    
       if __name__ == '__main__':
    sys.exit(main())
    

    【讨论】:

      猜你喜欢
      • 2021-07-30
      • 2017-08-31
      • 2020-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-22
      • 1970-01-01
      • 2018-06-12
      相关资源
      最近更新 更多