我们有3种不同的数据中心环境,供参考,例如US,CA和IN。这三个都有一个与其他2个不同的puppetdb master。因此,在自动化某些东西的同时,我想要一个config.json文件,如下所示,并根据传递的参数从主代码中引用它:
// config.json
{
"DEFAULT": {
"LOGFILE": "log/get_hname.log",
"LOCKDIR": "include/LOCK",
"NOOPRUN": "0"
},
"US": {
"PDB": "puppetdb100.us",
"VRFFILE": "include/vrf.txt",
"FQDN": "us.livevox"
},
"CA": {
"PDB": "puppet.ca.livevox.net",
"FQDN": "ca.livevox"
},
"IN": {
"PDB": "puppet100.in.livevox.net",
"FQDN": "in.livevox"
}
}
现在,对于主脚本,我正在尝试使用一个名为“ myenv”的变量,该变量将是US或CA或IN之一,以引用dict类型的配置中的键。但是我一直收到如下错误:
Traceback (most recent call last):
File "./get_hname.py", line 94, in <module>
print (config[myenv.upper()]['PDB'])
KeyError: 'NONE'
以下脚本本身供您参考:
#!/usr/bin/env python
import argparse
import json
import sys
import os
import logging
import time
from argparse import ArgumentParser
# Where Config File lives --------
CONFFILE = "include/get-hname-cfg.json"
# - DO NOT EDIT BELOW THIS LINE --
with open(CONFFILE, 'r') as f:
config = json.load(f)
logfile = config['DEFAULT']['LOGFILE']
myarguments = argparse.ArgumentParser(description="Arguments for Name Builder", usage="%(prog)s [options]")
myarguments.add_argument("-e", "--env", type=str, metavar="environment", nargs='*', help="Environment")
myarguments.add_argument("-t", "--type", type=str, metavar="servertype", nargs='*', help="Server type")
myarguments.add_argument("-n", "--noop", action="store_true", help="Stimulate the whole run, but don't execute. Similar to noop")
myarguments.parse_args()
args = myarguments.parse_args()
if not args.env and not args.type:
myarguments.print_help(sys.stderr)
myenv = str(args.env).lower()
pdbhost = "config" +myenv.upper()+ "['PDB']"
print ("%s" %(pdbhost))
if config[myenv.upper()]['PDB'] in globals():
puppetdbhost = config[myenv.upper()]['PDB']
如何将字典中的字符串类型变量用作键?
编辑:请注意,自从我使用PyCharm以来,我的问题中可能缺少的所有必需缩进都已得到处理。
答案 0 :(得分:0)
您需要修改add_arguments删除nargs='*'
,这会在列表中显示env
表格请参见以下示例:
myarguments.add_argument("-e", "--env", type=str, metavar="environment", help="Environment")
请参阅this文档以了解更多信息。
答案 1 :(得分:0)
Traceback (most recent call last):
File "./get_hname.py", line 94, in <module>
print (config[myenv.upper()]['PDB'])
KeyError: 'NONE'
这意味着myenv
变量在那一刻是字符串'None'
。检查一下。
答案 2 :(得分:0)
好的,我发现我做错了。我正在使用的参数
type=str and nargs='*'
这就是为什么我遇到类型不匹配并将输出显示为['US']而不是US(或CA或IN)的原因。一旦删除该文件,一切正常。
谢谢大家的指导。有帮助。