使用Ansible HPE iLO模块时遇TypeError:int与str无法比较
问题:Ansible hpe.ilo模块创建RAID逻辑盘时触发类型错误
使用Ansible的hpe.ilo集合实现RAID逻辑盘创建的磁盘选择自动化,选择用CapacityMiB获取更准确的容量,但在将提取的参数注入最终任务时,出现错误:TypeError: '<' not supported between instances of 'int' and 'str'。
错误回溯
Traceback (most recent call last): File "/home/admin/.ansible/tmp/ansible-tmp-1714484961.2196221-218458-39334877462429/AnsiballZ_ilo_storage.py", line 107, in _ansiballz_main() File "/home/admin/.ansible/tmp/ansible-tmp-1714484961.2196221-218458-39334877462429/AnsiballZ_ilo_storage.py", line 99, in _ansiballz_main invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS) File "/home/admin/.ansible/tmp/ansible-tmp-1714484961.2196221-218458-39334877462429/AnsiballZ_ilo_storage.py", line 47, in invoke_module runpy.run_module(mod_name='ansible_collections.hpe.ilo.plugins.modules.ilo_storage', init_globals=dict(_module_fqn='ansible_collections.hpe.ilo.plugins.modules.ilo_storage', _modlib_path=modlib_path), File "/usr/lib/python3.10/runpy.py", line 224, in run_module return _run_module_code(code, init_globals, run_name, mod_spec) File "/usr/lib/python3.10/runpy.py", line 96, in _run_module_code _run_code(code, mod_globals, init_globals, File "/usr/lib/python3.10/runpy.py", line 86, in _run_code exec(code, run_globals) File "/tmp/ansible_hpe.ilo.ilo_storage_payload_fqkaedoz/ansible_hpe.ilo.ilo_storage_payload.zip/ansible_collections/hpe/ilo/plugins/modules/ilo_storage.py", line 423, in File "/tmp/ansible_hpe.ilo.ilo_storage_payload_fqkaedoz/ansible_hpe.ilo.ilo_storage_payload.zip/ansible_collections/hpe/ilo/plugins/modules/ilo_storage.py", line 400, in main File "/tmp/ansible_hpe.ilo.ilo_storage_payload_fqkaedoz/ansible_hpe.ilo.ilo_storage_payload.zip/ansible_collections/hpe/ilo/plugins/module_utils/ilo_oem_utils.py", line 1538, in create_logical_drives_with_particular_physical_drives File "/tmp/ansible_hpe.ilo.ilo_storage_payload_fqkaedoz/ansible_hpe.ilo.ilo_storage_payload.zip/ansible_collections/hpe/ilo/plugins/module_utils/ilo_oem_utils.py", line 1253, in check_physical_drives TypeError: '<' not supported between instances of 'int' and 'str'
问题根源
- 变量类型不匹配:部分任务中存储的容量变量是字符串类型,后续比较或模块调用时未正确转换,引发类型冲突。
- DataDrives参数格式错误:传递给模块的
DataDrives是字符串形式的列表(如'["1I:1:1", "1I:1:2"]'),但模块期望接收原生的列表类型,导致内部处理时字符串与整数进行比较,触发错误。 - 冗余的字符串操作:容量转换步骤中多余的字符串拆分操作,增加了类型出错的风险。
修复方案
1. 修正变量初始化
移除重复定义的os_disks变量,确保初始类型正确。
2. 确保容量变量为整数类型
在捕获最小容量磁盘时,直接将os_disk_size存储为整数,而非字符串。
3. 统一容量比较的类型转换
在筛选磁盘的条件中,将item.CapacityMiB转为整数后再进行比较。
4. 传递原生列表给DataDrives
直接使用Ansible列表语法传递磁盘位置,而非字符串拼接的列表格式。
5. 简化容量转换逻辑
直接通过整数运算完成MiB到GB的转换,避免冗余的字符串操作。
修正后的完整代码
--- - name: Disk Picker hosts: localhost become: False gather_facts: False vars: os_disk_size: 400000 os_disks: [] data_disks: [] tasks: - name: Get Disk Info hpe.ilo.ilo_storage: category: Systems command: GetPhysicalDrives baseuri: x.x.x.x username: username password: password register: disks - name: Loop Disk Info debug: msg: - "{{ item.CapacityMiB }}" - "{{ item.Location }}" loop: "{{ disks.ilo_storage.GetPhysicalDrives.msg.physical_drives.array_controller_0 }}" - name: Capture Lowest Capacity Disk for OS set_fact: os_disk_size: "{{ item.CapacityMiB | int }}" loop: "{{ disks.ilo_storage.GetPhysicalDrives.msg.physical_drives.array_controller_0 }}" when: item.CapacityMiB | int <= os_disk_size - name: Output OS disk size debug: msg: "os_disk_size = {{ os_disk_size }}" - name: get OS Disks set_fact: os_disks: "{{ os_disks + [{ 'Location': item.Location,'CapacityMiB': item.CapacityMiB | int }] }}" loop: "{{ disks.ilo_storage.GetPhysicalDrives.msg.physical_drives.array_controller_0 }}" when: item.CapacityMiB | int <= os_disk_size - name: Output Disk Variables debug: var: os_disks - name: Output Disk Location debug: msg: - "{{ os_disks[0].Location }}" - "{{ os_disks[1].CapacityMiB }}" - "{{ [os_disks[0].Location, os_disks[1].Location] }}" - name: Convert Disk Size - MiB to GB set_fact: real_disk_size: "{{ (os_disks[1].CapacityMiB / 1024) | int }}" - name: Output real disk size debug: msg: "{{ real_disk_size }}" - name: Create logical drives with particular physical drives hpe.ilo.ilo_storage: category: Systems command: CreateLogicalDrivesWithParticularPhysicalDrives baseuri: x.x.x.x username: username password: password raid_details: - LogicalDriveName: LD1 Raid: Raid1 CapacityGB: "{{ real_disk_size }}" DataDrives: "{{ [os_disks[0].Location, os_disks[1].Location] }}"
关键修改点说明
- 移除了
vars中重复的os_disks: 2定义,避免变量初始值混乱。 Capture Lowest Capacity Disk for OS任务中,os_disk_size直接存储为item.CapacityMiB | int,确保变量是整数类型。get OS Disks任务中,将item.CapacityMiB转为整数后存入os_disks,同时when条件里统一转为整数比较。- 容量转换直接通过
(os_disks[1].CapacityMiB / 1024) | int完成,去掉冗余的字符串拆分操作。 CreateLogicalDrivesWithParticularPhysicalDrives任务中,DataDrives使用{{ [os_disks[0].Location, os_disks[1].Location] }}传递原生列表,而非字符串格式。
内容的提问来源于stack exchange,提问作者Rich549
相关产品推荐
相关产品推荐

