2017-11-09 33 views
14

में एक वेब फार्म बनाना मैं पावरशेल में एक सर्वर फार्म के निर्माण को स्वचालित करने की कोशिश कर रहा हूं।पावरशेल

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

के माध्यम से पी एस यह करने के लिए कोशिश कर रहा है परेशानी हालांकि साबित होता है: जहाँ तक मैं बता सकता हूँ वहाँ के माध्यम से (WebFarmSnapin यह करने के लिए कोई समर्पित एपीआई है एक पुराने के लिए है मैनुअल रचना के माध्यम से मैं निम्नलिखित एक्सएमएल मिल गया है संस्करण)।

मैंने अपना ध्यान IIS Administration Cmdlets पर स्थानांतरित कर दिया है, लेकिन केवल इसे आधा काम मिल गया है।

कोड रहा है:

##### 
# 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 

यह

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

उत्पन्न करता है आप इसे मार्ग से संबंधित बंदरगाह कमी है देख सकते हैं। और मैंने इस बिंदु पर हेल्थ चेक जोड़ने की कोशिश भी शुरू नहीं की है।

मैं क्या गलत कर रहा हूं? क्या कोई सीएमडीलेट है जो मुझे नहीं मिला है जिससे यह आसान हो जाता है?

Related लेकिन बिना किसी उपयोगी उत्तर के (जेनरेट कोड के साथ पावरशेल टैब खाली रहता है)।

+0

आप कोशिश कर सकते हैं कि आईआईएस प्रदाता क्या कर सकता है जो आप चाहते हैं https://technet.microsoft.com/en-us/library/ee909471(v=ws.10).aspx यह तर्कसंगत रूप से थोड़ा और अधिक है IIS cmdlets का उपयोग करने से अधिक, लेकिन कभी-कभी ऐसा होता है। – mtnielsen

+0

क्या आपने पोर्ट को कॉन्फ़िगर करने के लिए इस cmdlet को देखा है? 'सेट-वेब बाइंडिंग -नाम' डिफ़ॉल्ट वेब साइट '-बाइंडिंग सूचना "*: 80:" -प्रॉपर्टीनाम "पोर्ट" -वैल्यू "1234" मैं वेबफैम के साथ पर्याप्त परिचित नहीं हूं यह जानने के लिए कि इससे आपकी मदद मिलेगी या नहीं। – FoxDeploy

+0

