Configuring Dell Server BIOS Remotely Using WSMAN and WinRM.

I have the pleasure of configuring some Dell kit without the use of a pre-execution environment. This presents quite a challenge as many of the management tools are designed to run within such an environment or an installed operating system which means that my options for configuring these serves is somewhat limited. Thankfully for most of the critical stuff Dell’s RACADM tool is more than capable of managing the server remotely however it unfortunately doesn’t have any access to the system BIOS where some critical changes need to be made. Thus I was in need of finding a solution to this problem and it seems that my saviour comes in the form of a protocol called Web Services Management (WSMAN).

WSMAN is an open protocol for server management which provides a rather feature rich interface to your hardware for getting, setting and enumerating the various features and settings on your hardware. Of course since its so powerful it’s also rather complex in nature and you won’t really be able to stumble your way through it without the help of a vendor specific guide. For Dell servers the appropriate guide is the Lifecycle Controller Web Services Interface Guide (there’s an equivalent available for Linux) which gives you a breakdown of the commands that are available and what they can accomplish.

They’re not fully documented however so I thought I’d show you a couple commands I’ve used in order to configure some BIOS settings on one of the M910 blades I’m currently working on. The first requirement was to disable all the on board NICs as we want to use the Qlogic QME8262-k 10GB NICs instead. In order to do this however we first need to get some information out of the WSMAN interface in order to know which variables to change. The first command you’ll want to run is the following:

winrm e http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/root/dcim/DCIM_BIOSEnumeration
-u:root -p:calvin
-r:https://[iDRACIP]/wsman -SkipCNcheck -SkipCAcheck
-encoding:utf-8 -a:basic

Which will give you a whole bunch of output along these lines:

DCIM_BIOSEnumeration
    AttributeName = EmbNic1Nic2
    Caption
    CurrentValue = Enabled
    DefaultValue
    Description
    ElementName
    FQDD = BIOS.Setup.1-1
    InstanceID = BIOS.Setup.1-1:EmbNic1Nic2
    IsOrderedList
    IsReadOnly = FALSE
    PendingValue
    PossibleValues = Disabled, Enabled

DCIM_BIOSEnumeration
    AttributeName = EmbNic1
    Caption
    CurrentValue = EnabledPxe
    DefaultValue
    Description
    ElementName
    FQDD = BIOS.Setup.1-1
    InstanceID = BIOS.Setup.1-1:EmbNic1
    IsOrderedList
    IsReadOnly = FALSE
    PendingValue
    PossibleValues = Disabled, EnablediScsi, EnabledPxe, Enabled

Of note in the output are the AttributeName and PossibleValues variables. In essence these represent the current and possible states of the BIOS variables and all of them can be modified through the appropriate WSMAN command. The Dell guide I referenced earlier though doesn’t exactly tell you how to do this and the only example that appears to be close is one for modifying the BIOS boot mode setting. However as it turns out this same command can be used to modify any variable that is output by the previous command so long as you create the appropriate XML file. Shown below is the command and XML file to disable the first 2 embedded NICs:

Code:
winrm i SetAttribute http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/root/dcim/DCIM_BIOSService?SystemCreationClassName=DCIM_ComputerSystem
+CreationClassName=DCIM_BIOSService
+SystemName=DCIM:ComputerSystem+Name=DCIM:BIOSService
-u:root -p:calvin
-r:https://[iDRACIP]/wsman -SkipCNcheck -SkipCAcheck
-encoding:utf-8 -a:basic -file:SetAttribute_BIOS.xml

SetAttribute_BIOS.xml:
<p:SetAttribute_INPUT xmlns:p="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/root/dcim/DCIM_BIOSService">
<p:Target>BIOS.Setup.1-1</p:Target>
<p:AttributeName>EmbNic3Nic4</p:AttributeName>
<p:AttributeValue>Disabled</p:AttributeValue>
</p:SetAttribute_INPUT>

This appears to work quite well for individual attributes but I’ve encountered errors when trying to set more than one BIOS variable at a time. This could easily be due to me fat fingering the input file (I didn’t really check it before troubleshooting it further) but it could also be a limitation of the WSMAN implementation on the Dell servers. Either way once you’ve run that command you’ll notice the response from the server states that the values are pending and the server requires a reboot. Now I’m not 100% sure if you can get away with just rebooting it through the iDRAC or physically rebooting it but there is a WSMAN command which I can guarantee will apply the setting whilst also rebooting the server for you. Again this one relies on an XML file for it to succeed:

Code:
winrm i CreateTargetedConfigJob http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/root/dcim/DCIM_BIOSService?SystemCreationClassName=DCIM_ComputerSystem
+CreationClassName=DCIM_BIOSService
+SystemName=DCIM:ComputerSystem
+Name=DCIM:BIOSService
-u:root -p:calvin
-r:https://[iDRACIP]/wsman -SkipCNcheck -SkipCAcheck
-encoding:utf-8 -a:basic -file:CreateTargetedConfigJob_BIOS.xml

