在Ansible中同时使用字典和列表 mydatabases: 第一组: db_名称:group1_数据库 第2组: db_名称:group2_数据库
例如,在这个不起作用的代码段中,您应该能够了解我正在尝试做什么,我想针对字典中的2个数据库在Ansible中同时使用字典和列表 mydatabases: 第一组: db_名称:group1_数据库 第2组: db_名称:group2_数据库,ansible,Ansible,例如,在这个不起作用的代码段中,您应该能够了解我正在尝试做什么,我想针对字典中的2个数据库group1\u数据库和group2\u数据库,安装多个postgresql扩展(从列表中) name:添加postgresql扩展 postgresql\u分机: 名称:“{{item}}” db:{{item.value.db_name}}” 使用_dict:“{{mydatabases}}” 循环: -时间刻度数据库 -帕特曼 我尝试过嵌套循环(我认为它无论如何都不会工作),但没有任何效果。我是否可
group1\u数据库
和group2\u数据库
,安装多个postgresql扩展(从列表中)
name:添加postgresql扩展
postgresql\u分机:
名称:“{{item}}”
db:{{item.value.db_name}}”
使用_dict:“{{mydatabases}}”
循环:
-时间刻度数据库
-帕特曼
我尝试过嵌套循环(我认为它无论如何都不会工作),但没有任何效果。我是否可以这样做来使用一个字典并同时列出或多个字典?一种方法是使用一个字典将其翻译成一个列表,这正是您想要的 然后使用两个列表中的一个 赋予任务:
-postgresql\u ext:
名称:“{item.1}}”
db:“{item.0.value.db_name}”
循环:{(mydatabases | dict2items){产品(扩展)}”
变量:
扩展:
-时间刻度数据库
-帕特曼
下面是一个带有调试而不是Postgres任务的假示例:
-主机:所有
收集事实:不
任务:
-调试:
msg:“我需要在{{item.0.value.db_name}上安装{{{item.1}}”
循环:{(mydatabases | dict2items){产品(扩展)}”
变量:
我的数据库:
第一组:
db_名称:group1_数据库
第2组:
db_名称:group2_数据库
扩展:
-时间刻度数据库
-帕特曼
这将产生概述:
播放[全部]*********************************************************************
任务[调试]*******************************************************************
确定:[localhost]=>(项=[{'key':'group1','value':{'db_name':'group1_database'},'timescaledb'])=>
msg:我需要在group1\u数据库上安装timescaledb
ok:[localhost]=>(item=[{'key':'group1','value':{'db_name':'group1_database'}},'pg_partman'])=>
msg:我需要在group1\u数据库上安装pg\u partman
确定:[localhost]=>(item=[{'key':'group2','value':{'db_name':'group2_database'}},'timescaledb'])=>
msg:我需要在group2_数据库上安装timescaledb
ok:[localhost]=>(item=[{'key':'group2','value':{'db_name':'group2_database'}},'pg_partman'])=>
msg:我需要在group2\u数据库上安装pg\u partman
重演*********************************************************************
localhost:ok=1已更改=0无法访问=0失败=0跳过=0已获救=0已忽略=0
另一种方法是使用,以便从字典中获取键列表 然后再次使用过滤器 赋予任务:
-postgresql\u ext:
名称:“{item.1}}”
db:{{mydatabases[item.0].db_name}
循环:{{mydatabases.keys()|产品(扩展)}
变量:
扩展:
-时间刻度数据库
-帕特曼
下面是一个带有调试而不是Postgres任务的假示例:
-主机:所有
收集事实:不
任务:
-调试:
msg:“我需要在{{mydatabases[item.0].db_name}上安装{{{item.1}}”
循环:{{mydatabases.keys()|产品(扩展)}
变量:
我的数据库:
第一组:
db_名称:group1_数据库
第2组:
db_名称:group2_数据库
扩展:
-时间刻度数据库
-帕特曼
这将产生概述:
播放[全部]*********************************************************************
任务[调试]*******************************************************************
确定:[localhost]=>(项=['group1','timescaledb'])=>
msg:我需要在group1\u数据库上安装timescaledb
确定:[localhost]=>(项=['group1','pg\u partman'])=>
msg:我需要在group1\u数据库上安装pg\u partman
确定:[localhost]=>(项=['group2','timescaledb'])=>
msg:我需要在group2_数据库上安装timescaledb
确定:[localhost]=>(项=['group2','pg\u partman'])=>
msg:我需要在group2\u数据库上安装pg\u partman
重演*********************************************************************
localhost:ok=1已更改=0无法访问=0失败=0跳过=0已获救=0已忽略=0
您可以通过将include_tasks
放在一个循环中,然后将内部循环放在包含的文件中来伪造嵌套循环。这在Ansible 2.9.18中不起作用,但在2.10+中对这两种方法都非常有效