Csv 如何向列表中的每个字典添加键值对

Csv 如何向列表中的每个字典添加键值对,csv,ansible,Csv,Ansible,我必须向列表中添加一个键和一个值,该列表从csv文件读取到一个变量中 解释得更清楚一点。首先,我从csv文件加载一个列表: -name:从csv加载用户列表 community.general.read_csv: 路径:../files/example-prod.csv 分隔符:',' 注册:用户 委托给:localhost 当我查看“users”变量时,我得到以下输出: “列表”:[ { “firstName”:“Max”, “gid”:“2002年”, “homedir”:“示例”, “姓

我必须向列表中添加一个键和一个值,该列表从csv文件读取到一个变量中

解释得更清楚一点。首先,我从csv文件加载一个列表:

-name:从csv加载用户列表
community.general.read_csv:
路径:../files/example-prod.csv
分隔符:','
注册:用户
委托给:localhost
当我查看“users”变量时,我得到以下输出:

“列表”:[
{
“firstName”:“Max”,
“gid”:“2002年”,
“homedir”:“示例”,
“姓氏”:“穆斯特曼”,
“uid”:“m.example”
},
{
“名字”:“马丁”,
“gid”:“2002年”,
“homedir”:“staff”,
“姓氏”:“集合”,
“uid”:“martin.muster”
}
]
现在我需要为列表中的所有用户生成密码。因此,我希望遍历这些项,并为列表中的每个项添加一个新的键值对

在密码创建循环之后,我想要的输出是:

“列表”:[
{
“firstName”:“Max”,
“gid”:“2002年”,
“homedir”:“示例”,
“姓氏”:“穆斯特曼”,
“uid”:“m.example”,
“密码”:“示例密码”
},
{
“名字”:“马丁”,
“gid”:“2002年”,
“homedir”:“staff”,
“姓氏”:“集合”,
“uid”:“martin.muster”,
“密码”:“示例密码”
}
]
…这样我以后可以读出变量


如何做到这一点?我已经读过很多关于如何使用字典的内容,但是因为我在这里使用了一个列表,所以我找不到它。

您实际上从
阅读模块中获得了一个字典列表。
“list”
的内容是一个列表,但此列表中的元素是字典

您要做的是向每个字典添加一个键值对。
下面是一个生成随机密码的示例。有关如何生成密码的详细信息,请参见:

-设置事实:
用户:|
{{users.list | map('combine',{“password”):{{{lookup('password','/dev/null chars=ascii_小写,digits length=8')}}}
#这将解析上面添加的模板,并避免在每次解析用户时更改密码
-设定事实:
用户:“{{users}}”
-调试:
msg:“{{users}}”
说明:

  • 用户。列表
    包含您的用户列表
  • map('combine',)
    对输入列表中的每个字典(
    users.list
    )运行
    combine
    过滤器,并将
    的内容添加到其中
  • {“password”:“{{lookup('password','/dev/null chars=ascii_小写,digits length=8')}}
    是我们将每个输入字典与之组合的字典
  • “password”
    是密钥,值是生成密码的查找
备注:

我使用yaml的多行字符串文字来避免引用地狱。

谢谢!成功了!我现在唯一的问题是,每次调用“users”值时都会生成密码,尽管这里使用的是“set_fact”。你有没有办法只生成一次密码,而不是每次我使用列表时都生成密码?是的,没错,
set\u fact
将在当前运行时生成密码,但之后信息将丢失。您不应该以明文形式存储密码,但如果您想这样做,您可以将数据存储在CSV中,并仅在密码尚未出现时生成密码。您实际应该使用的是,在创建时将
update\u password
设置为
,这样当用户已经存在时它们不会被覆盖。是的,但这不是我的问题。在代码上运行debug.msg时,每次调用playbook中的值时,密码都会重新生成,而不是调用playbook本身。我知道信息在重新运行时丢失,但这不是问题所在。我想在playbook中多次引用该列表,每次我这样做时,都会生成新的密码。那不是我想要的。我想多次引用它,并为每个用户获得相同的密码。我需要这个,因为我在多个任务中引用了list.password变量。是的,我看到了,对不起,我犯了一个愚蠢的错误,我更新了答案并修复了它;将其包装在
{{}
中会导致整个字符串最终成为一个值,并且每次读取时都会将其解析为jinja模板:像我这样的书,哦,那么优雅的解决方案,其实并不那么优雅。我在回答中添加了一个变通方法。现在可以了。