首页 > 解决方案 > Ansible中变量dict名称中的变量

问题描述

我有这样的字典:

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

我希望能够在运行时传入a_group变量来检索db_name。所以像这样

{{ mydatabases.{{ a_group }}.db_name }}

但我知道这种方法是不可能的。

像下面这样的东西当然有效,我可以获得返回 group1_database 但不完全是我想要的值。

- debug: 
    msg:"{{ mydatabases.group1.db_name }}"

这给了我一个未定义的变量

- debug:
    msg: "{{ hostvars[inventory_hostname]['mydatabases' + a_group + 'db_name'] }}"

有没有办法我可以做到这一点?

标签: ansible

解决方案


您可以使用 pythonic 方式访问变量:

剧本test.yml。注意任务中的引号debug

- name: Print var
  hosts: localhost
  gather_facts: false

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

    required_db: group2


  tasks:
  - name: Print a var
    debug:
      msg: "{{ mydatabases[required_db]['db_name'] }}"

运行示例:

$ ansible-playbook -i localhost, playbooks/tests/test.yml

PLAY [Print var] ****************************************************

TASK [Print a var] *************************************************************
Wednesday 21 April 2021  15:23:21 +0200 (0:00:00.023)       0:00:00.023 ******* 
ok: [localhost] => {
    "msg": "group2_database"
}

PLAY RECAP *********************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

Playbook run took 0 days, 0 hours, 0 minutes, 0 seconds
Wednesday 21 April 2021  15:23:21 +0200 (0:00:00.047)       0:00:00.070 ******* 
=============================================================================== 
Print a var ------------------------------------------------------------- 0.05s

推荐阅读