You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过外部变量指定Ansible循环使用的目标字典?

问题描述

我定义了如下两个字典变量:

example1:   [
           { value1: "path", value2: "path2" },
        ]

example2:   [
           { value1: "path3", value2: "path4" },
        ]

在Ansible的playbook.yaml中,我设置了变量choose_dict来指定要使用的字典:

- name: echodict
  hosts: localhost

  vars:
    choose_dict: example1

  roles:
   - /home/user/ansible/roles/dicttest

在角色的dicttest.yml任务里,我尝试循环这个变量,但结果只输出字符串example1,而非对应的字典内容:

- name: loopdict
  ansible.builtin.command: "echo {{ item }}"
  register: test
  loop:
    - "{{ choose_dict }}"

- debug:
    msg: "{{ test }}"

请问能否通过外部变量选择example1或example2,实现对对应字典的循环操作?

解决方法

可以通过以下几种方式实现通过变量名动态引用字典:

方法1:使用vars查找插件

直接用lookup('vars', choose_dict)获取变量对应的字典内容,修改任务如下:

- name: loopdict
  ansible.builtin.command: "echo {{ item.value1 }} {{ item.value2 }}"
  register: test
  loop: "{{ lookup('vars', choose_dict) }}"

- debug:
    msg: "{{ test.results | map(attribute='stdout') | list }}"

这样循环的就是目标字典里的每一个元素,而非字符串example1。

方法2:将字典放在父字典中

把example1和example2归入一个父字典,通过键名直接引用,结构更清晰:
首先修改变量定义:

dict_collection:
  example1:
    - { value1: "path", value2: "path2" }
  example2:
    - { value1: "path3", value2: "path4" }

然后在playbook中指定要选择的键:

vars:
  choose_dict: example1

任务中直接引用父字典的对应键:

- name: loopdict
  ansible.builtin.command: "echo {{ item.value1 }} {{ item.value2 }}"
  register: test
  loop: "{{ dict_collection[choose_dict] }}"

- debug:
    msg: "{{ test.results | map(attribute='stdout') | list }}"

方法3:使用hostvars(适用于主机变量场景)

如果变量定义在主机vars中,可通过hostvars[inventory_hostname][choose_dict]引用:

- name: loopdict
  ansible.builtin.command: "echo {{ item.value1 }} {{ item.value2 }}"
  register: test
  loop: "{{ hostvars[inventory_hostname][choose_dict] }}"

内容的提问来源于stack exchange,提问作者Vauler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 23:43:25