2016-02-17 7 views
13

При использовании нижеприведенных методов для выключения и запроса экземпляров роли. Когда я завершаю работу виртуальной машины, все другие экземпляры роли возвращаются с неизвестным статусом готовности. Примерно через пару минут я могу запросить еще раз и получить фактический статус. Как я могу получить фактический статус в режиме реального времени, используя API управления Azure. Или это проблема с настройкой виртуальных машин? Они настраиваются с таким же адресом хранения и той же виртуальной сетиВыключение VM возвращает все состояния VM как неизвестные

Код, показанный базировалась от шаблона для развертывания и управления виртуальными машинами в Visual Studio 2015

Призыв к остановке ВМ:

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); 

вызов запроса для всех экземпляров роли XXX_VirtualMachine это класс, который содержит имя и статус экземпляра:

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

Этот вопрос меня интриговал, но у меня не так много времени, чтобы исследовать его! Не могли бы вы добавить небольшое консольное приложение, которое показывает, что вы видите (что-то я могу зайти в VS и посмотреть, когда у меня есть час). Я не могу обещать, что найду что-нибудь! но вы никогда не знаете –

+0

Я мог бы добавить приложение вместе, но не могу предоставить вам доступ к моим машинам Azure и сертификату управления. Я могу создать оболочку, в которой вы укажете имя облачной службы и путь к сертификату, чтобы проверить, есть ли у вас учетная запись Azure. Приносим извинения, но моя команда по вопросам безопасности будет со мной, если я это сделаю. – Sorceri

+0

Это нормально, у меня есть учетные записи и тестовые среды, с которыми я могу работать, просто не время, чтобы вытащить код вместе, я надеялся, что кто-то еще это выяснит! Но так как они у меня не получится! –

ответ

1

Итак, я, наконец, добрался до этого удара! (приносят извинения за задержку, люди все время ожидали, что эта работа - неразумные дураки!)

Во-первых, это не совсем ответ! просто исследуйте проблему, и вы, вероятно, знаете все это уже, но, возможно, кто-то, кто ее прочитает, увидит то, что я пропустил.

Я создал три виртуальных машины в одном облачном сервисе, и вот-вот! он сделал именно то, что вы предсказали, когда вы закрыли его.

Во-первых, оба портала, кажется, дают надежные ответы, даже если запрос .Net сообщает RoleStatusUnknown.

Глядя на Xml, который выходит из запроса на

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

мы получаем

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

тогда я загорелся Powershell, чтобы увидеть, если это делает то же самое, что он был (не неожиданно, поскольку он вызывает ту же точку REST). с Get-AzureVm возвращающегося

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

в соответствующие моменты времени, которые опять же, как видно.

Хочет знать, что было время, я побежал этот

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 

Таким образом, кажется, что машина выключается, то процесс должен начать обновлять облачный сервис, который принимает его способность запрашивать статус для , что кажется, ровно две минуты.

Где-то в API должно быть место, где оно сообщается правильно, потому что у порталов нет этой проблемы.

Я потратил некоторое время на тупик, ищущий «экземпляр» для виртуальной машины, но, похоже, этого не существует для классического развертывания.

Следующая мысль состоит в том, чтобы собрать простой клиент для отдыха, который принимает сертификат управления и видит, можно ли взломать URI немного, чтобы дать что-нибудь интереснее. (его где-то там!)

Что может быть полезно, так это то, что проблема PowerState не подвержена этой проблеме. Поэтому у вас может быть дополнительная проверка, если у вас есть ошибка RoleStateUnknown, ее далеко не идеальная, но в зависимости от того, что вы хотите сделать, это может сработать.

В противном случае я бы сказал, что это явно ошибка в Azure, и определенно может быть вызван призыв к поддержке.

+0

Спасибо, что нашли время и подтвердили проблему. Наградил вас очками за усилия, которые вы вложили. – Sorceri