I had a few scripts that were written WAY before PowerTool was out of beta, and the only way I knew how to generate a Service Profile Template was to use manual XML calls. For instance:

     
$cmd = "<configConfMos inHierarchical='true'> 
      <inConfigs>
          <pair key='org-root/org-" + $orgName + "/ls-" + $serviceProfileName + "' >    
              <lsServer
                  agentPolicyName=''
                  biosProfileName=''
                  bootPolicyName='" + $bootPolicyName + "'
                  descr='' 
                  dn='org-root/org-" + $orgName + "/ls-" + $serviceProfileName + "' 
                  dynamicConPolicyName=''
                  extIPState='none'
                  hostFwPolicyName=''
                  identPoolName='" + $UUID_POOL_NAME + "'
                	localDiskPolicyName='default'
                	maintPolicyName='default'
                	mgmtAccessPolicyName=''
                	mgmtFwPolicyName=''
                	name='" + $serviceProfileName + "'
                	powerPolicyName='default'
                	scrubPolicyName=''
                	srcTemplName=''
                	statsPolicyName='default'
                	status='created'
                	type='initial-template'
                	usrLbl=''
                	uuid='0'
                	vconProfileName=''>
                	<vnicEther
                		adaptorProfileName='VMWare'
                		addr='derived'
                		adminVcon='any'
                		identPoolName=''
                		mtu='1500'
                		name='" + $VNIC_A_NAME + "'
                		nwCtrlPolicyName=''
                		nwTemplName='" + $VNIC_TEMPLATE_A_NAME + "'
                		order='3'
                		pinToGroupName=''
                		qosPolicyName=''
                		rn='ether-" + $VNIC_A_NAME + "'
                		statsPolicyName='default'
                		status='created'
                		switchId='" + $switchId + "'>
                		</vnicEther>
                		<vnicEther
                			adaptorProfileName='VMWare'
                			addr='derived'
                			adminVcon='any'
                			identPoolName=''
                			mtu='1500'
                			name='" + $VNIC_B_NAME + "'
                			nwCtrlPolicyName=''
                			nwTemplName='" + $VNIC_TEMPLATE_B_NAME + "'
                			order='4'
                			pinToGroupName=''
                			qosPolicyName=''
                			rn='ether-" + $VNIC_B_NAME + "'
                			statsPolicyName='default'
                			status='created'
                			switchId='" + $switchId + "'>
                		</vnicEther>
                		<vnicFcNode
                			addr='pool-derived'
                			identPoolName='" + $WWNN_POOL_NAME + "'
                			rn='fc-node' >
                		</vnicFcNode>
                		<vnicFc
                			adaptorProfileName='VMWare'
                			addr='derived'
                			adminVcon='any'
                			identPoolName=''
                			maxDataFieldSize='2048'
                			name='" + $VHBA_A_NAME + "'
                			nwTemplName='" + $VHBA_TEMPLATE_A_NAME + "'
                			order='1'
                			persBind='disabled'
                			persBindClear='no'
                			pinToGroupName=''
                			qosPolicyName=''
                			rn='fc-" + $VHBA_A_NAME + "'
                			statsPolicyName='default'
                			status='created'
                			switchId='" + $switchId + "'>
                		</vnicFc>
                		<vnicFc
                			adaptorProfileName='VMWare'
                			addr='derived'
                			adminVcon='any'
                			identPoolName=''
                			maxDataFieldSize='2048'
                			name='" + $VHBA_B_NAME + "'
                			nwTemplName='" + $VHBA_TEMPLATE_B_NAME + "'
                			order='2'
                			persBind='disabled'
                			persBindClear='no'
                			pinToGroupName=''
                			qosPolicyName=''
                			rn='fc-" + $VHBA_B_NAME+ "'
                			statsPolicyName='default'
                			status='created'
                			switchId='" + $switchId + "'>
                		</vnicFc>
                		<lsRequirement
                			name='" + $SERVER_POOL_NAME + "'
                			qualifier=''
                			restrictMigration='no'
                			rn='pn-req' >
                		</lsRequirement>
                		<lsPower
                			rn='power'
                			state='down' >
                		</lsPower>
                	</lsServer>
              </pair>
          </inConfigs>
      </configConfMos>"

Invoke-UcsXml -XmlQuery $cmd

If most of your script is composed of normal cmdlets, this looks pretty absurd - so if you can avoid calling direct XML, you should. Same thing if you’re trying to create your own PowerTool-esque library (say, with Python instead of bleh PowerShell), you would take these XML calls and hide them away in modular functions so that you can call them with a single command and a few arguments.

Most other templates (like vNIC and vHBA) have a dedicated cmdlet for creating those constructs. For instance:

    Add-UcsVhbaTemplate -Org $organization -Name "BARE-NONP-B" -Descr "Non-Prod Baremetal Fabric B" -IdentPoolName "WWPN-BARE-NONP-B" -SwitchId A -TemplType "updating-template"

As I tab through the cmdlets that start with “Add-UcsServiceProfile” I noticed there was no “Add-UcsServiceProfileTemplate” as one would expect.

Poking around in the release notes for v1.0 of the PowerTool library, I noticed that one of the new features was the ability to filter Service Profiles based on type (aimed at being able to get all the Service Profiles in the system:

    # Get all Service Profile Templates.
    
    Get-UcsServiceProfile -Filter 'Type -clike *-template' | select Ucs,Dn,Name

So I ran a Get-Help for this cmdlet:

    -Type <string>
        Specifies if service profile or service profile template needs to be created. Valid values are: initial-template, instance, updating-template
    
        Required?                    true
        Position?                    named
        Default value
        Accept pipeline input?
        Accept wildcard characters?

So….at least in this version of PowerTool, the same cmdlet is used to create SPs and SPTs, just need to set this “flag” to one of those three options.


Matt Oswalt

Matt Oswalt is an all-around technology nerd, currently focusing on networking, software development, and everything in between. He is at his happiest in front of a keyboard, next to a brewing kettle, or wielding his silo-smashing sledgehammer. He spends his days diving deep into the intersection of networking and software, and likes to blog about his experiences when he comes up for air. You can follow him on Twitter or LinkedIN.