2017-09-25 3 views
1

J'ai besoin d'automatiser l'exécution des scripts sur les machines virtuelles cibles en tant qu'administrateur de domaine. Le problème est, les machines virtuelles n'ont pas de public. Je ne devrais pas non plus réécrire le script tel qu'il a été écrit par un membre de l'équipe et je préfère fournir à mon équipe une solution qui fonctionne pour eux et qui est automatisable, au lieu de réécrire leurs scripts à chaque fois. Le processus actuel ressemble thiInformations d'authentification double saut de VSTS via le script Azure PowerShell au script PowerShell sur la machine virtuelle cible

  1. VSTS initie un processus de construction avec Azure scripts PowerShell command1.ps1
  2. Command1.ps1 installe Azure personnalisée Extension Script sur la cible VM
  3. téléchargements d'extension de script personnalisé et exécute commande2 .ps1 qui exécute command3.ps1 en tant qu'administrateur de domaine

Le problème que je vais avoir est que je suis incapable de passer les informations d'identification de VSTS à command2.ps1 S'il vous plaît, me recommander comment je dois faire e à correctement. Les options que je trouve:

  1. Je ne sais pas s'il est possible avec VSTS https://blogs.technet.microsoft.com/ashleymcglone/2016/08/30/powershell-remoting-kerberos-double-hop-solved-securely/

  2. Ajouter une adresse IP publique à la cible VM, configurer WinRM, exécutez command2.ps1, supprimer l'adresse IP publique

Je suis sûr qu'il existe une meilleure façon de procéder. command1.ps1:

param 
(
    [Parameter(Mandatory)] 
    [String]$resourceGroupName, 

    [Parameter(Mandatory)] 
    [String]$targetVMname, 

    [Parameter(Mandatory)] 
    [String]$vmLocation, 

    [Parameter(Mandatory)] 
    [String]$FileUri, 

    [Parameter(Mandatory)] 
    [String]$nameOfTheScriptToRun, 

    [Parameter(Mandatory)] 
    [String]$customScriptExtensionName, 

    [Parameter(Mandatory)] 
    [String]$domainAdminName, 

    [Parameter(Mandatory)] 
    [String]$domainAdminPassword 

) 

$domainAdminPasswordSecureString = ConvertTo-SecureString -String $domainAdminPassword -AsPlainText -Force 
$DomainCredentials = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $domainAdminName, $domainAdminPasswordSecureString 

Set-AzureRmVMCustomScriptExtension -Argument "-DomainCredentials $DomainCredentials" ` 
    -ResourceGroupName $resourceGroupName ` 
    -VMName $targetVMname ` 
    -Location $vmLocation ` 
    -FileUri $FileUri ` 
    -Run $nameOfTheScriptToRun ` 
    -Name $customScriptExtensionName 

Remove-AzureRmVMCustomScriptExtension -Force ` 
    -ResourceGroupName $resourceGroupName ` 
    -VMName $targetVMname ` 
    -Name $customScriptExtensionName 

command2.ps1:

param 
(
    [Parameter(Mandatory)] 
    [System.Management.Automation.PSCredential]$DomainCredentials 
) 

$url = "https://raw.githubusercontent.com/x/command2.ps1" 
$output = "C:\command2.ps1" 

Invoke-WebRequest -Uri $url -OutFile $output 
Start-Process -FilePath powershell.exe -ArgumentList $output -Credential $DomainCredentials 

Répondre

3

Vous n'avez pas vraiment le problème de double saut, parce que vous n'êtes pas d'exécuter la commande sur le nœud, vous lancez l'extension , qui télécharge le script et l'exécute.

Donc ce que vous devez faire est la suivante:

Set-AzureRMVMCustomScriptExtension ... -Argument "-domainAdminName admin -domainAdminPassword passw0rD" -VM $Vm 
$vm | Update-AzureVM 

et dans votre script (qui est invoqué dans la machine, donc command2.ps1) faire:

$domainAdminPasswordSecureString = ConvertTo-SecureString -String $domainAdminPassword -AsPlainText -Force 
$DomainCredentials = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $domainAdminName, $domainAdminPasswordSecureString 

et coller le appropriée params dans le deuxième script (donc il accepte ceux-ci)

Aussi, vous n'avez pas besoin du script intermédiaire, vous pouvez simplement télécharger "https://raw.githubusercontent.com/x/command2.ps1" et l'exécuter avec les arguments

+0

Souhaitez-vous transmettre un mot de passe en texte brut à partir de VSTS via Azure Custom Extension? Je ne pense pas que ce soit une bonne idée. Le mot de passe sera visible en tant que texte brut dans C: \ Packages \ Plugins \ Microsoft.Compute.CustomScriptExtension \ 1.9 \ RuntimeSettings \ 0.settings – WinBoss

+0

vous supprimez l'extension par la suite, donc n'a pas vraiment d'importance. cet endroit sera nettoyé. Ou vous pouvez utiliser des paramètres protégés et la commande à exécuter sera codée. https://docs.microsoft.com/en-us/azure/virtual-machines/windows/extensions-customscript – 4c74356b41

+0

Un moyen de transmettre des paramètres protégés avec PowerShell? Sinon, que feriez-vous? Seriez-vous sûr de passer le mot de passe comme une simple chaîne? – WinBoss