2017-11-09 51 views
14

Tôi đang cố gắng tự động hóa việc tạo trang trại máy chủ trong PowerShell. Qua sự sáng tạo của nhãn hiệu Tôi đã có XML sau đây:Tạo trang trại trên PowerShell

<webFarms> 
    <webFarm name="alwaysup" enabled="true"> 
     <server address="alwaysup-blue" enabled="true"> 
      <applicationRequestRouting httpPort="8001" /> 
     </server> 
     <server address="alwaysup-green" enabled="true"> 
      <applicationRequestRouting httpPort="8002" /> 
     </server> 
     <applicationRequestRouting> 
      <healthCheck url="http://alwaysup/up.html" interval="00:00:05" responseMatch="up" /> 
     </applicationRequestRouting> 
    </webFarm> 
    <applicationRequestRouting> 
     <hostAffinityProviderList> 
      <add name="Microsoft.Web.Arr.HostNameRoundRobin" /> 
     </hostAffinityProviderList> 
    </applicationRequestRouting> 
</webFarms> 

Đang cố gắng để thực hiện điều này thông qua PS chứng minh phiền hà tuy nhiên: như xa như tôi có thể nói không có API chuyên dụng để làm điều này thông qua (WebFarmSnapin có nghĩa là cho một cũ phiên bản).

Tôi đã chuyển sự chú ý của mình sang IIS Administration Cmdlets nhưng chỉ nhận được một nửa hoạt động.

Mã mà tôi có:

##### 
# Overwriting the server farm 
##### 

Write-Host "Overwriting the server farm $($webFarmName)" 

$webFarm = @{}; 
$webFarm["name"] = 'siteFarm' 

Set-WebConfiguration "/webFarms" -Value $webFarm 

##### 
# Adding the servers 
##### 

Write-Host "Adding the servers" 

$blueServer = @{} 
$blueServer["address"] = 'site-blue' 
$blueServer["applicationRequestRouting"] = @{} 

$greenServer = @{} 
$greenServer["address"] = 'site-green' 
$greenServer["applicationRequestRouting"] = @{} 

$servers = @($blueServer, $greenServer) 

Add-WebConfiguration -Filter "/webFarms/webFarm[@name='siteFarm']" -Value $servers 

##### 
# Adding routing 
##### 

Write-Host "Adding the routing configurations" 

$blueServerRouting = @{} 
$blueServerRouting["httpPort"] = "8001" 
Add-WebConfiguration -Filter "/webFarms/webFarm[@name='siteFarm']/server[@address='site-blue']" -Value $blueServerRouting 

này tạo

<webFarms> 
    <webFarm name="siteFarm"> 
     <server address="site-blue" /> 
     <server address="site-green" /> 
    </webFarm> 
    <applicationRequestRouting> 
     <hostAffinityProviderList> 
      <add name="Microsoft.Web.Arr.HostNameRoundRobin" /> 
     </hostAffinityProviderList> 
    </applicationRequestRouting> 
</webFarms> 

Như bạn có thể nhìn thấy nó thiếu các cổng liên quan đến việc định tuyến. Và tôi thậm chí không bắt đầu với việc cố gắng thêm healthcheck vào thời điểm này.

Tôi đang làm gì sai? Có một số Cmdlet mà tôi đã không tìm thấy mà làm cho điều này dễ dàng hơn?

Related nhưng không có nhiều câu trả lời hữu ích (tab PowerShell có mã được tạo vẫn trống).

+0

Bạn có thể thử và xem liệu nhà cung cấp IIS có thể thực hiện những gì bạn muốn https://technet.microsoft.com/en-us/library/ee909471(v=ws.10).aspx Có thể cho là có nhiều hơn một chút -gritty hơn bằng cách sử dụng các lệnh ghép ngắn IIS, nhưng đôi khi đó là những gì nó cần. – mtnielsen

+0

Bạn đã xem lệnh ghép ngắn này để cấu hình cổng chưa? 'Set-WebBinding -Name 'Default Web Site' -BindingInformation '*: 80:" -PropertyName "Port" -Value "1234" 'Tôi không quen thuộc lắm với webfarms để biết liệu điều này có giúp ích cho bạn hay không. – FoxDeploy

+0

