0
我一直在尝试将boto3并入我的AWS工作流程,稍后再使用Fabric。刚开始学习Python,对于其中的一些问题提前表示歉意。我搜索并调试了下面的脚本,因为大部分错误似乎都是以Python2编写的,而我在OSX上使用的是Python3。对于格式问题感到抱歉,并尝试将脚本放入此处的代码块中。Python打印:字符串格式错误
#!/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())
从终端Excuted:蟒蛇ec2-instances.py
,并得到下面的输出:
%-3s %-26s %-16s %-16s %-20s %-12s %-12s %-16s
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 12, in list_instances
print (columns_format) ("num", "Name", "Public IP", "Private IP", "ID",
"Type", "VPC", "Status")
TypeError: 'NoneType' object is not callable
在此先感谢您的帮助!
我加入的%只%迷路了),现在我越来越 '%-3S%-26s%-16s%-16s%-20s%-12s%-12s%-16s 回溯(最近呼叫最后): 文件 “ec2-instances.py”,线路97,在 sys.exit(主()) 文件 “ec2-instances.py”,线78,在主 主机= list_instances(过滤器) 文件“EC2 -instances.py “第12行,在list_instances 打印(columns_format)%( ”编号“, ”姓名“, ”公网IP“, ”专用IP“, ”ID“, ”类型“, ”VPC“,” 状态“) TypeError:不支持的操作数类型为%:'NoneType'和'tuple'' –
rummonkey
您需要将所有内容都包含在()中 print(('%s%s')%('one','两个')) 这将解决您的问题。 –
太棒了!现在我有很好的标题和其他错误。 :(好像它越来越近了我在这里欣赏的帮助再次感谢 '回溯(最近通话最后一个):! 文件“ec2-instances.py”,行97,在 sys.exit(主() ) 文件 “ec2-instances.py”,线78,在主主机= list_instances(过滤器) 文件 “ec2-instances.py”,第18行,在list_instances名=(在i.tags项为项目,如果项目[ “键”] ==“姓名”)的.next() AttributeError的:“发电机”对象有没有属性“下一个”' –
rummonkey