CreateTargetedConfigJob_BIOS.xml:
<p:CreateTargetedConfigJob_INPUT xmlns:p="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/root/dcim/DCIM_BIOSService">
<p:Target>BIOS.Setup.1-1</p:Target>
<p:RebootJobType>2</p:RebootJobType>
<p:ScheduledStartTime>TIME_NOW</p:ScheduledStartTime>
<p:UntilTime>20131111111111</p:UntilTime>
</p:CreateTargetedConfigJob_INPUT>

Upon executing this command the server will reboot and then load into the Lifecycle Controller where it will apply the desired settings. After which it will reboot again and you’ll be able to view the settings inside the BIOS proper. It appears that this command can be used for any variable that appears within the initial BIOS enumeration so using this it is quite possible to fully configure the BIOS remotely. You can also access quite a lot of things within the iDRAC itself however I’ve found that RACADM is a much easier way to go about this, especially if you simply dump the entire config, edit it, then reupload it. Still the option is there if you want to use the single tool but unless you’re something of a masochist I wouldn’t recommend doing everything through WSMAN.

All that being said however the WSMAN API appears to cover pretty much everything in the server so if you need to do something remotely to it (hardware wise) and you don’t have the luxury of a PXE or installed operating system than its definitely something to look into. Hopefully the above commands will get you started and then the rest of the Dell integration guide will make a little more sense. If you’ve got any questions about a particular command hit me up in the comments, on Twitter or on my Facebook fan page and I’ll help you out as much as I can.

2 Comments

Leave a Comment
  1. Hello David,
    Glad to see you that you have tried out Dell Lifecycle Controller’s BIOS inventory and configuration capabilities. I’m a Dell employee and work with Lifecycle Controller so will be happy to clarify some points.

    While the Web Services Integration Guide provides various examples, the best place to start is the Profile documentation which can be found here:

    http://en.community.dell.com/techcenter/systems-management/w/wiki/1906.dcim-library-profile.aspx

    This Profiles page can be found from Lifecycle Controller’s TechCenter page: http://delltechcenter.com/lc, under Reference Specifications. The DCIM BIOS and Boot Management Profile should provide you with all the capabilities of LC from a BIOS perspective.

    You are right about using the SetAttribute() method, it can set any of the BIOS attributes. There is also a SetAttributes() method which allows setting multiple attributes in one shot.

    Rebooting right away will not do anything since the new value is only set pending in the iDRAC and needs to be committed by way of a long running job that will reboot the host and actually apply the settings. The CreateTargetedConfigJob() method does this for you as you have already found.

    The same set/commit methods are available for all other components such as NIC and iDRAC.

    While WS-MAN is a programmatic API and not as straight-forward as Racadm to work with, we have developed some tools to make it easier and quicker to work with LC. I’ll recommend checking out Recite which can be found here:-

    http://en.community.dell.com/techcenter/systems-management/w/wiki/3757.recite-interactive-ws-man-scripting-environment.aspx

    Recite removes the tedium associated with WS-MAN such as creating XML files and verbose command lines and also provides basic programmatic constructs to do simple workflows. The above steps you have tried equate to the following commands. Note how the syntax boils down to the actual method names and input parameters.

    # Get all BIOS attributes
    GetBIOSEnumerations
    GetBIOSStrings
    GetBIOSIntegers

    # Get a specific attribute by InstanceID
    GetBIOSEnumeration InstanceID=BIOS.Setup.1-1:EmbNic1Nic2

    # Setting an attribute
    SetBIOSAttribute Target=BIOS.Setup.1-1 AttributeName=EmbNic3Nic4 AttributeValue=Disabled

    # Setting multiple attributes
    SetBIOSAttributes Target=BIOS.Setup.1-1 AttributeName=EmbNic1Nic2 AttributeValue=Disabled AttributeName=EmbNic3Nic4 AttributeValue=Disabled

    # Creating a job
    CreateBIOSConfigJob Target=BIOS.Setup.1-1 RebootJobType=2 ScheduledStartTime=TIME_NOW

    # Save returned job ID to a variable
    Find InstanceID $jid

    # Poll the job until it completes
    Until JobStatus=Completed GetLifecycleJob InstanceID=$jid

    Hope this information makes you eager to try out more features exposed by Lifecycle Controller and looking forward to see more posts from you.

  2. Wow, that’s amazing Ganesh! I had figured that there must have been an easier way to do all the things I was doing but hadn’t really searched for anything. I’m going to have to dedicate some time to reading up on those links as I’m very interested in making my automation work with WSMAN simpler than it currently is.

    I’ll get back to you if I have any further questions 😉

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.