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

Ansible报错:unexpected parameter type in action 问题求助

Ansible磁盘扩容Playbook报错排查

报错根源分析

你遇到的ERROR! unexpected parameter type in action: <class 'ansible.parsing.yaml.objects.AnsibleSequence'>错误,核心原因是原始代码将loop、when、loop_control这些Task级别的参数,错误地放在了Play(即- name: 'Partition'节点)的根层级。Ansible会将Play下的这些序列类型参数识别为Action的参数,从而触发类型不匹配的报错。

修改后代码仍存在的问题

你调整了loop和when的位置,但仍有几个关键问题未解决:

  • 循环变量名错误:默认循环变量是item,而非items,你未通过loop_control: loop_var: items自定义变量名,导致所有items.xxx的变量引用都会失败。
  • 变量定义时机错误:vdcnames变量依赖循环变量,但你将它定义在Play的vars中,此时循环变量还未生成,插值会失效。
  • 第二个Task的变量引用问题:Resizing the partition任务中引用vdcnames_out.stdout,但第一个Task是循环执行的,vdcnames_out是包含所有循环结果的对象,直接引用stdout会获取最后一次循环的结果,而非当前磁盘对应的值。
  • 第二个Task缺少过滤条件:未保留原有的when条件,会导致所有磁盘都执行扩容操作,不符合预期。

修正后的完整代码

- name: 'Partition'
  tags: ['fs', 'fs-ext4']
  tasks:
    - name: 'Get disk device name from by-id'
      vars:
        vdcnames_cmd: "ls -l /dev/disk/by-id | grep '{{ volume[item.name] }}' | head -1 | cut -d '/' -f 1"
      shell:
        cmd: "{{ vdcnames_cmd }}"
      register: vdcnames_out
      loop: "{{ volumes.results }}"
      loop_control:
        label: "{{ item.name }}"
      when:
        - not item.skipped | d(False)
        - item['drive']['name'] | d('') == 'trwer'
        - item['partitions'] | d([]) | count == 1

    - name: 'Resizing the partition'
      shell: |
        sgdisk -e {{ item.device | d( volume[item.name] ) }} &&
        parted -m -s -a opt {{ item.device | d( vdcnames_out.results | selectattr('item.name', 'equalto', item.name) | map(attribute='stdout') | first ) }} resizepart 1 100%
      loop: "{{ volumes.results }}"
      loop_control:
        label: "{{ item.name }}"
      when:
        - not item.skipped | d(False)
        - item['drive']['name'] | d('') == 'trwer'
        - item['partitions'] | d([]) | count == 1

关键修正点说明

  • 将loop、when、loop_control全部移至对应Task层级,符合Ansible语法规范。
  • 将vdcnames变量(重命名为vdcnames_cmd)移至第一个Task的vars中,确保循环时能正确获取当前item的值。
  • 第二个Task中通过vdcnames_out.results | selectattr('item.name', 'equalto', item.name) | map(attribute='stdout') | first过滤出当前磁盘对应的设备名,解决循环结果的关联问题。
  • 统一使用默认循环变量item,避免变量名混淆;若需使用items作为循环变量,需在loop_control中添加loop_var: items。

内容的提问来源于stack exchange,提问作者007_programmer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 20:00:01