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

Ansible中如何通过外部YAML传递RPM列表至with_items?

如何在外部YAML文件定义RPM包列表并在Ansible任务中调用

嘿,我来帮你搞定这个问题!你之前的外部YAML写法多了不必要的层级,咱们调整一下格式,就能轻松实现「只改外部包列表、不动主任务文件」的需求。

一、正确的外部YAML文件格式

外部变量文件不需要vars层级,直接定义键值对结构(推荐)或者纯列表都可以:

方式1:带命名键的结构(更清晰,扩展性强)

这是我最推荐的写法,后续如果要添加其他变量,直接在文件里加就行,不会乱:

# files.yaml
---
rpm_packages:
  - firmware-system-p89-2.56_2018_01_22-1.1.i386.rpm
  - firmware-smartarray-ea3138d8e8-6.30-1.1.x86_64.rpm

方式2:纯列表格式(简洁但可读性稍弱)

如果你的文件只用来存包列表,也可以直接写纯列表:

# files.yaml
---
- firmware-system-p89-2.56_2018_01_22-1.1.i386.rpm
- firmware-smartarray-ea3138d8e8-6.30-1.1.x86_64.rpm

二、在Ansible任务中调用列表

对应方式1(带命名键)的任务写法

用include_vars加载外部文件,然后直接引用变量即可:

# main.yml(你的主任务文件)
---
- name: 加载外部RPM包列表
  include_vars:
    file: files.yaml
    name: package_list

- name: 安装指定RPM包
  yum:
    name: "{{ item }}"
    state: present
  with_items: "{{ package_list.rpm_packages }}"

对应方式2(纯列表)的任务写法

同样用include_vars加载,直接引用整个列表:

# main.yml(你的主任务文件)
---
- name: 加载外部RPM包列表
  include_vars:
    file: files.yaml
    name: package_list

- name: 安装指定RPM包
  yum:
    name: "{{ item }}"
    state: present
  with_items: "{{ package_list }}"

更简洁的写法(直接用lookup)

如果你不想单独写加载变量的任务,也可以直接在with_items里用lookup读取文件并解析:

# 对应方式1的简洁写法
- name: 安装指定RPM包
  yum:
    name: "{{ item }}"
    state: present
  with_items: "{{ lookup('file', 'files.yaml') | from_yaml | json_query('rpm_packages') }}"

# 对应方式2的简洁写法
- name: 安装指定RPM包
  yum:
    name: "{{ item }}"
    state: present
  with_items: "{{ lookup('file', 'files.yaml') | from_yaml }}"

关键说明

  • 你之前的files.yaml里写了- vars:,这是Ansible Playbook的顶层结构,外部变量文件不需要这个,直接定义变量内容就行。
  • 现在修改包列表时,只需要编辑files.yaml里的包名,完全不用碰主任务文件,完美符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:20:56