如何将Ansible Playbook中with_items内容移至独立文件并调用?
解决Ansible Playbook虚拟机列表移至独立文件的问题
你的问题出在独立文件的内容定义错误,以及主Playbook调用方式不对。下面是两种可行的正确实现方法:
方法一:使用独立变量文件(Vars File)
这是Ansible中管理外部变量的标准方式,适合需要复用变量的场景。
创建变量文件
在项目目录下新建vars/vms_list.yaml,内容直接定义虚拟机列表变量:vms_list: - { vm_id: 101, vm_name: vm1, vm_cores: 2, vm_sockets: 1, vm_memory: 2048, vm_storage: 20G } - { vm_id: 102, vm_name: vm2, vm_cores: 2, vm_sockets: 1, vm_memory: 2048, vm_storage: 20G }主Playbook调用变量文件
在主Playbook中通过vars_files导入该变量文件,然后直接使用变量:- name: 批量创建虚拟机 hosts: your_target_hosts # 导入外部变量文件 vars_files: - vars/vms_list.yaml tasks: - name: 执行虚拟机创建操作 # 这里替换为你实际使用的模块(比如proxmox_kvm、virt等) debug: msg: "虚拟机 {{ item.vm_name }} | CPU核心数: {{ item.vm_cores }} | 内存: {{ item.vm_memory }}MB" # 遍历导入的虚拟机列表 with_items: "{{ vms_list }}"
方法二:用Lookup插件直接读取纯列表文件
如果不需要将列表作为变量复用,仅需读取外部列表文件,可直接用lookup插件读取并解析YAML内容。
创建纯列表文件
在项目目录下新建files/vms_list.yaml,内容为纯虚拟机列表(无需包裹vars):- { vm_id: 101, vm_name: vm1, vm_cores: 2, vm_sockets: 1, vm_memory: 2048, vm_storage: 20G } - { vm_id: 102, vm_name: vm2, vm_cores: 2, vm_sockets: 1, vm_memory: 2048, vm_storage: 20G }主Playbook中直接读取
使用lookup('file')读取文件内容,再通过from_yaml过滤器解析为Ansible可识别的列表:- name: 批量创建虚拟机 hosts: your_target_hosts tasks: - name: 执行虚拟机创建操作 debug: msg: "虚拟机 {{ item.vm_name }} | CPU核心数: {{ item.vm_cores }} | 内存: {{ item.vm_memory }}MB" # 直接读取并解析外部列表文件 with_items: "{{ lookup('file', 'files/vms_list.yaml') | from_yaml }}"
你之前操作的错误点
你创建的list.yaml内容vars: { list: vars/list.yaml }是循环引用,既没有定义实际的虚拟机列表,也没有正确的变量结构,导致Ansible无法读取到有效配置。
内容的提问来源于stack exchange,提问作者Arun Swiftz -1
相关产品推荐
相关产品推荐

