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
相关产品推荐
相关产品推荐