यदि आपके पास पहले से नहीं है, तो मैं वेबफॉर्म के निर्माण/कॉन्फ़िगरेशन/वांछित स्थिति को स्वचालित करने के लिए [xWebAdministration DSC संसाधन] (https://github.com/PowerShell/xWebAdministration) को देखने का सुझाव दूंगा। WebAdministration मॉड्यूल वांछित होने के लिए बहुत कुछ छोड़ देता है (इस साल की शुरुआत में कुछ आईआईएस सेटअप स्वचालित करने के बाद अनुभव से बात कर रहा है) – TheIncorrigible1

उत्तर

3

ऐसा लगता है कि आप पता लगा कि कैसे XML कॉन्फ़िगरेशन फ़ाइल ही संशोधित करके यह करने के लिए। यह महसूस करने के बावजूद कि यह "सही तरीके" जैसा प्रतीत नहीं होता है, कॉन्फ़िगरेशन फ़ाइल को सीधे बदलना एक बिल्कुल वैध समाधान है। संक्षेप में, आपने टेम्पलेट बनाया है, और कॉन्फ़िगरेशन टेम्पलेट्स बनाए रखने योग्य और दोहराने योग्य कॉन्फ़िगरेशन के उत्पादन के लिए एक तेज़ और पठनीय दृष्टिकोण प्रदान करते हैं।

हम स्क्रिप्ट से टेम्पलेट टेक्स्ट को एक अलग पाठ फ़ाइल में निकालने के द्वारा इस दृष्टिकोण पर सुधार कर सकते हैं। फिर, स्क्रिप्ट टेम्पलेट को पढ़ सकते हैं (या स्रोत) और आवश्यकता के अनुसार किसी भी प्लेसहोल्डर मूल्यों को स्वैप कर सकते हैं। यह कोड के हमारे HTML टेम्पलेट्स को डीकॉप्लिंग करके वेब अनुप्रयोग में चिंताओं को अलग करने के समान है।

अधिक सीधे सवाल का जवाब देने के लिए, आइए देखें कि PowerShell और IIS व्यवस्थापन API का उपयोग करके इसे कैसे करें (आप सही हैं — वेब फार्म फ्रेमवर्क अब आईआईएस और विंडोज़ के हाल के संस्करणों के लिए समर्थित नहीं है)। प्रश्न में मूल कोड एक अच्छी शुरुआत है। हमें केवल कॉन्फ़िगरेशन संग्रह (*-WebConfiguration cmdlets का उपयोग करके) और कॉन्फ़िगरेशन आइटम (*-WebConfigurationProperty cmdlets का उपयोग करके) में अंतरण करने की आवश्यकता है। यहाँ एक स्क्रिप्ट है कि प्रश्न में उदाहरण के आधार पर कॉन्फ़िगरेशन मान सेट करता रहेगा:

$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' } 

यह थोड़ा अधिक आवश्यकता से वर्बोज़ हो सकता है, लेकिन मैं स्पष्ट रूप से प्रत्येक चरण में इरादा उदाहरण देकर स्पष्ट करना चाहता था।यह कार्यान्वयन उपयुक्त XML नोड्स का चयन करने के लिए -Filter तर्कों के लिए XPath क्वेरी का उपयोग करता है। हम दोहराए गए कार्यों को कम करने के लिए स्क्रिप्ट को दोबारा प्रतिक्रिया दे सकते हैं, जैसे Add-FarmServer फ़ंक्शन को परिभाषित करके जो सर्वर का नाम और पोर्ट लेता है और फिर उपयुक्त निर्देश जोड़ता है। अगर हमें लॉक कॉन्फ़िगरेशन समस्याएं आती हैं तो हमें Remove-WebConfigurationLock की भी आवश्यकता हो सकती है।

चाहे हम टेम्पलेट या प्रोग्रामेटिक दृष्टिकोण का उपयोग करना चुनते हैं, परियोजना और टीम वरीयता पर निर्भर करता है। एपीआई अधिक आकर्षक हो जाता है जब हमारे पास कॉन्फ़िगर करने के लिए कई समान आइटम होते हैं, जैसे कि हमारे पास वेब फार्म में जोड़ने के लिए सैकड़ों सर्वर हैं। दूसरी तरफ, टेम्पलेट्स समझने में आसान हैं कि अन्य टीम के सदस्यों को एक नया (और शायद कुछ उलझन में) एपीआई सीखना आवश्यक नहीं है।

+1

अंतर्दृष्टिपूर्ण उत्तर के लिए धन्यवाद! मुझे अपने दृष्टिकोण को काफी पसंद नहीं आया क्योंकि यह सिर्फ एक्सएमएल का ब्लॉब जोड़ रहा है, इसलिए मुझे आपकी पसंद है क्योंकि कम से कम एक्सएमएल एपीआई इसका उपयोग करने के लिए इसका उपयोग करता है। –

1

यह देखकर कि कोई भी समाधान के साथ नहीं आया है: मैंने एपीआई के माध्यम से सीधे एक्सएमएल को संपादित करने का सरल काम किया है।

वास्तविक वेबफर्म कार्यक्षमता मुझे अभी तक काम नहीं करना है, लेकिन ऐसा लगता है कि सभी हिस्सों में कम से कम हैं।

एक्सएमएल से छेड़छाड़ हो सकता है का एक उदाहरण:

$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

आपने इस 'xml' को सीधे पावर खोल स्क्रिप्ट के साथ क्यों नहीं बनाया? –

1

मैं इस पर काम कर रहा हूं और मुझे पता चला है कि आप इसे पूरा करने के लिए पावरहेल में Microsoft.Web.Administration का उपयोग कर सकते हैं। एक बार जब आप फोन $iisManager.CommitChanges() तो वस्तु केवल-पठन मोड में चला जाता है

  1. :

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

    वहाँ दो चीजें हैं जो उल्लेख करने के लिए महत्वपूर्ण हैं। कोई नया बदलाव करने से पहले आपको सभी वस्तुओं को फिर से चालू करने की आवश्यकता है।

  2. यदि आप अपने वेब फार्म में कोई नया सर्वर बनाने का निर्णय लेते हैं, तो आप एक समस्या में भाग लेंगे यदि आप सर्वर को एक नाम असाइन करते हैं और फिर इसकी पोर्ट सेटिंग्स तक पहुंचने का प्रयास करते हैं। आपको पहले पोर्ट को असाइन करना है और फिर नाम असाइन करना है और यह सक्षम/अक्षम है या नहीं। अन्यथा, यह System.AccessViolationException: Attempted to read or write protected memory. त्रुटि फेंक देगा।

मुझे बताएं कि यह कैसे जाता है!