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

使用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'

问题根源

  1. 变量类型不匹配:部分任务中存储的容量变量是字符串类型,后续比较或模块调用时未正确转换,引发类型冲突。
  2. DataDrives参数格式错误:传递给模块的DataDrives是字符串形式的列表(如'["1I:1:1", "1I:1:2"]'),但模块期望接收原生的列表类型,导致内部处理时字符串与整数进行比较,触发错误。
  3. 冗余的字符串操作:容量转换步骤中多余的字符串拆分操作,增加了类型出错的风险。

修复方案

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 00:44:52