Nếu bạn chưa có, tôi khuyên bạn nên xem xét [tài nguyên xWebAdministration DSC] (https://github.com/PowerShell/xWebAdministration) để tự động hóa trạng thái tạo/cấu hình/mong muốn của webfarm. Các mô-đun WebAdministration lá rất nhiều để được mong muốn (nói từ kinh nghiệm sau khi tự động hóa một số thiết lập IIS đầu năm nay) – TheIncorrigible1

Trả lời

3

Dường như bạn đã tìm ra cách để làm điều này bằng cách sửa đổi các tập tin cấu hình XML riêng của mình. Mặc dù cảm giác rằng điều này không hoàn toàn có vẻ giống như "đúng cách", việc thay đổi tập tin cấu hình trực tiếp là một giải pháp hoàn toàn hợp lệ. Về bản chất, bạn đã tạo mẫu và mẫu cấu hình cung cấp phương pháp tiếp cận nhanh chóng và dễ đọc để tạo cấu hình có thể lặp lại và có thể lặp lại.

Chúng tôi có thể cải thiện theo cách tiếp cận này bằng cách trích xuất văn bản mẫu từ tập lệnh vào một tệp văn bản riêng biệt. Sau đó, các tập lệnh có thể đọc (hoặc nguồn) mẫu và trao đổi bất kỳ giá trị trình giữ chỗ nào khi cần. Điều này tương tự như cách chúng tôi tách biệt các mối quan tâm trong một ứng dụng web bằng cách tách các mẫu HTML khỏi mã.

Để trực tiếp trả lời câu hỏi, chúng ta hãy xem cách thực hiện điều này bằng PowerShell và API quản trị IIS (chính xác là — Web Farm Framework không còn được hỗ trợ cho các phiên bản gần đây nếu IIS và Windows). Mã ban đầu trong câu hỏi là một khởi đầu tốt. Chúng tôi chỉ cần phân biệt giữa thao tác cấu hình bộ sưu tập (sử dụng *-WebConfiguration cmdlets) và cấu hình các mục (sử dụng *-WebConfigurationProperty lệnh ghép ngắn). Dưới đây là một kịch bản mà sẽ thiết lập các giá trị cấu hình dựa trên ví dụ trong câu hỏi:

$farmName = 'siteFarm' 

Add-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' ` 
    -Filter 'webFarms' ` 
    -Name '.' ` 
    -Value @{ name = $farmName; enabled = $true } 

Add-WebConfiguration -PSPath 'MACHINE/WEBROOT/APPHOST' ` 
    -Filter "webFarms/webFarm[@name='$farmName']" ` 
    -Value @(
     @{ address = 'site-blue'; enabled = $true }, 
     @{ address = 'site-green'; enabled = $true } 
    ) 

Set-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' ` 
    -Filter "webFarms/webFarm[@name='$farmName']/server[@address='site-blue']" ` 
    -Name 'applicationRequestRouting' ` 
    -Value @{ httpPort = 8001 } 

Set-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' ` 
    -Filter "webFarms/webFarm[@name='$farmName']/server[@address='site-green']" ` 
    -Name 'applicationRequestRouting' ` 
    -Value @{ httpPort = 8002 } 

Set-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' ` 
    -Filter "webFarms/webFarm[@name='$farmName']/applicationRequestRouting" ` 
    -Name 'healthCheck' ` 
    -Value @{ 
     url = 'http://mySite/up.html' 
     interval = '00:00:05' 
     responseMatch = 'up' 
    } 

Set-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' ` 
    -Filter "webFarms/webFarm[@name='$farmName']/applicationRequestRouting" ` 
    -Name 'protocol' ` 
    -Value @{ reverseRewriteHostInResponseHeaders = $true } 

Set-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' ` 
    -Filter "webFarms/webFarm[@name='$farmName']/applicationRequestRouting/protocol" ` 
    -Name 'cache' ` 
    -Value @{ enabled = $false; queryStringHandling = 'NoCaching' } 

Điều này có thể tiết hơn một chút hơn mức cần thiết, nhưng tôi muốn để minh họa rõ ràng mục đích trong mỗi bước.Triển khai này sử dụng các truy vấn XPath cho các đối số -Filter để chọn các nút XML thích hợp. Chúng tôi có thể, có thể, tái cấu trúc kịch bản để giảm các tác vụ lặp lại, chẳng hạn như bằng cách xác định hàm Add-FarmServer lấy tên máy chủ và cổng rồi thêm các chỉ thị thích hợp. Chúng tôi cũng có thể cần Remove-WebConfigurationLock nếu chúng tôi gặp sự cố về cấu hình bị khóa.

Cho dù chúng tôi chọn sử dụng mẫu hoặc phương pháp lập trình phụ thuộc vào tùy chọn dự án và nhóm. API trở nên hấp dẫn hơn nhiều khi chúng tôi có nhiều mục tương tự để định cấu hình, chẳng hạn như nếu chúng tôi có hàng trăm máy chủ để thêm vào trang trại. Mặt khác, các mẫu đơn giản để hiểu không yêu cầu các thành viên khác trong nhóm học một API mới (và có thể hơi khó hiểu).

+1

Cảm ơn bạn đã trả lời sâu sắc! Tôi không hoàn toàn thích cách tiếp cận của tôi vì nó chỉ bổ sung thêm một phần nhỏ của XML nên tôi thích của bạn vì nó ít nhất sử dụng các API XML để thao tác nó. –

1

Thấy không ai tìm ra giải pháp: Tôi đã thực hiện giải pháp đơn giản chỉ cần chỉnh sửa XML trực tiếp thay vì xem qua API.

Chức năng webfarm thực sự mà tôi chưa phải làm việc nhưng dường như tất cả các bộ phận đều có ít nhất.

Một ví dụ về thao tác XML có thể là thế này:

$configPath = "C:\Windows\System32\inetsrv\config\applicationHost.config" 
$configXml = [xml] (type $configPath) 

[xml] $webFarmXml = @" 
<webFarms> 
    <webFarm name="siteFarm" enabled="true"> 
     <server address="site-blue" enabled="true"> 
      <applicationRequestRouting httpPort="$bluePort" /> 
     </server> 
     <server address="site-green" enabled="true"> 
      <applicationRequestRouting httpPort="$greenPort" /> 
     </server> 
     <applicationRequestRouting> 
      <healthCheck url="http://mySite/up.html" interval="00:00:05" responseMatch="up" /> 
      <protocol reverseRewriteHostInResponseHeaders="true"> 
       <cache enabled="false" queryStringHandling="NoCaching" /> 
      </protocol> 
     </applicationRequestRouting> 
    </webFarm> 
    <applicationRequestRouting> 
     <hostAffinityProviderList> 
      <add name="Microsoft.Web.Arr.HostNameRoundRobin" /> 
     </hostAffinityProviderList> 
    </applicationRequestRouting> 
</webFarms> 
"@ 

$configXml.configuration.AppendChild($configXml.ImportNode($webFarmXml.webFarms, $true)) 
$configXml.Save($configPath) 
+0

tại sao bạn không tạo 'xml' này trực tiếp với kịch bản lệnh shell? –

1

Tôi đã làm việc về điều này và tôi phát hiện ra rằng bạn có thể sử dụng Microsoft.Web.Administration trong Powershell để thực hiện việc này.

Add-Type -AssemblyName "Microsoft.Web.Administration, Version=7.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" 

$iisManager = New-Object Microsoft.Web.Administration.ServerManager 
$applicationHostConfig = $IISManager.GetApplicationHostConfiguration() 

# Get the WebFarms section. Section names are case-sensitive. 
$webFarmSection = $ApplicationHostConfig.GetSection("webFarms") 
$webFarms = $WebFarmSection.GetCollection() 

# Create a new webfarm and assign a name. 
$webFarm = $WebFarms.CreateElement("webFarm") 
$webFarm.SetAttributeValue("name", "MyNewWebFarmName") 
# Add it to the parent element 
$webFarms.Add($webFarm) 
# Save changes 
$iisManager.CommitChanges() 

Có hai điều quan trọng đối với đề cập đến:

  1. Khi bạn gọi $iisManager.CommitChanges() sau đó các đối tượng chuyển sang chế độ read-only. Bạn cần phải khởi tạo lại tất cả các đối tượng trước khi thực hiện bất kỳ thay đổi mới nào.

  2. Nếu bạn quyết định tạo máy chủ mới trong trang trại của mình, bạn sẽ gặp sự cố nếu gán tên máy chủ và sau đó thử truy cập cài đặt cổng của máy chủ. Những gì bạn cần làm là gán cổng đầu tiên và sau đó gán tên và cho dù nó được kích hoạt/vô hiệu hóa. Nếu không, nó sẽ ném một lỗi System.AccessViolationException: Attempted to read or write protected memory..

Hãy cho tôi biết cách hoạt động!

Các vấn đề liên quan