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

修复Ansible部署Dell iDRAC9服务器CentOS安装的两类问题

修复Dell iDRAC9上Ansible安装CentOS的两个问题

问题1:未挂载ISO时无法执行挂载任务

原Attach virtual media任务的when条件仅判断vm_status.json.Status == "NotConnected",但完全未挂载ISO时,Status字段可能不存在,或MediaTypes为NoMedia,导致条件不触发。同时任务的body中Image字段为空,未指定目标ISO路径。

修正方案

  1. 扩展when条件,覆盖未挂载的所有场景:判断MediaTypes为NoMedia,或Status为NotConnected
  2. 在body中填入正确的ISO路径变量{{ image }},并添加Inserted: true和WriteProtected: true确保挂载生效

修改后的挂载任务:

- name: Attach virtual media
  uri:
    url: https://{{ idrac }}/redfish/v1/Managers/iDRAC.Embedded.1/VirtualMedia/CD/Actions/VirtualMedia.InsertMedia
    method: POST
    user: "{{ idrac_user }}"
    password: "{{ idrac_pass }}"
    validate_certs: false
    force_basic_auth: yes
    status_code: 204
    body_format: json
    body:
      Image: "{{ image }}"
      Inserted: true
      WriteProtected: true
  when: >
    (vm_status.json.MediaTypes | default(['NoMedia']))[0] == "NoMedia"
    or (vm_status.json.Status is defined and vm_status.json.Status == "NotConnected")

问题2:挂载ISO后无法自动进入启动菜单

原Set boot order任务通过PATCH修改Bios设置,这种方式需重启后才生效,且错误修改了只读字段BootSourceOverrideSupported。正确做法是直接调用Redfish的BootSourceOverride动作,指定一次性从CD启动,再立即重启。

修正方案

  1. 删除原Set boot order任务
  2. 添加新任务,通过POST动作设置启动覆盖,指定BootSourceOverrideTarget为Cd,BootSourceOverrideEnabled为Once(仅本次重启从CD启动)
  3. 确保该任务在挂载ISO之后、重启之前执行

新增的启动设置任务:

- name: Set one-time boot from CD
  uri:
    url: https://{{ idrac }}/redfish/v1/Systems/System.Embedded.1/Actions/ComputerSystem.SetBootSourceOverride
    method: POST
    user: "{{ idrac_user }}"
    password: "{{ idrac_pass }}"
    validate_certs: false
    force_basic_auth: yes
    status_code: 204
    body_format: json
    body:
      BootSourceOverrideTarget: Cd
      BootSourceOverrideEnabled: Once
      BootSourceOverrideMode: Uefi

完整修正后的Playbook

- hosts: Linux_OS_machine
  connection: local
  name: ULP image install
  gather_facts: false
  vars:
    ansible_python_interpreter: /usr/bin/env python
    datatype: SetBiosAttributes
    image: "{{ iso_version }}-{{ inventory_hostname }}.iso"

  tasks:
    - name: Check system power state
      uri:
        url: https://{{ idrac }}/redfish/v1/Systems/System.Embedded.1
        user: "{{ idrac_user }}"
        password: "{{ idrac_pass }}"
        method: GET
        validate_certs: false
        force_basic_auth: yes
        return_content: yes
      register: system_status

    - name: Power on system if off
      when: system_status.json.PowerState == "Off"
      uri:
        url: https://{{ idrac }}/redfish/v1/Systems/System.Embedded.1/Actions/ComputerSystem.Reset/
        user: "{{ idrac_user }}"
        password: "{{ idrac_pass }}"
        method: POST
        body:
          ResetType: On
        validate_certs: false
        force_basic_auth: yes
        status_code: 204
        body_format: json

    - name: Wait for 5 minutes for system to power on
      pause:
        minutes: 5
      when: system_status.json.PowerState == "Off"

    - name: Check if virtual media is mounted
      uri:
        url: https://{{ idrac }}/redfish/v1/Managers/iDRAC.Embedded.1/VirtualMedia/CD
        user: "{{ idrac_user }}"
        password: "{{ idrac_pass }}"
        method: GET
        validate_certs: false
        force_basic_auth: yes
        return_content: yes
      register: vm_status

    - name: Unmount virtual media if mounted
      when:
        - vm_status is defined
        - vm_status.json.MediaTypes | default([]) | length > 0
        - vm_status.json.MediaTypes[0] != "NoMedia"
        - vm_status.json.Image == image
        - vm_status.json.ConnectedVia == "VirtualMedia"
        - not (vm_status.json.Status is defined and vm_status.json.Status == "NotConnected")
      uri:
        url: https://{{ idrac }}/redfish/v1/Managers/iDRAC.Embedded.1/VirtualMedia/CD/Actions/VirtualMedia.EjectMedia
        method: POST
        user: "{{ idrac_user }}"
        password: "{{ idrac_pass }}"
        validate_certs: false
        force_basic_auth: yes
        status_code: 204
        body_format: json
      register: vm_unmount

    - name: Attach virtual media
      uri:
        url: https://{{ idrac }}/redfish/v1/Managers/iDRAC.Embedded.1/VirtualMedia/CD/Actions/VirtualMedia.InsertMedia
        method: POST
        user: "{{ idrac_user }}"
        password: "{{ idrac_pass }}"
        validate_certs: false
        force_basic_auth: yes
        status_code: 204
        body_format: json
        body:
          Image: "{{ image }}"
          Inserted: true
          WriteProtected: true
      when: >
        (vm_status.json.MediaTypes | default(['NoMedia']))[0] == "NoMedia"
        or (vm_status.json.Status is defined and vm_status.json.Status == "NotConnected")

    - name: Set one-time boot from CD
      uri:
        url: https://{{ idrac }}/redfish/v1/Systems/System.Embedded.1/Actions/ComputerSystem.SetBootSourceOverride
        method: POST
        user: "{{ idrac_user }}"
        password: "{{ idrac_pass }}"
        validate_certs: false
        force_basic_auth: yes
        status_code: 204
        body_format: json
        body:
          BootSourceOverrideTarget: Cd
          BootSourceOverrideEnabled: Once
          BootSourceOverrideMode: Uefi

    - name: Reboot the system
      uri:
        url: https://{{ idrac }}/redfish/v1/Systems/System.Embedded.1/Actions/ComputerSystem.Reset/
        user: "{{ idrac_user }}"
        password: "{{ idrac_pass }}"
        method: POST
        body:
          ResetType: ForceRestart
        validate_certs: false
        force_basic_auth: yes
        status_code: 204
        body_format: json

    - name: Wait for 5 minutes for system to power on
      pause:
        minutes: 5

    - name: Pause for 15 minutes for ULP image to be installed
      pause:
        minutes: 15

    - name: Wait for system to boot up
      wait_for:
        port: 22
        host: "{{ inventory_hostname }}"
        delay: 30
        timeout: 900

    - name: Remove custom images from MC Repo host
      file:
        path: /var/opt/ulp_pkg_repo/ulp_pkg_repo/{{ iso_version }}-{{ inventory_hostname }}.iso
        state: absent
      delegate_to: "{{ mc_repo_ip }}"

关键修改说明

  1. 挂载任务:修复Image字段为空问题,扩展when条件覆盖所有未挂载场景,添加Inserted和WriteProtected参数确保挂载状态正确
  2. 启动顺序:替换原Bios PATCH操作为Redfish专门的启动覆盖动作,设置Once确保仅本次重启从CD启动,避免后续启动异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 21:22:02