2016-02-17 17 views
13

Quando si utilizzano i metodi seguenti per arrestare e interrogare le istanze del ruolo. Quando spengo una VM tutte le altre istanze di ruolo vengono restituite con uno stato di pronto sconosciuto. Dopo circa un paio di minuti posso interrogare nuovamente e ottenere lo stato attuale. Come posso ottenere lo stato attuale in tempo reale, utilizzando le API di gestione di Azure. O si tratta di un problema con come sono configurate le VM? Essi sono configurati con la stessa posizione di archiviazione e la stessa rete virtualeLa chiusura della macchina virtuale restituisce tutti gli stati VM come sconosciuti

Il codice mostrato è stato basato fuori il modello per implementare e gestire macchine virtuali in Visual Studio 2015.

La chiamata per spegnere il VM:

var shutdownParams = new VirtualMachineShutdownParameters(); 

if (deallocate)//deallocate is true in this instance 
    shutdownParams.PostShutdownAction = PostShutdownAction.StoppedDeallocated; // Fully deallocate resources and stop billing 
else 
    shutdownParams.PostShutdownAction = PostShutdownAction.Stopped; // Just put the machine in stopped state, keeping resources allocated 

await _computeManagementClient.VirtualMachines.ShutdownAsync(_parameters.CloudServiceName, _parameters.CloudServiceName, vmName, shutdownParams); 

la chiamata alla query per tutte le istanze di ruolo XXX_VirtualMachine è una classe che contiene il nome e l'istanza di stato:

internal List<XXX_VirtualMachine> GetAllVirtualMachines() 
{ 
    List<XXX_VirtualMachine> vmList = new List<XXX_VirtualMachine>(); 
    try 
    { 
     DeploymentGetResponse deployment; 

     deployment = _computeManagementClient.Deployments.GetByName(_parameters.CloudServiceName, _parameters.CloudServiceName); 

     for (int i = 0; i < deployment.RoleInstances.Count; i++) 
     { 
      vmList.Add(new XXX_VirtualMachine(deployment.RoleInstances[i].InstanceName, deployment.RoleInstances[i])); 
     } 
    } 
    catch (Exception e) 
    { 
     System.Windows.Forms.MessageBox.Show(e.Message); 
    } 
    return vmList; 
} 
+0

Questa domanda mi incuriosisce, ma non ho molto tempo per esplorarlo! Potresti mettere insieme una piccola app per console che mostri ciò che stai vedendo (qualcosa che posso inserire in VS e guardare quando ho un'ora) - Non posso promettere che troverò qualcosa! ma non si sa mai –

+0

Potrei mettere insieme un'app ma non posso concederti l'accesso alle mie macchine e al certificato di gestione di Azure. Posso creare una shell in cui fornire il nome del servizio cloud e un percorso per un certificato per verificare se si dispone di un account Azure. Le mie scuse, ma il mio team per la sicurezza personale sarebbe su di me se lo facessi. – Sorceri

+0

Va bene, ho account e ambienti di test su cui posso farcela, non è il momento di mettere insieme il codice, speravo che qualcun altro lo scoprisse! Ma dato che non ce l'ho, gli darò un calcio! –

risposta

1

Quindi alla fine sono riuscito a dare un calcio! (scuse per il ritardo, la gente continuava ad aspettarsi quella roba da lavoro - pazzi sconsiderati!)

In primo luogo, questa non è davvero una risposta! solo un'esplorazione del problema, e probabilmente lo saprai già, ma forse qualcuno che lo leggerà vedrà qualcosa che mi è sfuggito.

Ho creato tre macchine virtuali, in un unico servizio cloud, e lo-and-behold! ha fatto esattamente quello che hai previsto quando ne hai chiuso uno.

In primo luogo, entrambi i portali sembrano dare risposte affidabili, anche quando la richiesta .Net sta segnalando RoleStatusUnknown.

Guardando il XML che esce dalla richiesta di

https://management.core.windows.net/{subscriptionid}/services/hostedservices/vm01-u3rzv2q6/deploymentslots/Production 

otteniamo

<RoleInstance> 
    <RoleName>vm01</RoleName> 
    <InstanceName>vm01</InstanceName> 
    <InstanceStatus>RoleStateUnknown</InstanceStatus> 
    <InstanceSize>Basic_A1</InstanceSize> 
    <InstanceStateDetails /> 
    <PowerState>Started</PowerState> 

Poi ho sparato PowerShell per vedere se che stava facendo lo stesso, che è stato (non imprevisto poiché chiama lo stesso punto REST). con Get-AzureVm ritorno

ServiceName Name Status   
----------- ---- ------   
vm01-u3rzv2q6 vm01 CreatingVM  
vm01-u3rzv2q6 vm02 RoleStateUnknown 
vm01-u3rzv2q6 vm03 RoleStateUnknown 

nei momenti opportuni, che ancora una volta, è come visto.

chiedendo cosa il cronometro è stato, poi ho eseguito questo

while ($true) { (get-azurevm -ServiceName vm01-u3rzv2q6 -Name vm01).InstanceStatus ; get-azurevm ; (date).DateTime } 

ReadyRole 
vm01-u3rzv2q6 vm01 ReadyRole 
vm01-u3rzv2q6 vm02 ReadyRole 
vm01-u3rzv2q6 vm03 ReadyRole 
07 March 2016 04:31:01 

07 March 2016 04:31:36 
StoppedDeallocated 
vm01-u3rzv2q6 vm01 Stoppe... 
vm01-u3rzv2q6 vm02 RoleSt... 
vm01-u3rzv2q6 vm03 RoleSt... 
07 March 2016 04:31:49 

07 March 2016 04:33:44 
StoppedDeallocated 
vm01-u3rzv2q6 vm01 Stoppe... 
vm01-u3rzv2q6 vm02 ReadyRole 
vm01-u3rzv2q6 vm03 ReadyRole 
07 March 2016 04:33:52 

così sembra che la macchina si spegne, quindi un processo deve iniziare per aggiornare il servizio cloud, che prende la sua capacità di interrogare il suo status per , quello che sembra, esattamente due minuti.

Da qualche parte nell'API deve esserci una posizione che viene segnalata correttamente perché i portali non hanno questo problema.

Ho passato un po 'di tempo in un vicolo cieco alla ricerca di un' InstanceView 'per la VM, ma sembra che non esista per le distribuzioni classiche.

Il mio prossimo pensiero è quello di mettere insieme un semplice client di riposo che prende un certificato di gestione e vedere se l'URI può essere violato un po 'per dare qualcosa di più interessante. (deve essere lì da qualche parte!)

Ciò che può essere utile, è che il PowerState non è interessato da questo problema. Quindi potresti potenzialmente avere un controllo secondario per questo mentre hai l'errore RoleStateUnknown, ben lontano dall'essere perfetto, ma a seconda di cosa stai cercando di farlo potrebbe funzionare.

In caso contrario, direi che si tratta chiaramente di un bug in Azure e che potrebbe sicuramente ricevere una chiamata di supporto.

+0

Grazie per aver dedicato del tempo e per confermare il problema. Ti ha assegnato i punti per lo sforzo che hai messo. – Sorceri