Ansible计算RAID容量返回字符串而非整数引发类型错误
解决Ansible中Loop计算RAID容量后变量为字符串类型的问题
问题背景
通过Loop累加RAID1磁盘总容量时,set_fact会将结果自动转换为字符串类型,后续调用HPE iLO的CreateLogicalDrivesWithParticularPhysicalDrives命令时,因模块需要整数类型的容量参数,出现TypeError: '<' not supported between instances of 'int' and 'str'错误。
解决方案
方法1:直接用过滤器筛选求和(推荐,无需Loop)
跳过循环累加,使用json_query筛选符合条件的磁盘,再通过sum过滤器直接计算总容量,结果天然为整数类型:
- name: Calculate RAID1 Disk Total Capacity set_fact: total_capacity_R1: "{{ physical_drives.ilo_storage.GetPhysicalDrives.msg.physical_drives['array_controller_0'] | json_query('[?CapacityGB==`300`].CapacityGB') | sum }}"
说明:
json_query('[?CapacityGB==300].CapacityGB')筛选出所有容量为300GB的磁盘容量值sum过滤器直接对筛选结果求和,返回整数类型,无需额外类型转换
方法2:收集符合条件的容量再求和(兼容Loop场景)
如果必须保留Loop逻辑,可先收集所有目标磁盘的容量,再统一求和:
- name: Collect capacities of 300GB drives for RAID1 set_fact: r1_drive_capacities: "{{ r1_drive_capacities | default([]) + [item] }}" loop: "{{ physical_drives_int }}" when: item == 300 - name: Calculate total RAID1 capacity set_fact: total_capacity_R1: "{{ r1_drive_capacities | sum }}"
说明:
- 第一个Loop收集所有符合条件的容量值到列表中
- 第二个任务通过
sum对列表求和,得到整数类型的总容量
方法3:在模块调用时强制类型转换
若无法修改容量计算逻辑,可在调用iLO模块时,通过YAML类型标记强制转换为整数:
- name: Create logical drives with particular physical drives when username and password are defined block: - hpe.ilo.ilo_storage: category: Systems command: CreateLogicalDrivesWithParticularPhysicalDrives baseuri: "{{ baseuri }}" username: "{{ username }}" password: "{{ password }}" raid_details: - LogicalDriveName: "LD1" Raid: "Raid1" CapacityGB: !int "{{ total_capacity_R1 }}" DataDrives: "{{ datadrive_locations_raid1 }}"
说明:!int是YAML的类型强制转换标记,可直接将字符串内容转为整数。
验证变量类型
可通过以下任务确认变量类型是否正确:
- name: Verify total_capacity_R1 type debug: msg: "Variable type: {{ total_capacity_R1 | type_debug }}, Value: {{ total_capacity_R1 }}"
内容的提问来源于stack exchange,提问作者Elyes KRIMI
相关产品推荐
相关产品推荐

