【发布时间】:2019-08-05 21:09:00
【问题描述】:
我正在尝试创建一个包含用户列表及其 ssh 密钥的字典。
用户列表和 ssh 密钥存储在不同的 yaml 文件中,需要从中获取信息。这些文件是“管理员”和“用户”,它们看起来像:
管理员文件:
admins:
global:
- bob
- john
- jimmy
- hubert
SSH 密钥文件:
users:
bob:
fullname: Bob McBob
ssh-keys:
ssh-rsa "thisismysshkey"
john:
fullname: John McJohn
ssh-keys:
ssh-rsa "thisismysshkey"
到目前为止,我有这个代码:
import yaml
#open admins list as "f"
f = open("./admins.sls", 'r')
#creates "admins" list
admins = yaml.load(f)
#grab only needed names and make a list
admins = admins['admins']['global']
#convert back to dict with dummy values of 0
admin_dict = dict.fromkeys(admins, 0)
所以在这一点上我有这个字典:
print(admin_dict)
{'bob': 0, 'john': 0}
现在我想遍历“admins”中的名称列表,并使用来自其他文件的 ssh-key 更新密钥(当前设置为 0)。
所以我这样做:
f = open("./users.sls", 'r')
ssh_keys = yaml.load(f)
for i in admins:
admin_dict[k] = ssh_keys['users'][i]['ssh-keys']
但是当运行那个 for 循环时,只有一个值被更新。 有点卡在这里,我已经超出了我的 python 深度......我在正确的轨道上吗?
编辑: 将最后一个循环更改为:
for i in admins:
for key, value in admin_dict.items():
admin_dict[key] = ssh_keys['users'][i]['ssh-keys']
事情看起来好多了。这有效吗?
【问题讨论】:
-
您上一个代码中的
k是什么? -
没什么...我用'k'表示它是字典的键。但它没有任何定义
-
所以这应该会引发错误......你不能使用未定义的东西 +它使这个不可重现。另外,您可以尝试使用 dict-comp 一次性完成此操作:
admin_dict = {usr: ssh_keys['users'][usr]['ssh-keys'] for usr in admins} -
让我试试。我刚才也做了这个,看起来确实有效:
for i in admins: for key, value in admin_dict.items(): admin_dict[key] = ssh_keys['users'][i]['ssh-keys'] -
这似乎是一种非常奇怪的做法,而且工作起来也很奇怪。那应该使您的所有项目都具有与上一个管理员相同的值...
标签: python python-3.x