ansible - 在 Ansible 中一起使用字典和列表

标签 ansible

mydatabases:
  group1:
    db_name: group1_database
  group2:
    db_name: group2_database

例如,在这个无效的片段中,您应该能够了解我正在尝试做什么,我想针对 2 个数据库安装多个 postgresql 扩展(来自列表)group1_databasegroup2_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/

相关文章:

Ansible 默默地跳过任务/调试

Python正则表达式如果单词在行中则不匹配

postgresql - Ansible postgresql_db 任务在长时间暂停后失败

javascript - 让 Ansible 与 Pulumi 一起工作可能吗?

mysql - 使用 Ansible mysql_db 模块生成的 sql 转储文件中的数据库特异性

ansible - 使用寄存器、set_fact 或过滤器将部分结果保存在 Ansible 中

docker - 通过Docker运行Ansible时最优雅的方式来处理ANSIBLE_VAULT_PASSWORD_FILE?

Ansible:如何动态设置日志文件名?

ansible - 在 Ansible 中如果没有 sudo 则无法 ping 主机

dictionary - Ansible - 根据列表中的匹配项创建新字典