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

如何将Ansible Playbook中with_items内容移至独立文件并调用?

解决Ansible Playbook虚拟机列表移至独立文件的问题

你的问题出在独立文件的内容定义错误,以及主Playbook调用方式不对。下面是两种可行的正确实现方法:

方法一:使用独立变量文件(Vars File)

这是Ansible中管理外部变量的标准方式,适合需要复用变量的场景。

  1. 创建变量文件
    在项目目录下新建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 }
    
  2. 主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内容。

  1. 创建纯列表文件
    在项目目录下新建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 }
    
  2. 主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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 05:36:23