2012-05-03 4 views
4

Я пытаюсь написать программу powershell, которая проверяет, существует ли кластер. Если он этого не делает, он создает его и добавляет к нему. Если другой компьютер просыпается, он проверяет, существует ли кластер, и если да, то он добавляет себя в кластер.Присоединение к существующему кластеру NLB

У меня возникли проблемы с попыткой получить ссылку на объект кластера из IP-адреса кластера. Каждый узел знает свой адрес и адрес кластера. Я хочу, чтобы каждый узел имел список всех остальных узлов в своем кластере.

Я обнаружил, что мне нужно увидеть некластерный IP-адрес, чтобы get-nlbcluster работал. Указание IP-адреса кластера просто ошибок.

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

ответ

1

Следующий сценарий может быть запущен на все узлы в кластере, если кластер не существует, то создайте его, в противном случае просто добавьте текущий компьютер к существующему кластеру. Все, что вам нужно сделать, это убедиться, что все ваши компьютеры в кластере имеют выделенную карту с тем же именем. В приведенном ниже примере сетевая карта называется «NLB».

Import-Module ServerManager 

# Interface cards should be named the same and have a fixed IP 
$interfaceName = "NLB" 
$clusterName = "NLB-Cluster" 
$clusterIpAddress = "1.2.3.0" 
$clusterSubnet = "255.0.0.0" 

# Install Network Load Balancing and Tools 
Write-Host "Install Network Load Balancing and Tools" 
Add-WindowsFeature NLB, RSAT-NLB 
Import-Module NetworkLoadBalancingClusters 

# If the cluster hasn't been created yet then create it 
if (!(Get-NlbCluster -HostName $clusterIpAddress -ErrorAction SilentlyContinue)) 
{ 
    Write-Host "Creating NLB Cluster: $clusterName" -ForegroundColor yellow 

    # Create Cluster (default unicast) 
    New-NlbCluster -InterfaceName $interfaceName -ClusterName $clusterName -ClusterPrimaryIP $clusterIpAddress -SubnetMask $clusterSubnet 

    # Remove defaults 
    Write-Host "Removing default port rules" -ForegroundColor yellow 
    Get-NlbClusterPortRule | Remove-NlbClusterPortRule -Force 

    # Create port rules 
    Get-NlbCluster | Add-NlbClusterPortRule -StartPort 80 -EndPort 80 -Protocol TCP -Affinity None | Out-Null 
    Get-NlbCluster | Add-NlbClusterPortRule -StartPort 443 -EndPort 443 -Protocol TCP -Affinity None | Out-Null 
} 
else 
{ 
    Get-NlbCluster 
} 

# if this node isn't already a member of a cluster then add it 
if(!(Get-NlbClusterNode -HostName $env:COMPUTERNAME)) 
{ 
    # Add node to cluster 
    Write-Host "Adding node to cluster: $clusterName" -ForegroundColor yellow 
    Get-NlbCluster -HostName $clusterIpAddress | Add-NlbClusterNode -NewNodeName $env:COMPUTERNAME -NewNodeInterface $interfaceName 
} 
else 
{ 
    Get-NlbClusterNode 
} 
2

Помогает ли это? Я сделал это некоторое время назад, но никогда не получил шанс полностью протестировать его:

#Add a new node to NLB cluster 
#Tested with Windows Server 2008 R2 only 
#Requires WSManCredSSP Server Role Enabled on cluster Host 
Function join-NlbCluster { 
    Param(
     [Parameter(Mandatory=$true)] 
     $clusterHostname, 
     [Parameter(Mandatory=$true)] 
     $newNodename, 
     [Parameter(Mandatory=$true)] 
     $newNodeinterfaceName, 
     [Parameter(Mandatory=$true)] 
     $userName, 
     [Parameter(Mandatory=$true)] 
     $password 
     ) 
    Write-Verbose "Verifiying if the remote node has NLB installed" 
    If (!((Get-OSFeature -computerName $newNodename -featureName NLB).Installed)) { 
     Write-Error "NLB feature is not installed on $newNodename. Cannot continue." 
     return $false 
    } 
    $cmdBlock = "Import-Module networkLoadBalancingClusters 
    `$nlbCluster = Get-nlbCluster -HostName $clusterHostName 
    if (`$nlbCluster) { 
     `$newNode = Add-NlbClusterNode -InputObject `$nlbCluster -NewNodeName $newNodename -NewNodeInterface `"$newNodeinterfaceName`" 
     if (`$newNode) { 
      Write-Host `"New node is added to cluster`" 
      return `$newNode 
     } else { 
      Write-Host `"Error Creating the NLB Cluster`" 
      return `$false 
     } 
    } else { 
     Write-Host `"No NLB cluster found on $clusterHostname`" 
     return `$false 
    }" 

    Write-Verbose $cmdBlock 
    $scriptBlock = $ExecutionContext.InvokeCommand.NewScriptBlock($cmdBlock) 
    try { 
     Write-Verbose "Creating new NLB Cluster" 
     Invoke-Command -ComputerName $clusterHostName -ScriptBlock $scriptBlock -HideComputerName -Authentication Credssp -Credential (Get-PSCredential -userName $userName -Password $password) 
    } 
    catch { 
     Write-Verbose $_ 
     return $false 
    } 
} 
+0

Хммм, хорошая попытка! Вы отложили знание о других машинах вызывающему методу. Родительский вызывающий абонент все еще должен знать обо всех машинах, с которыми нужно поговорить, поэтому нам все еще нужно (и нужно поддерживать) список всех остальных узлов в кластере. –

Смежные вопросы