API - Powershell Create host and Deploy task script



  • I hope this helps someone out. I am using this to deploy physicals from a Cloud Management Platform. I am sure others will have similar uses while integrating to other systems/tools.

    <#
    Description: Script that calls out to Fog Pxe Imaging Server to create a Host entry and start a deploy imaging task.
    Requirements: 
    -vComamnder 6.1.X or higher https://www.embotics.com
    -Powershell V4 or greater
    -Fog Version 1.4.4 or greater https://fogproject.org/
    
    Note:
    Your Environment may require additional or diffrent settings.  
    
    vCommander workflow Run Syntax:
    powershell.exe c:\Scripts\fog\DeployImage.ps1 -MachineName "#{target.settings.customAttribute['Name']}" -MacAddress "#{target.settings.customAttribute['MAC Address']}" -imagename "#{target.settings.customAttribute['Image']}"
    #>
                
    
    [CmdletBinding()]
    	param(
            [switch]$Elevated,
            [Parameter(Mandatory=$True)]
            [String] $MachineName = $(Throw "Provide the target machines Name"),
            [String] $MacAddress = $(Throw "Provide the target machines MAC Address"),
            [String] $ImageName = $(Throw "Provide the Image Name to assign to the new target host")
            )
    
    #######################################################################################################################
    # Configure the variables below for the Fog Server
    #######################################################################################################################
        #FogServer
            $fogApiToken = 'Fog Api Token'
            $fogUserToken = 'Fog User Token'
            $fogServer = "fog IP addrress"
            $Description = "Created by vCommander"  
        
    ########################################################################################################################
    # Nothing to configure below this line - Starting the main function of the script
    ########################################################################################################################
    
    ########################################################################################################################
    # Setting Cert Policy - required for successful auth with the phpipam API if set to https
    ########################################################################################################################
    add-type @"
        using System.Net;
        using System.Security.Cryptography.X509Certificates;
        public class TrustAllCertsPolicy : ICertificatePolicy {
            public bool CheckValidationResult(
                ServicePoint srvPoint, X509Certificate certificate,
                WebRequest request, int certificateProblem) {
                return true;
            }
        }
    "@
    [System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy
    [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12;
    
    ########################################################################################################################
        #Setup Auth headers and base url for FogServer
            $headers = @{};
            $headers.Add('fog-api-token', $fogApiToken);
            $headers.Add('fog-user-token', $fogUserToken);
            $baseUri = "http://$fogServer/fog"
        
        #Get Image List From Fog Server
            Try{
                $ImageURL = $baseUri+"/image/"
                $ImageResult = Invoke-RestMethod -Uri $ImageURL -Method GET -Headers $headers -ContentType "application/json"
                $Image = $ImageResult.images | Select-object imageTypeID,id,name | Where-object {$_.name -eq $ImageName}
                }Catch{Write-Host "Failed to get Image data from Fog" -ForegroundColor Red
                    $error[0] | Format-List -Force
                    Exit 1
                    }
    
        #GetHost List from fog Server ***Not nessicary but nice to have incase you want to use it for other data checks***
            Try{
                $HostURL = $baseUri +"/host/"
                $HostResult = Invoke-RestMethod -Uri $HostURL -Method GET -Headers $headers -ContentType "application/json"
                }Catch{Write-Host "Failed to get HostList from Fog" -ForegroundColor Red
                    $error[0] | Format-List -Force
                    Exit 1
                    }
    
        #Create Host entry from vCommander
           $HostJson = @{
                               "name"=  $MachineName
                               "description"=  $Description
                               "macs" =  @($MacAddress)
                               "imageID"= $Image.id
                               "imagename" =  $ImageName  
                               }
            Try{                    
                $CreateHostJson = ConvertTo-Json($HostJson)
                $createHostURL = $baseUri +"/host/create"
                $createHostResult = Invoke-RestMethod -Uri $createHostURL -Method POST -body $CreateHostJson -Headers $headers -ContentType "application/json"
               }Catch{Write-Host "Failed to create host in Fog" -ForegroundColor Red
                    $error[0] | Format-List -Force
                    Exit 1
                    }
    
        #Get Task types to confirm Structure
             Try{
                 $TasktypesURL = $baseUri + "/tasktype"
                 $TasktypesResult = Invoke-RestMethod -Uri $TasktypesURL -Method GET -Headers $headers -ContentType "application/json"
                 $TasktypeID = ($TasktypesResult.tasktypes | Select-object name,id | Where-object {$_.name -eq "Deploy"}).id
                 }Catch{Write-Host "Failed to get Task types from Fog" -ForegroundColor Red
                    $error[0] | Format-List -Force
                    Exit 1
                    }
    
        #Create Task to Image Host    
            $ImageID = $image.id
            $HostID = $createHostResult.id  
    
            $TaskURL = $baseUri + "/host/" + $HostID + "/task"
            $TaskdataSet = @{
                "hostname" = $createHostResult.name
                "taskTypeID" = $TasktypeID
                }
            Try{
                $taskdataToSend = ConvertTo-JSON($TaskdataSet)
                $TaskResult = Invoke-RestMethod -Method Post -Uri $TaskURL -Headers $headers -Body $taskdataToSend -ContentType "application/json"
                }Catch{Write-Host "Failed to create Deploy Task in Fog" -ForegroundColor Red
                    $error[0] | Format-List -Force
                    Exit 1
                    }
    
    
    

  • Moderator

    Great job man, really! It’s so nice to see people using the API.


Log in to reply
 

455
Online

39.4k
Users

11.1k
Topics

105.4k
Posts

Looks like your connection to FOG Project was lost, please wait while we try to reconnect.