none
Remove-Cluster -Force RRS feed

  • Вопрос

  • Есть задачи с собиранием \ разбиранием кластеров. 
    Собрать кластер получается довольно просто, а вот разобрать не получается нормально

    Скрипт может быть запущен с любого сервера или ПК и на нем не обязательно есть RSAT (ставить оснастки под все подряд не красиво), в связи чем операции запихиваю в Invoke-Comand и выполняю на одной из нод кластера.

    ВМ"ки из кластера удаляются нормально но не могу удалить кластер при помощи Remove-Cluster (насколько я понял из описания командлета это аналог "Destroy Cluster" в оснастке)

    Скрипт запускается в консоли от имени админа пользователем который является доменным админом. Под этим же пользователем кластер создавался

    Отлук получаю вида: не хватает полномочий обратитесь к администратору

    При этом кластер переходит в подвешенное состояние (роли потушены на всех нодах, в оснастке доступен только журнал), в этом состояние эти ноды нельзя ввести вновь в кластер (минимум нужно ремувнуть фичу, максимум - удалить объект в АД)

    Скрипт имеет вид:

    $hstslist = @()
        $ClusterList = @()
    
        $ClusterList = Invoke-Command -Session $sessions -ScriptBlock {
            $clstatus = (Get-Service -Name "clussvc" -ErrorAction SilentlyContinue).Status
            if (-not ($clstatus -eq "Stopped") -and ![string]::IsNullOrEmpty($clstatus)){
                (Get-Cluster -ErrorAction SilentlyContinue)#.name
            } # End if
        }
        $ClusterList = $ClusterList | select -Unique 
        if (($ClusterList | Measure-Object).Count -eq 0){
            "$((Get-Date).ToString("dd.MM.yyyy HH:mm:ss"))  :  SKIPPED Remove clusters" | `
                Write-FileLog -Logname $logpath -SkipNullString -OutOnScreen
            break
        }
        elseif (($ClusterList |Measure-Object).Count -ge 1){
            foreach ($Cl in $ClusterList){
                Invoke-Command -ComputerName $Cl.PSComputerName -ScriptBlock {
                    $VMList = Get-ClusterGroup -ErrorAction SilentlyContinue | where GroupType -eq "VirtualMachine"
                    if (($VMList |measure).Count -ge 1) {
                        
                        $VMList | foreach {
                            $Retry = 0
                            $ResRemoveStatus = $False
                            do {
                                try {
                                    $_ | Remove-ClusterGroup -Force -RemoveResources -ErrorAction Stop
                                    $ResRemoveStatus = $True
                                } # End Try
                                Catch {}
                            } Until ($ResRemoveStatus -or ($Retry -ge 5))
                            if (!$ResRemoveStatus -or ($Retry -ge 5)) {$Error[0]}
                        } # End Foreach
                    }
                    
    
                    $ClusterNodes = @()
                    $ClusterNodes += Get-ClusterNode
                    if (($($ClusterNodes | Measure-Object).count - 1) -ge 1){
                        
                        for ($id=0; $id -lt ($($ClusterNodes | Measure-Object).count - 1); $id++ ){
                            $ClusterNodes[$id].name
                            Remove-ClusterNode -Name $ClusterNodes[$id].name -Force
                        } # End For
    
                    } # End If
                    Remove-Cluster -Force #-CleanupAD
                } # End If
            } # End Foreach
        } # End ElseIf
    Если ключ -Force убрать, то появляется запрос про удаление кластера, но запрос мне крайне не интересен (нужна полная автоматизация этого процесса)


    The opinion expressed by me is not an official position of Microsoft

    29 августа 2016 г. 14:22
    Модератор

Ответы

  • https://blogs.technet.microsoft.com/ashleymcglone/2016/08/30/powershell-remoting-kerberos-double-hop-solved-securely/

    Настройте, как в статье - PrincipalsAllowedToDelegateToAccount для узлов кластера.

    1 сентября 2016 г. 13:07
    Отвечающий
  • https://blogs.technet.microsoft.com/ashleymcglone/2016/08/30/powershell-remoting-kerberos-double-hop-solved-securely/

    Настройте, как в статье - PrincipalsAllowedToDelegateToAccount для узлов кластера.

    От различных дабл хопов я ушел используя credssp, но ноды удалить проблемно, так как нарушается кворумная модель и кластер выключается в случае форса после чего с ним сделать уже ничего нельзя

    Если форсить ремув кластер происходит нечто подобное

    Итог печален и без напильника не обходилось

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

    Ps. Спасибо за линк статья интересная


    The opinion expressed by me is not an official position of Microsoft


    2 сентября 2016 г. 5:56
    Модератор

Все ответы

  • была мысль что проблема в дабл хопах, перепроверил этот аспект следующим образом

    $hstslist = @()
    $ClusterList = @()
    
    $ClusterList = Invoke-Command -Session $sessions -ScriptBlock {
        $clstatus = (Get-Service -Name "clussvc" -ErrorAction SilentlyContinue).Status
        if (-not ($clstatus -eq "Stopped") -and ![string]::IsNullOrEmpty($clstatus)){
            (Get-Cluster -ErrorAction SilentlyContinue)#.name
        } # End if
    }
    $ClusterList = $ClusterList | select -Unique 
    if (($ClusterList | Measure-Object).Count -eq 0){
        "$((Get-Date).ToString("dd.MM.yyyy HH:mm:ss"))  :  SKIPPED Remove clusters" | `
            Write-FileLog -Logname $logpath -SkipNullString -OutOnScreen
        break
    }
    elseif (($ClusterList |Measure-Object).Count -ge 1){
        foreach ($Cl in $ClusterList){
            $ClusterNodes = @()
            $ClusterNodes = Invoke-Command -ComputerName $Cl.PSComputerName -ScriptBlock {
                $VMList = Get-ClusterGroup -ErrorAction SilentlyContinue | where GroupType -eq "VirtualMachine"
                if (($VMList |measure).Count -ge 1) {
                        
                    $VMList | foreach {
                        $Retry = 0
                        $ResRemoveStatus = $False
                        do {
                            try {
                                $_ | Remove-ClusterGroup -Force -RemoveResources -ErrorAction Stop
                                $ResRemoveStatus = $True
                            } # End Try
                            Catch {}
                        } Until ($ResRemoveStatus -or ($Retry -ge 5))
                        if (!$ResRemoveStatus -or ($Retry -ge 5)) {$Error[0]}
                    } # End Foreach
                }
                Get-ClusterNode
            } # End Invoke-Comand
                
            if (($($ClusterNodes | Measure-Object).count - 1) -ge 1){
                for ($id=0; $id -lt ($($ClusterNodes | Measure-Object).count - 1); $id++ ){
                    "$($ClusterNodes[$id].name).$($Env:USERDNSDOMAIN)"
                    Invoke-Command -ComputerName "$($ClusterNodes[$id].name).$($Env:USERDNSDOMAIN)" -ScriptBlock { 
                        Remove-ClusterNode -Force 
                    }
                } # End For
                Invoke-Command -ComputerName "$($ClusterNodes[$id].name).$($Env:USERDNSDOMAIN)" -ScriptBlock { 
                    Remove-Cluster -Force -CleanupAD
                }
            } # End If
        } # End Foreach
    } # End ElseIf

    Ошибки получаю следующие

    #@ Комент автора: Ошибка при удалении ноды (их 2 всего без диска)
    
    An error occurred evicting node 'server'.
        Eviction of this node is invalid at this time. Due to quorum requirements node eviction will result in cluster shutdown.
    If it is the last node in the cluster, destroy cluster command should be used
        + CategoryInfo          : NotSpecified: (:) [Remove-ClusterNode], ClusterCmdletException
        + FullyQualifiedErrorId : Remove-ClusterNode,Microsoft.FailoverClusters.PowerShell.RemoveClusterNodeCommand
        + PSComputerName        : server.domain.local
    
    WARNING: If you are running Windows PowerShell remotely, note that some failover clustering cmdlets do not work remotely. When poss
    ible, run the cmdlet locally and specify a remote computer as the target. To run the cmdlet remotely, try using the Credential Secu
    rity Service Provider (CredSSP). All additional errors or warnings from this cmdlet might be caused by running it remotely.
    
    #@ Комент автора: Ошибка при удалении кластера
    You do not have administrative privileges on the cluster. Contact your network administrator to request access.
        Access is denied
        + CategoryInfo          : AuthenticationError: (:) [Remove-Cluster], ClusterCmdletException
        + FullyQualifiedErrorId : ClusterAccessDenied,Microsoft.FailoverClusters.PowerShell.RemoveClusterCommand
        + PSComputerName        : server2.domain.local
    Ворнинги вылазят и на многие другие команды, но по факту все работает, а эти командлеты увы


    The opinion expressed by me is not an official position of Microsoft


    29 августа 2016 г. 17:44
    Модератор
  • https://blogs.technet.microsoft.com/ashleymcglone/2016/08/30/powershell-remoting-kerberos-double-hop-solved-securely/

    Настройте, как в статье - PrincipalsAllowedToDelegateToAccount для узлов кластера.

    1 сентября 2016 г. 13:07
    Отвечающий
  • https://blogs.technet.microsoft.com/ashleymcglone/2016/08/30/powershell-remoting-kerberos-double-hop-solved-securely/

    Настройте, как в статье - PrincipalsAllowedToDelegateToAccount для узлов кластера.

    От различных дабл хопов я ушел используя credssp, но ноды удалить проблемно, так как нарушается кворумная модель и кластер выключается в случае форса после чего с ним сделать уже ничего нельзя

    Если форсить ремув кластер происходит нечто подобное

    Итог печален и без напильника не обходилось

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

    Ps. Спасибо за линк статья интересная


    The opinion expressed by me is not an official position of Microsoft


    2 сентября 2016 г. 5:56
    Модератор