修复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路径。
修正方案
- 扩展
when条件,覆盖未挂载的所有场景:判断MediaTypes为NoMedia,或Status为NotConnected - 在
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启动,再立即重启。
修正方案
- 删除原
Set boot order任务 - 添加新任务,通过POST动作设置启动覆盖,指定
BootSourceOverrideTarget为Cd,BootSourceOverrideEnabled为Once(仅本次重启从CD启动) - 确保该任务在挂载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 }}"
关键修改说明
- 挂载任务:修复
Image字段为空问题,扩展when条件覆盖所有未挂载场景,添加Inserted和WriteProtected参数确保挂载状态正确 - 启动顺序:替换原Bios PATCH操作为Redfish专门的启动覆盖动作,设置
Once确保仅本次重启从CD启动,避免后续启动异常
内容的提问来源于stack exchange,提问作者bicanul123
相关产品推荐
相关产品推荐

