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

如何通过local.yml的列表变量获取vars.yml中对应值(Ansible)

解决Ansible中通过列表迭代调用对应变量的问题

问题场景

我在local.yml中通过列表传递变量给角色:

roles:
  - role: book
    vars:
      data:
        - 'std1'
        - 'std2'

vars.yml中的变量定义如下:

book_data:
  "std1": "std1"
  "std2": "std2"

"std1":
   - '1a'
   - '1b'
"std2":
   - '2a'
   - '2b'

需要遍历local.yml里的data列表,打印vars.yml中对应变量的值(比如std1对应['1a','1b'],std2对应['2a','2b']),但当前代码只能打印字符串本身:

- name: set fact
  set_fact:
    standard: "{{ lookup('list', data) }}"

- name: get standard
  debug: msg="{{ item }}"
  with_items: "{{ standard }}"

要求不直接在playbook中引用vars/main.yml里的变量,通过local.yml的迭代实现需求。

解决方案

利用Ansible的vars查找插件,通过变量名动态获取对应值,修改后的playbook代码如下:

- name: 动态获取对应变量的值
  debug:
    msg: "{{ lookup('vars', item) }}"
  loop: "{{ data }}"

说明

  • 直接用loop遍历local.yml传入的data列表,无需额外设置fact
  • lookup('vars', item)会根据列表中的每个元素(变量名),动态拉取vars.yml中对应的变量值

执行后预期输出:

ok: [localhost] => (item=std1) => {
    "msg": [
        "1a",
        "1b"
    ]
}
ok: [localhost] => (item=std2) => {
    "msg": [
        "2a",
        "2b"
    ]
}

如果需要把所有对应值整合为一个变量集合,可使用set_fact实现:

- name: 收集所有对应变量的值
  set_fact:
    standard_data: "{{ standard_data | default([]) + [lookup('vars', item)] }}"
  loop: "{{ data }}"

- name: 打印收集到的结果
  debug:
    msg: "{{ standard_data }}"

执行后输出整合后的列表:

ok: [localhost] => {
    "msg": [
        [
            "1a",
            "1b"
        ],
        [
            "2a",
            "2b"
        ]
    ]
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 13:21:23