mydatabases:
group1:
db_name: group1_database
group2:
db_name: group2_database
例如,在这个无效的片段中,您应该能够了解我正在尝试做什么,我想针对 2 个数据库安装多个 postgresql 扩展(来自列表)group1_database
和 group2_database
在字典里。
name: add postgresql extension
postgresql_ext:
name: "{{ item }}"
db: "{{ item.value.db_name }}"
with_dict: "{{ mydatabases }}"
loop:
- timescaledb
- pg_partman
我已经尝试过嵌套循环(我认为无论如何都行不通),但无济于事。无论如何我可以这样做来使用字典并一起列出或多个字典吗?
最佳答案
一种方法是使用 dict2items
,它完全符合您的要求,将字典翻译成列表。
然后使用 product
两个列表中的一个。
给出任务:
- postgresql_ext:
name: "{{ item.1 }}"
db: "{{ item.0.value.db_name }}"
loop: "{{ (mydatabases | dict2items) | product(extensions) }}"
vars:
extensions:
- timescaledb
- pg_partman
这是一个带有调试而不是你的 Postgres 任务的假例子:
- hosts: all
gather_facts: no
tasks:
- debug:
msg: "I need to install {{ item.1 }} on {{ item.0.value.db_name }}"
loop: "{{ (mydatabases | dict2items) | product(extensions) }}"
vars:
mydatabases:
group1:
db_name: group1_database
group2:
db_name: group2_database
extensions:
- timescaledb
- pg_partman
这将产生重述:
PLAY [all] *********************************************************************
TASK [debug] *******************************************************************
ok: [localhost] => (item=[{'key': 'group1', 'value': {'db_name': 'group1_database'}}, 'timescaledb']) =>
msg: I need to install timescaledb on group1_database
ok: [localhost] => (item=[{'key': 'group1', 'value': {'db_name': 'group1_database'}}, 'pg_partman']) =>
msg: I need to install pg_partman on group1_database
ok: [localhost] => (item=[{'key': 'group2', 'value': {'db_name': 'group2_database'}}, 'timescaledb']) =>
msg: I need to install timescaledb on group2_database
ok: [localhost] => (item=[{'key': 'group2', 'value': {'db_name': 'group2_database'}}, 'pg_partman']) =>
msg: I need to install pg_partman on group2_database
PLAY RECAP *********************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
另一种方法是使用 dictionary.keys()
以便从您的字典中获取键列表。
然后使用 product
再次过滤。
给出任务:
- postgresql_ext:
name: "{{ item.1 }}"
db: "{{ mydatabases[item.0].db_name }}"
loop: "{{ mydatabases.keys() | product(extensions) }}"
vars:
extensions:
- timescaledb
- pg_partman
这是一个带有调试而不是你的 Postgres 任务的假例子:
- hosts: all
gather_facts: no
tasks:
- debug:
msg: "I need to install {{ item.1 }} on {{ mydatabases[item.0].db_name }}"
loop: "{{ mydatabases.keys() | product(extensions) }}"
vars:
mydatabases:
group1:
db_name: group1_database
group2:
db_name: group2_database
extensions:
- timescaledb
- pg_partman
这将产生重述:
PLAY [all] *********************************************************************
TASK [debug] *******************************************************************
ok: [localhost] => (item=['group1', 'timescaledb']) =>
msg: I need to install timescaledb on group1_database
ok: [localhost] => (item=['group1', 'pg_partman']) =>
msg: I need to install pg_partman on group1_database
ok: [localhost] => (item=['group2', 'timescaledb']) =>
msg: I need to install timescaledb on group2_database
ok: [localhost] => (item=['group2', 'pg_partman']) =>
msg: I need to install pg_partman on group2_database
PLAY RECAP *********************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
关于ansible - 在 Ansible 中一起使用字典和列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67287908/