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

