Remote Install and Folder Copy Problem

This topic contains 4 replies, has 3 voices, and was last updated by Profile photo of Chris Polvorosa Chris Polvorosa 4 months, 2 weeks ago.

  • Author
    Posts
  • #65778
    Profile photo of Chris Polvorosa
    Chris Polvorosa
    Participant

    Trying to broaden my skills and exploring with my first script and running into problems. I've kind of researched and put together the following. My goal is from a .txt list of servers to copy a folder from my local c:\ to a specified folder on the destination server. next install the .msi, copy another folder from a source server to the target and finally restart the new service that was installed.
    if I enter the variables manually line by line then run the commands it is successful but if I run the .ps1 all together it gives me a null error indicating it's not carrying the variables to the remote session. I've tried to read about params but for one reason or another it's not clicking so looking for some help. I'm open to any other constructive criticism on the code as well 🙂 Thanks in advance.

    #defines the list of destination computers
    $computers = Get-Content "c:\scripts\computers.txt"

    #defines the ps session to the dest server
    $session = New-PSSession -ComputerName $comp

    #defines the splunk uf source folder on your computer
    $source = "c:\splunkuf"
    $sourcespl = "\\server\e$\program files\splunk\etc\deployment-apps\all_deploymentclients"

    #defines the destination source where the splunk msi will be copied
    $dest = "\\$comp\c$"
    $destspl = "\\$comp\c$\program files\SplunkUniversalForwarder\etc\apps"

    #defines the deployment command after the msi is copied
    $deploy = { & msiexec.exe /I c:\splunkuf\splunkforwarder-6.5.2-67571ef4b87d-x64-release.msi AGREETOLICENSE=Yes /quiet}

    foreach ($comp in $computers){
    #copies from the splunk msi folder source to the target server c: drive
    Copy-Item $source $dest -Recurse -Force
    Start-Sleep -s 3

    #remote executes the splunk msi on the target server
    Invoke-Command -Session $session -ScriptBlock $deploy
    Start-Sleep -s 20

    #copies the master deployment folder from spl-mstr-prod to the target server
    Copy-Item $sourcespl $destspl -Recurse -Force
    Start-Sleep -s 10

    #restarts the splunk forwarder service on the target server
    Invoke-Command -Session $session -ScriptBlock {Restart-Service SplunkForwarder -force}
    }

  • #65779
    Profile photo of Curtis Smith
    Curtis Smith
    Participant

    Hey Chris,
    It looks like you are just setting your variables out of order.

    Here you are setting your $dest variables using the $comp variable:

    #defines the destination source where the splunk msi will be copied
    $dest = "\\$comp\c$"
    $destspl = "\\$comp\c$\program files\SplunkUniversalForwarder\etc\apps"

    but that is done before you set the $comp variable with a value here later in the script:

    foreach ($comp in $computers){

    as a result, while you expect $dest and $destspl to contain values such as:

    \\server1\c$
    \\server1\c$\program files\SplunkUniversalForwarder\etc\apps

    they in fact only contain:

    \\\c$
    \\\c$\program files\SplunkUniversalForwarder\etc\apps

    It is likely the reason that this works when you run manually is because you are using the ISE and the $comp variable is already defined from a previous run of the script while you were testing.

    To resolve you should move the assignment of your $dest and $destspl variables inside of your foreach loop

    foreach ($comp in $computers){
        $dest = "\\$comp\c$"
        $destspl = "\\$comp\c$\program files\SplunkUniversalForwarder\etc\apps"
  • #65781
    Profile photo of Sam Boutros
    Sam Boutros
    Participant

    The $session and $dest definitions should go inside the foreach loop. Also add line to dispose of the $session:

    
    #defines the list of destination computers
    $computers = Get-Content "c:\scripts\computers.txt"
    
    #defines the splunk uf source folder on your computer
    $source = "c:\splunkuf"
    $sourcespl = "\\server\e$\program files\splunk\etc\deployment-apps\all_deploymentclients"
    
    #defines the deployment command after the msi is copied
    $deploy = { & msiexec.exe /I c:\splunkuf\splunkforwarder-6.5.2-67571ef4b87d-x64-release.msi AGREETOLICENSE=Yes /quiet}
    
    foreach ($comp in $computers){
    
        #defines the ps session to the dest server
        $session = New-PSSession -ComputerName $comp
    
        #defines the destination source where the splunk msi will be copied
        $dest = "\\$comp\c$"
        $destspl = "\\$comp\c$\program files\SplunkUniversalForwarder\etc\apps"    
        
        #copies from the splunk msi folder source to the target server c: drive
        Copy-Item $source $dest -Recurse -Force
        Start-Sleep -s 3
    
        #remote executes the splunk msi on the target server
        Invoke-Command -Session $session -ScriptBlock $deploy
        Start-Sleep -s 20
    
        #copies the master deployment folder from spl-mstr-prod to the target server
        Copy-Item $sourcespl $destspl -Recurse -Force
        Start-Sleep -s 10
    
        #restarts the splunk forwarder service on the target server
        Invoke-Command -Session $session -ScriptBlock {Restart-Service SplunkForwarder -force}
    
        # dispose of the PS session
        $session | Remove-PSSession
    }
    
    
    • #65785
      Profile photo of Curtis Smith
      Curtis Smith
      Participant

      Ah, I missed $session with the same issue. Good catch Sam.

  • #65878
    Profile photo of Chris Polvorosa
    Chris Polvorosa
    Participant

    awesome! I wasn't too far off then. Thank you both!

You must be logged in to reply to this topic.