{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":["img","admonition","link-external"]},"redocly_category":"Blog","type":"markdown"},"seo":{"title":"Massive parallel management with iLOrest on Linux","description":"Redfish is a standard RESTful API designed to deliver simple and secure management for converged, hybridIT and the Software Defined Data Center (SDDC)","meta":[{"name":"company_code","content":"hpe"},{"name":"hp_design_version","content":"hpe.1.0"},{"name":"lifecycle","content":"support.docs"},{"name":"robots","content":"index, follow"},{"name":"segment","content":"Segment Neutral"},{"name":"simple_title","content":"HPE server management with Redfish"},{"name":" target_country","content":"ww"},{"name":"user_profile","content":"Commercial.Technical End User"},{"name":"web_section_id","content":"R12305"}]},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"massive-parallel-management-with-ilorest-on-linux","__idx":0},"children":["Massive parallel management with iLOrest on Linux"]},{"$$mdtype":"Tag","name":"Image","attributes":{"src":"/assets/fdz-photoprofile.f8842326599c8d88fc2a94018b733b269354e0b2144ebaa78e8a3db32b58c825.754a5336.png","alt":"François Donzé's profile photo","framed":false,"withLightbox":false,"style":{"borderRadius":"50px","boxShadow":"0 2px 12px rgba(0,0,0,0.25)"}},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"span","attributes":{"style":{"fontSize":"larger"}},"children":["François Donzé"]}," - Technical consultant, HPE"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["January, 2022"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Update: August, 2026"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"introduction","__idx":1},"children":["Introduction"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Thanks to HPE having provided the ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"https://github.com/HewlettPackard/python-redfish-utility/releases/latest","target":"_blank"},"children":["iLOrest Python API"]},","," ","an entirely new avenue has been opened to developers for managing their servers. It allows them to add in their favorite deployment tools"," ","(i.e. ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"https://github.com/HewlettPackard/ilo-ansible-collection/","target":"_blank"},"children":["Ansible"]}," ","or other management tools, like"," ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"https://www.hpe.com/info/oneview","target":"_blank"},"children":["HPE OneView"]}," ","(as described in several articles found here, in the"," ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"https://developer.hpe.com/search/?term=redfish","target":"_blank"},"children":["HPE DEV Blog"]},")."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["But what if you are not a Python geek? What if you prefer managing your servers the old way with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["bash"]}," / ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["grep"]}," / ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["awk"]}," / ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["jq"]}," / ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["curl"]}," / ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["wget"]},"?"," ","In that case, you can loop over the list of your iLO IP addresses and use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["curl"]}," / ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["wget"]}," for getting and setting Redfish parameters."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["However, this loop approach brings out two fundamental problems: 1) Using ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["curl"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["wget"]}," in management scripts implies the creation of smart crawling functions"," ","(as explained in this ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"https://developer.hpe.com/blog/getting-started-with-ilo-restful-api-redfish-api-conformance","target":"_blank"},"children":["article"]},"),"," ","2) a sequential management with loops is fine for taking care of five or ten servers, but not more."," ","A parallel approach should be considered for an important number of managed servers."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This blog post explains how to manage many servers in parallel using bash scripts without the need of implementing schema crawlers,"," ","thus allowing a long-term stability to the scripts."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To achieve this goal, you will combine a parallel task launcher (namely the"," ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"https://clustershell.readthedocs.io/en/latest/index.html","target":"_blank"},"children":["ClusterShell"]}," ","and/or the Parallel Distributed Shell) with"," ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"https://www.hpe.com/info/resttool","target":"_blank"},"children":["iLOrest"]}," ","(former ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["hprest"]},") the HPE RESTful Interface Tool in a more detailed and slightly different manner than what you can read already in the"," ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/docs/redfishclients/ilorest-userguide","target":"_blank"},"children":["user guide"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"clush-and-pdsh-quick-and-dirty-overview","__idx":2},"children":["Clush and pdsh: Quick (and dirty) overview"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The Parallel Distributed Shell (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pdsh"]},") and the ClusterShell (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["clush"]},") are both part of the"," ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"https://fedoraproject.org/wiki/EPEL","target":"_blank"},"children":["Extra Package for Enterprise Linux"]}," ","(EPEL) repository and they give the ability to perform local or remote commands in parallel."," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Pdsh"]}," came first as a replacement of an IBM utility (DSH) with Google being the main contributor."," ","However, Google pulled out from this project in 2013."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The ClusterShell is an interesting alternative to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pdsh"]}," for many reasons. First the basic syntax and most of the switches, options and arguments are identical to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pdsh"]},"."," ","Hence, moving from ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pdsh"]}," to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["clush"]}," is easy. Additionally, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["clush"]}," provides more flexibility for selecting the remote nodes you want to execute commands against or on. It is associated with the"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["nodeset(1)"]}," ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"https://clustershell.readthedocs.io/en/latest/tools/nodeset.html","target":"_blank"},"children":["command"]}," ","for computing advanced nodeset operations like ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["expand"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["fold"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["group"]},", etc."," ","Another advantage of ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["clush"]}," over ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pdsh"]}," is that it is written in Python and can be used in Python scripts whenever you are ready to use this language."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For the purposes of this article, I will use ClusterShell only."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For those systems running Red Hat or a similar distribution, you need to mention the two packages containing the code and the eco-system:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"sudo dnf install python3-clustershell clustershell\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["On Ubuntu systems, just mention the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["clustershell"]}," parameter on the command line to install both packages:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"sudo apt install clustershell\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Here are basic examples to illustrate the launch of several commands in parallel on the local node and then one command on several remote nodes."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If you want to perform a parallel ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ping"]}," toward ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["node1"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["node2"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["node3"]}," type:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"clush -R exec -w node[1-3] ping %h\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["-R exec"]}," specifies a local execution of the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ping"]}," command toward the list of hosts: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["node[1-3]"]},". ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["%h"]}," is substituted with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["node1"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["node2"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["node3"]}," for each ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ping"]}," command."," ","When you hit the return key, your system forks in parallel the following 3 tasks:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"ping node1 \nping node2 \nping node3\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Imagine now that you want the root user of ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["node1"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["node2"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["node4"]}," to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ping"]}," a remote gateway called ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["aremotegateway"]},". With the above syntax you can issue:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"clush --nostdin -R exec -w node[1-2,4] ssh --user=root %h \"ping aremotegateway\"\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["However, EPEL provides ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["clush"]}," compiled with an ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ssh"]}," (default) module, allowing the following simplified syntax:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"clush --nostdin -w node[1-2,4] --user=root \"ping aremotegateway\"\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Since the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["-R"]}," switch is not present, the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ssh"]}," default module is used toward ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["node[1-2,4]"]},"  and the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ping"]}," command is executed on this list or remote nodes."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"nodeset-management","__idx":3},"children":["Nodeset management"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The list of remote nodes following the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["-w"]}," switch can be the output of a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["nodeset"]}," command taking its input from a node set configuration file."," ","The possible locations of the configuration file depends on the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["groups.conf(5)"]}," file. For this article,"," ","I populated the default file located in my home directory (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["~/.local/etc/clustershell/groups.d/local.cfg"]},")."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Here is one example showing the power of this ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["clush"]}," companion command."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Imagine you define two groups of iLOs in the nodeset configuration file:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"ilo-sales: ilo-sales[1-10]\nilo-marketing: ilo-foo,ilo-bar,ilo-test\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The  ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ilo-sales"]}," group contains ten iLO names and ilo-marketing group contains three. If you want to select both groups and exclude node ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ilo-test"]},", you can do it with:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"nodeset --fold @ilo-sales,@ilo-marketing  --exclude ilo-test\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"img","attributes":{"src":"/assets/1-nodeset-exclude.ee5d4322db3d61488d64a52f3d6194b2a1c4180249a6c74edfd7d297dcf25ca7.11704621.png","alt":"Figure 1: nodeset exclude example","title":"Figure 1: nodeset exclude example"},"children":[]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"i","attributes":{},"children":["Figure 1: nodeset exclude example"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You can now combine the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["nodeset"]}," command with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["clush"]}," to issue a parallel ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ping"]}," toward this list with:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"clush --nostdin -R exec -w $(nodeset -f @ilo-sales,@ilo-marketing -x ilo-test) ping -c 2 %h \n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"out-of-band-or-in-band-that-is-the-question","__idx":4},"children":["Out-of-band or in-band: that is the question"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["As discussed in this ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/docs/references_and_material/blogposts/etc/chif/chif-driver-not-found","target":"_blank"},"children":["blog"]}," post,"," ","iLOrest offers"," ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/docs/redfishservices/ilos/supplementdocuments/vnic#out-of-band-management","target":"_blank"},"children":["both out-of-band"]}," and"," ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/docs/redfishservices/ilos/supplementdocuments/vnic#in-band-management","target":"_blank"},"children":["in-band management"]},"."," ","In the first form, you need to log into a remote iLO with the credentials of an iLO user."," ","The following sequence of commands retrieves the Bios version of a remote server using an out-of-band management:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"ilorest login ilo-IP -u ilo-user -p ilo-password\nilorest select computersystem. \nilorest ls oem/hpe/bios/current # On Gen9, replace with bios/current\nilorest logout\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info","name":"Note"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You can always use out-of-band management even when the server is OFF or when there is no operating system installed. The iLO constantly listens on the network as long as a power cable is plugged in the server."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Performing in-band management with iLOrest means that you need to first access the operating system before launching the local ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ilorest"]},"."," ","On iLO 5 and iLO 6 based systems configured with the default"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Production"]}," ",{"$$mdtype":"Tag","name":"LinkExternal","attributes":{"href":"/docs/redfishservices/ilos/ilo6/ilo6_179/ilo6_hpe_resourcedefns179#securitystate"},"children":[" security state "]},","," ","if you logged in the OS as a privileged user (root or Administrator),"," ","you don't need to supply any username/password credentials to access the underlying iLO. If the iLO 5 or iLO 6 of your server is in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["HighSecurityState"]}," or higher (i.e. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["FIPS"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CSNA"]},"),"," ","you will need to provide iLO credentials to access the underlying iLO."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If your server is an iLO 7 based system (or later),"," ","in-band management is handled differently:  The lowest security state of those servers corresponds to the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["HighSecurityState"]}," of iLO 5 and 6."," ","Then, the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/etc/glossaryterms"},"children":["CHIF"]}," communication path"," ","between the OS and iLO does not exist anymore. The only communication path is through the host interface, also known as"," ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/docs/redfishservices/ilos/supplementdocuments/vnic","target":"_blank"},"children":["vNIC"]},"."," ","This communication path requires iLO credentials to be provided to access the underlying iLO, except for some HPE specific applications"," ","(i.e. AMS, SUM iSUT and iLOrest) which are allowed to access the underlying iLO without credentials when they have a dedicated"," ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/docs/redfishservices/ilos/supplementdocuments/securityservice#application-accounts","target":"_blank"},"children":["application account"]}," properly registered in iLO."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The following example shows how to retrieve the Bios version of a remote server using an in-band management from"," ","an iLO 5, iLO 6 in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Production"]}," security state or an iLO 7 with a registered application account or iLOrest."]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"warning","name":"Attention"},"children":[{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The goal of the following example is purely educational. In a production environment, you should never use the root account to perform in-band management."," ","from remote."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The following example works against iLO 7 (and later) based systems only if the iLOrest application account is registered in iLO."," ","Refer to the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references_and_material/blogposts/ilorest/appaccountmanagement/appaccountmanagement"},"children":["Managing Application Accounts on HPE iLO07+ servers with iLOrest"]}," blog post for more details."]}]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"ssh root@server ilorest login\nssh root@server  ilorest select computersystem.\nssh root@server ilorest ls oem/hpe/bios/current # On Gen9 replace with bios/current\nssh root@server ilorest logout\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"who-kicked-me-out","__idx":5},"children":["Who kicked me out?"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["All of this is awesome except that in both examples (out-of-band and in-band), a cache directory location is not explicitly specified."," ","Hence, you will be kicked out if a concurrent iLOrest session is opened using the default cache directory as shown in the following picture."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The picture below shows the following sequence of events: (1) you first log into ilo-lab1. (2) Then you select the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Bios."]}," type (select ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["HpBios."]}," on Gen9 servers) and (3) verify that it has been selected."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["(4) In the other terminal session and from the same server, log into ilo-lab2 without selecting any type. This second session clears off the iLOrest cache including the selection we performed in the first terminal. As a result, (5) asking for the resource type selection returns an error."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"img","attributes":{"src":"/assets/2-kicked-out.266e307327b19ccc5491c901c2603cc062e6fc9259af6a6e5e099c2c1b6b68be.11704621.png","alt":"Figure 2: Demonstrating iLOrest local cache","title":"Figure 2: Demonstrating iLOrest local cache"},"children":[]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"i","attributes":{},"children":["Figure 2: Demonstrating iLOrest local cache"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["As a consequence (and to be safe), you should always specify a specific cache directory location for your iLOrest sessions which will avoid such contention."]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"success","name":"Tips"},"children":[{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["On Linux systems, you can use the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["mktemp -d"]}," ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"https://www.man7.org/linux/man-pages/man1/mktemp.1.html","target":"_blank"},"children":["command"]}," ","to create a temporary cache directory as shown in the following example:"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["With PowerShell, you can use the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["New-TemporaryFile"]}," cmdlet to create a temporary file and then use its path as the cache directory for iLOrest. For example:"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["New-Item -ItemType Directory -Path (Join-Path $env:TEMP \"ilorest-cache-$(Get-Random -Minimum 100000 -Maximum 999999)\")"]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["With a local temporary cache directory, the out-of-band example becomes:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"#!/usr/bin/env bash\n\nu=\"ilo-user\"\np=\"ilo-password\"\nCACHEDIR=$(mktemp -d \"/tmp/ilorest_cache_XXXX\")\niLOrest=\"ilorest --nologo --logdir /var/log --cache-dir=${CACHEDIR}\"\n$iLOrest login ilo-IP -u $u -p $p\n$iLOrest select computersystem. \n$iLOrest ls oem/hpe/bios/current # On Gen9, replace with bios/current\n$iLOrest logout\nrm -rf ${CACHEDIR}\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["With a specific cache directory, the in-band example becomes as the following."," ","Loggin as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["root"]}," on the remote server allows you to avoid providing credentials to the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ilorest"]}," commands"," ","against iLO 5 and iLO 6 in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Production"]}," security state or iLO 7 (and later) with a registered iLOrest application account."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"#!/usr/bin/env bash\n\nserver=\"serverIp\"\nCACHEDIR=$(mktemp --dry-run --directory \"/tmp/ilorest_cache_XXXX\")\niLOrest=\"ilorest --nologo --logdir /var/log  --cache-dir=${CACHEDIR}\"\nssh root@$server \"$iLOrest select computersystem.\"\nssh root@$server \"$iLOrest ls oem/hpe/bios/current\"  # On Gen9, replace with bios/current\n\n# Retrieve the SessionCollection from the remote server and display it in JSON format\n# In-band sessions URIs start with \"systemadministrator\" on iLO 5 and iLO 6 and \"ilorest*\" on iLO 7 and later.\nssh root@$server \"$iLOrest ls --select SessionCollection. --json\"\n\n# It is always a good practice to logout from the iLO when you are done with your in-band management.\nssh root@$server \"$iLOrest logout\"\n\n# Cleanup the temporary cache directory on the remote server\nssh root@$server \"rm -rf ${CACHEDIR}\"\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"parallel-out-of-band-management","__idx":6},"children":["Parallel out-of-band management"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You are now ready to send out-of-band iLOrest commands in parallel toward a set of iLOs sharing common administrator credentials."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This example applies a Bios configuration file to a list of servers. The Bios configuration has been created and customized in an ASCII/json file called ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["BiosConfig.json"]}," using the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ilorest save --select Bios."]}," ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/docs/redfishclients/ilorest-userguide/globalcommands#save-command","target":"_blank"},"children":["command"]},"."," ","The list of target servers to configure is represented by a group of iLOs defined in the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["nodeset"]}," configuration file as explained earlier."," ","Note that, for a performance reason, I grouped the type selection (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Bios."]},") with the login process:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"#!/usr/bin/env bash\n\nread -p \"Enter iLO admin username: \" u\nread -s -p \"Enter iLO admin password (No echo on screen): \" p\n\nCLUSH=\"clush --nostdin -R exec\"\niLOrest=\"ilorest --nologo --cache-dir=cache-%h\"\nILO_LIST=$(nodeset -f @myilos)\n$CLUSH -w $ILO_LIST $iLOrest login %h -u $u -p $p --selector=Bios. # On gen9, selector is HpBios\n$CLUSH -w $ILO_LIST $iLOrest load -f BiosConfig.json\n$CLUSH  -w $ILO_LIST $iLOrest logout\n\n# Cleanup the temporary cache directories on the local management station\nfor n in $(echo $ILO_LIST | tr ',' ' ')  ; do rm -rf cache-${n} ; done\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["I personally successfully tested this example against 24 servers. I am pretty optimistic that it works as well for a larger number of servers,"," ","although a risk of bumping into Redfish session limits exists."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"parallel-in-band-management","__idx":7},"children":["Parallel in-band management"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In this paragraph I'll present two use cases of in-band management: the first one sends iLOrest commands in parallel toward a set of remote servers."," ","Those commands are executed on the remote servers by the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ilorest"]}," application installed in the operating system (Figure 3) of remote servers."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The second use case starts several ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ilorest"]}," commands in parallel, all of them targeting the underlying local iLO (Figure 4)."]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info","name":"Note"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Both use cases mentioned in this paragraph use the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["--cache-dir"]}," option."," ","Refer to this"," ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/docs/redfishclients/ilorest-userguide/usage#using---nocache-instead-of-isolated-cache-directories","target":"_blank"},"children":["paragraph"]}," ","in the iLOrest user guide for more detail and an example about the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["--nocache"]}," iLOrest option."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"use-case-1-ilorest-commands-executed-on-remote-servers","__idx":8},"children":["Use case 1: iLOrest commands executed on remote servers"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Offloading iLOrest processing onto remote servers may be required in secure environments where iLOs are physically disconnected from the network."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In this case, in-band management requires an operating environment up and running with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["sshd"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ilorest"]}," installed and configured on all the managed nodes."," ","This operating environment could be a customized Live-CD booted via the iLO virtual Drive facility as explained in a ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://developer.hpe.com/blog/in-band-management-with-ilorest-and-a-livecd/"},"children":["previous article"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"img","attributes":{"src":"/assets/3-ilorestinbandcase1.2001118ad388715a67d63489d593d2bdee3971ac6adcffbe609fd18a78d96f7f.11704621.png","alt":"Figure 3: iLOrest sessions on remote servers","title":"Figure 3: iLOrest sessions on remote servers"},"children":[]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"i","attributes":{},"children":["Figure 3: iLOrest sessions on remote servers"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The in-band version of our Bios configuration requires one more step compared to the out-of-band method: the copy of the JSON configuration file onto all the managed nodes."," ","This operation is simple to perform with the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["clush --copy"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["clush --dest"]}," options dedicated to that purpose."," ","Moreover, this copy will not impact the overall process time because the JSON configuration file to transfer is a small ASCII file:"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In the following example, the use of a temporary cache directory is a good practice to avoid cache contention in case other users"," ","start their own iLOrest sessions on the same remote servers. In addition, return codes are not handled to keep the example simple. In a production environment, you should always check the return codes of each command to ensure that the operation was successful."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"#!/usr/bin/env bash\n\n# Generate a temporary cache directory to be used by iLOrest commands on the remote servers.\nCACHEDIR=$(mktemp --dry-run --directory \"/tmp/ilorest_cache_XXXX\")\n\n# Define the `clush` command to be processed by user `root` to avoid providing credentials to create iLOrest sessions on the remote servers.\n# It is possible to communicate with underlying iLO without credentials when connected as root/Administrator\n# on iLO 5 and iLO 6 based servers with iLO in `Production` security state.\n# On iLO 7 (and later) it is required to have a registered iLOrest application account and be connected as a privileged user (root/Administrator).\nCLUSH=\"clush --nostdin --user=root \"\n\n# Specify `--logdir` to avoid the creation of a log folder in an unwanted location on the remote servers.\niLOrest=\"ilorest --nologo --logdir /var/log --cache-dir=${CACHEDIR}\"\n\n# Generate the list of remote servers to manage in parallel.\nSRV_LIST=$(nodeset -f \"@lab\")\n\n# Copy the BiosConfig.json file to all the remote servers\n$CLUSH -w $SRV_LIST --copy BiosConfig.json --dest /tmp/. \n\n# In-band login to the iLO with no credentials and load the BiosConfig.json file.\n$CLUSH -w $SRV_LIST \"$iLOrest login --selector=Bios.\" # selector is HpBios. on Gen9 servers\n$CLUSH -w $SRV_LIST \"$iLOrest load -f /tmp/BiosConfig.json \"\n\n# Retrieve the SessionCollection from all the remote servers and display it in JSON format.\n# In-band sessions URIs start with \"systemadministrator\" on iLO 5 and iLO 6 and \"ilorest*\" on iLO 7 and later.\n$CLUSH -w $SRV_LIST \"$iLOrest ls --select SessionCollection. --json\"\n\n# Logout from the iLO on all the remote servers.\n# This is a good practice to avoid saturating the iLO with too many concurrent sessions.\n$CLUSH -w $SRV_LIST \"$iLOrest logout\"\n\n# Remove the temporary cache directory and Bios configuration file on all the remote servers\n$CLUSH -w $SRV_LIST \"rm -rf ${CACHEDIR} /tmp/BiosConfig.json\"\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"use-case-2-ilorest-sessions-started-concurrently-on-local-host","__idx":9},"children":["Use case 2: iLOrest sessions started concurrently on local host"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In this second use case, multiple ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ilorest"]}," sessions are started concurrently on the local host that"," ","target the underlying iLO (Figure 4). This use case could happen when several system managers are working on the same server"," ","and they want to perform in-band management in parallel."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Or, you may be the only one managing a set of servers and, for some reasons, you opened several ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ssh"]}," sessions,"," ","each in a different terminal toward the same server"," ","and you want to perform in-band management in parallel from those sessions."]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"warning","name":"Attention"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In this use case, in addition to providing a cache directory for each iLOrest command,"," ","you need to be careful about the number of concurrent iLOrest sessions opened toward the underlying iLO."," ","Read carefully the limitations provided in the"," ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/docs/redfishclients/ilorest-userguide/usage#concurrent-in-band-execution-on-a-single-server","target":"_blank"},"children":["documentation"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["At the time of writing this article, HPE recommends a maximum of 8 concurrent iLOrest sessions toward the local iLO, regardless of the iLO generation."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"img","attributes":{"src":"/assets/4-ilorestinbandcase2.d807e1d479f36108431e79f177da35456aa9257a00f919c0980a2c51edc035e1.11704621.png","alt":"Figure 4: iLOrest sessions started concurrently on local host","title":"Figure 4: iLOrest sessions started concurrently on local host"},"children":[]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"i","attributes":{},"children":["Figure 4: iLOrest sessions started concurrently on local host"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Although the following example is similar to the ones presented in the"," ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/docs/redfishclients/ilorest-userguide/usage#concurrent-in-band-execution-on-a-single-server","target":"_blank"},"children":["Using HPE iLOrest"]}," documentation section, it is always good to provide redundant information on important topics like this one."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The key points of this example are the following:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Start of multiple ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ilorest"]}," sessions in parallel toward the underlying iLO."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The number of concurrent sessions is limited to 8 (limit recommended by HPE at the time of writing)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Each session is started with the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["login"]}," iLOrest command."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["An empiric sleep time of a few seconds is added between starting each session to avoid overwhelming the system TPM"," ","or the CHIF."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["All commands (including ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["login"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["logout"]},") are using a specific cache directory to avoid cache contention."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Each session is performing ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["get"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["set"]}," operations to simulate a real-world management operation."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Each session is ended with a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["logout"]}," operation to formally close the session in iLO and clean the iLOest local cache."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["A cleanup of the iLOrest sessions is performed at the end of the script in case some sessions are still opened in iLO."]}]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info","name":"Note"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The following example has been tested with iLOrest version 7.4.0.0. You can download the latest version of"," ","iLOrest from the"," ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"https://github.com/HewlettPackard/python-redfish-utility/releases/latest","target":"_blank"},"children":["HPE iLOrest GitHub repository"]}," ","or from ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"https://pypi.org/project/ilorest/","target":"_blank"},"children":["PyPI.org"]},"."]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"#!/usr/bin/env bash\n\n# IMPORTANT: This script must be used for training purposes only. \n#            It is intended to pin-point the best practices \n#            when performing in-band management of iLO based\n#            HPE servers.\n#            This script should not be run on production systems.\n#            If you don't respect those good practices, you may\n#            saturate the iLO number of sessions. \n\n\n\n# This script simulates in-band parallel jobs. A job is composed of the following operations:\n#\n# * ilorest login   \n# * ilorest get and set properties\n# * ilorest logout\n\n# Jobs are lauched in parallel. They modify the same `AssetTag` property. \n# The resulting property value is not important at all. This modification\n# is just for simulating a real-world management operation.\n\n# SUMMARY of in-band good practices:\n#\n# * Use a specific cache directory for each and every `ilorest` command in the job,\n#   including login and logout.\n# * Limit the number of iLOrest opened sessions to 8, regardless the iLO generation.\n# * Perform a formal `login` operation to create a session and provide \"some time\"\n#   before starting another iLOrest session/job\n# * Always logout when all job commands are performed.\n\n# ==============================================================================\n\n# iLO credentials for session cleanup in case of saturated in-band sessions\nread -p \"Enter iLO admin username: \" user\nread -s -p \"Enter iLO admin password (No echo on screen): \" password\n\n# The following `ilorest` variable definition adds:\n# * `--nologo` to limit printing redundant and useless output.\n# * `--logdir` to centralize logging messages\n#   and avoid the creation a of log folder in un-wanted places.\nilorest=\"ilorest --nologo --logdir /var/log\" \n\n# Cleanup AssetTag property to avoid reaching property max limit during tests.\n$ilorest login  &>/dev/null  # Always good practice to login properly\n$ilorest set AssetTag=' ' --select ComputerSystem.  --commit &>/dev/null\n\n# Always logout when job is done in order to disconnect session properly\n# in iLO and clean local cache.\n$ilorest logout &>/dev/null\necho\n\nrun_ilorest_job() {\n    j=$1\n    echo \"Processing Job${j}\" \n    \n    # Temporary cache directory creation\n    CACHEDIR=$(mktemp --directory \"/tmp/ilorest_cache_${j}_XXXX\")\n    \n    # Good practice is to login before sending any in-band commands\n    $ilorest --cache-dir=${CACHEDIR} login &>/dev/null\n\n    # The goal of the get and set operations below is to simulate real\n    # management operations.\n    # Retrieving AssetTag property from fresh cache.\n    AssetTag=$($ilorest --cache-dir=${CACHEDIR} \\\n          get AssetTag --select ComputerSystem. --refresh | awk -F= '{print $NF}' | grep -v Done)\n    \n    # Appending the current Job in the AssetTag property\n    if [ $j -eq 1 ] ; then\n       AssetTag=\"J${j}\"\n    else\n       AssetTag+=\"J${j}\"\n    fi\n\n    $ilorest --cache-dir=${CACHEDIR} \\\n          set AssetTag=\"${AssetTag}\" --select ComputerSystem.  --commit #&>/dev/null\n    \n    # The following logout command is required to avoid the saturation of iLO sessions.\n    # That would result in errors (i.e. ilorest error 7), and potentially require an iLO reset to recover.\n    echo \"Job: $j log out from iLO\"\n    $ilorest --cache-dir=${CACHEDIR} logout &>/dev/null\n\n    # Cleanup the temporary job's cache directory.\n    rm -rf ${CACHEDIR}\n\n    echo \"Job $j completed\"\n    echo\n}\n\n# Start jobs in background\n\n# HPE recommends a number of parallel in-band session below or equal to 8 to ensure you\n# never reach the maximum in-band session limit. This limitation is valid for\n# iLO 5, 6 7 and later.\n\n# By launching more than 8 jobs in parallel, the probability to trigger errors is very high,\n# especially if you don't logout properly when jobs are done.\n# Feel free to decrease the number of parallel jobs and study the behaviour\n# proper logout or not.\n\ni=8\nfor j in $(seq 1 $i) ; do\n    # Start jobs in background\n    run_ilorest_job $j &\n    # Allow some time before starting the next job.\n    # Launching jobs too quickly may generate contention\n    # at TPM level on iLO 7 and later generations.\n    sleep 3\n    echo\ndone\n\n# Wait for background jobs to finish.\nwait\n\n# Cleanup in-band iLOrest sessions if needed.\n# This step should not be necessary if you respect \n# the good in-band management practices listed above.\n\necho \"Cleanup of in-band iLOrest sessions\"\n$ilorest login -u $user -p $password\n\n# iLO generation detection.\niLOGen=$($ilorest detectilo | awk '/Type: / {print $NF}')\n\n# The following case is necesary, as `SessionName` and `UserType` property\n# have different values depending on the iLO generation.\n\ncase $iLOGen in\n    7|8)\n        SessionName=\"ilorest0\"\n        UserTag=\"Host Application\"\n        ;;\n   5|6)\n       SessionName=\"systemadministrator0\"\n       UserTag=\"RESTHost\"\n        ;;\n   *)\n     echo \"iLO generation not recognized\"\n     exit 1\nesac\n\n# Retrieve in-band session locations\nHostUserList=$($ilorest list --select SessionCollection --json | \\\n      jq -r '.Members[] | .\"@odata.id\"'  | grep $SessionName)\n\n# Delete in-band sessions\nfor u in $HostUserList ; do\n    $ilorest select Session. --refresh\n    UT=$($ilorest get Oem/Hpe/UserTag --filter \"@odata.id=${u}\" --json )\n    if [[ \"$UT\" =~ \"$UserTag\" ]] ; then\n        echo \"Deleting ${u}\"\n        $ilorest rawdelete \"$u\"\n    fi\ndone\n\n$ilorest logout \n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"conclusion","__idx":10},"children":["Conclusion"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In Linux infrastructures, iLOrest combined to the ClusterShell offers easy out-of-band and in-band management scripting possibilities for"," ","system administrators who prefer using Bash to pure Python. Of course, there are pros and cons to both methods."," ","Out-of-band iLOrest management does not require a customized operating environment running on the managed servers."," ","In-band management offers the possibility to physically disconnect iLOs to decrease the network footprint."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In Windows environments, system managers should be able to perform similar efficient parallel configuration of their servers using ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://devblogs.microsoft.com/scripting/parallel-processing-with-jobs-in-powershell/"},"children":["PowerShell"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In addition to presenting out-of-band parallel management, this article also presents in-band parallel management with iLOrest and"," ","insists on the importance of starting a limited number of sessions as well as using a specific cache directory for each iLOrest sessions"," ","and commands. It also emphasizes the importance of logging out from iLO when the management operation is completed to avoid saturating the"," ","iLO with too many concurrent sessions."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["And don't forget to check out some of my other ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"https://developer.hpe.com/search/?term=donze","target":"_blank"},"children":["blog posts"]}," ","on the HPE Developer portal to learn more about Redfish tips and tricks."]}]},"headings":[{"value":"Massive parallel management with iLOrest on Linux","id":"massive-parallel-management-with-ilorest-on-linux","depth":1},{"value":"Introduction","id":"introduction","depth":2},{"value":"Clush and pdsh: Quick (and dirty) overview","id":"clush-and-pdsh-quick-and-dirty-overview","depth":2},{"value":"Nodeset management","id":"nodeset-management","depth":2},{"value":"Out-of-band or in-band: that is the question","id":"out-of-band-or-in-band-that-is-the-question","depth":2},{"value":"Who kicked me out?","id":"who-kicked-me-out","depth":2},{"value":"Parallel out-of-band management","id":"parallel-out-of-band-management","depth":2},{"value":"Parallel in-band management","id":"parallel-in-band-management","depth":2},{"value":"Use case 1: iLOrest commands executed on remote servers","id":"use-case-1-ilorest-commands-executed-on-remote-servers","depth":3},{"value":"Use case 2: iLOrest sessions started concurrently on local host","id":"use-case-2-ilorest-sessions-started-concurrently-on-local-host","depth":3},{"value":"Conclusion","id":"conclusion","depth":2}],"frontmatter":{"markdown":{"toc":{"hide":false,"depth":2},"lastUpdateBlock":{"hide":false}},"breadcrumbs":{"hide":true},"seo":{"title":"Massive parallel management with iLOrest on Linux"}},"lastModified":"2026-10-23T03:25:55.602Z","pagePropGetterError":{"message":"","name":""}},"slug":"/docs/references_and_material/blogposts/ilorest/massiveparallelmanagement/massiveparallelmanagement","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}