Развертывание SharePoint 2010: Шаг 2 – Сервисные приложения
Продолжаем конфигурировать SharePoint 2010, если вспомнить, то в предыдущей статье мы запустили сервисы, но не стали создавать сервисные приложения. Напомню, что большинству сервисов для работы необходимо наличие сервисного приложения, при создании которого вы получаете Application Pool в рамках которого работает сервисное приложение, в некоторых сервисах так же создаются базы данных SQL, хранящие данные сервиса. Если воспользоваться классической настройкой, то в Центре администрирования нужно проследовать по пути: CA -> Manage Service Application -> New. И далее выбрать интересующее сервисное приложение и ввести необходимые данные. (Рисунок 1)
Рисунок 1. Создание сервисного приложения в центре администрирования.
Данные указываемые при создании сервисного приложения следующие:
1. Имя – ну имя и имя, ни на что кроме отображения не влияет
2. Пул. Использование существующего или создание нового пула приложений (Application Pool). Возможно два подхода, первый – создание каждого сервисного приложения в отдельном пуле, при данном способе вы получаете изоляцию процессов, возможность перезапускать каждый процесс независимо, задавать различные учетные записи для каждого процесса. Но при этом платитесь производительностью. Есть рекомендация говорящая о том, что на одном SharePoint сервере не должно выполняться больше десяти пулов приложений. А если учесть, что у нас впереди создание портала, который так же можно вынести в отдельный пул, то делаем вывод о том, что пулами раскидываться не стоит. Поэтому переходим ко второму варианту, который МС рекомендует для маленьких ферм, а именно использование единственного пула для всех сервисных приложений. Для этого в Active Directory нужно создать учетную запись, от имени которой будет работать пул приложений. У меня данная учетная запись имеет имя ServicePool.
3. Прокси группа. Необходимость добавления в прокси группу (ProxyGroup). Опять же напоминаю, что для использования сервисного приложения вместе с ним необходимо создать прокси сервисного приложения (Service application proxy), такая точка подключения к нашему сервису. Впоследствии эти прокси мы объединим в группу и закрепим за веб-приложением нашего портала. У нас уже есть одна прокси группа Default, которая применяется к новым веб-приложениям, вот ее мы и задействуем.
4.Базы данных. Некоторые сервисные приложения, создают базы данных SQL, делают это те приложения, которым нужно хранить какие либо данные. (например: User Profile Synchronization Service, Managed Metadata Web Service). Поскольку SQL сервер в данной конфигурации один, то на нем расположены и базы данных сервисных приложений.
Но идти классическим путем и по порядку в админке создавать сервисные приложения достаточно долго, я предлагаю слегка все ускорить и автоматизировать, используя скрипт написанный на PowerShell с использованием коммандлетов SharePoint 2010.
##----------------------------------------------------------------
Шаг 1. Объявляем переменные, которые будут содержать имена наших сервисных приложений. Единственное, что вам нужно здесь поменять, это переменную $databaseServerName , т.к она содержит имя сервера баз данных. Вы естественно "alfa.itband.ru" замените на имя собственного сервера баз данных.
##----------------------------------------------------------------
$apppoolname = "ServicePool"
$accesssSAName = "Access Services"
$bcsSAName = "Business Data Connectivity Service"
$excelSAName = "Excel Services Application"
$metadataSAName = "Managed Metadata Web Service"
$performancePointSAName = "PerformancePoint Service"
$searchSAName = "SharePoint Server Search"
$stateSAName = "State Service"
$secureStoreSAName = "Secure Store Service"
$usageSAName = "Usage and Health Data Collection Service"
$userProfileSAName = "User Profile Synchronization Service"
$visioSAName = "Visio Graphics Service"
$WebAnalyticsSAName = "Web Analytics Service"
$WordAutomationSAName = "Word Automation Services"
$databaseServerName = "alfa.itband.ru"
##----------------------------------------------------------------
Шаг 2. Регистрируем в рамках текущей сессии PowerShell набор коммандлетов SharePoint 2010. Нужно для того, что скрипт выполнялся не только в SharePoint 2010 Management Shell.
##----------------------------------------------------------------
Add-PSSnapin Microsoft.SharePoint.PowerShell
##----------------------------------------------------------------
Шаг 3. Запрашиваем у запустившего скрипт учетные данные и на основе их создаем управляемую учетную запись. Далее создаем пул приложений, который будет стартовать от имени этой управляемой учетки. (ManagedAccount) Формат ввода учетных данных должен быть типа “itband\ServicePool”
##----------------------------------------------------------------
$cred = Get-Credential
New-SPManagedAccount -Credential $cred >$null
$serviceAcc = Get-SPManagedAccount | where {$_.username -like $cred.UserName}
$UserName = ($serviceAcc).UserName
New-SPServiceApplicationPool -Name $apppoolname -Account $UserName >$null
##----------------------------------------------------------------
Шаг 4. Собственно само действие – создание сервисных приложений и прокси с закреплением их прокси группе по-умолчанию. Так же в скрипт включена проверка запущены ли необходимые сервисы и если какой то сервис не запущен, производится его старт.
##----------------------------------------------------------------
Write-Host "Visio Graphics Service and Proxy..."
New-SPVisioServiceApplication -Name $visioSAName -ApplicationPool $apppoolname -AddToDefaultGroup >$null
Get-SPServiceInstance | where-object {$_.TypeName -eq "Visio Graphics Service"} | Start-SPServiceInstance > $null
Write-Host "Excel Services Application and Proxy..."
New-SPExcelServiceApplication -Name $excelSAName -ApplicationPool $apppoolname -Default >$null
Get-SPServiceInstance | where-object {$_.TypeName -eq "Excel Calculation Services"} | Start-SPServiceInstance > $null
Write-Host "Creating Usage Service and Proxy..."
$serviceInstance = Get-SPUsageService
New-SPUsageApplication -Name $usageSAName -DatabaseServer $databaseServerName -DatabaseName "UsageDB" -UsageService $serviceInstance > $null
Write-Host "Creating Access Services and Proxy..."
New-SPAccessServiceApplication -Name $accesssSAName -ApplicationPool $apppoolname –Default > $null
Get-SPServiceInstance | where-object {$_.TypeName -eq "Access Database Service"} | Start-SPServiceInstance > $null
Write-Host "Creating BCS Service and Proxy..."
New-SPBusinessDataCatalogServiceApplication -Name $bcsSAName -ApplicationPool $apppoolname -DatabaseServer $databaseServerName -DatabaseName "BusinessDataCatalogDB" > $null
Get-SPServiceInstance | where-object {$_.TypeName -eq "Business Data Connectivity Service"} | Start-SPServiceInstance > $null
Write-Host "Creating State Service and Proxy..."
New-SPStateServiceDatabase -Name "StateServiceDB" -DatabaseServer $databaseServerName | New-SPStateServiceApplication -Name $stateSAName | New-SPStateServiceApplicationProxy -Name "$stateSAName Proxy" -DefaultProxyGroup > $null
Write-Host "Creating Word Conversion Service and Proxy..."
New-SPWordConversionServiceApplication -Name $WordAutomationSAName -ApplicationPool $apppoolname -DatabaseServer $databaseServerName -DatabaseName "WordAutomationDB" -Default > $null
Get-SPServiceInstance | where-object {$_.TypeName -eq "Word Automation Services"} | Start-SPServiceInstance > $null
Write-Host "Creating Metadata Service and Proxy..."
New-SPMetadataServiceApplication -Name $metadataSAName -ApplicationPool $apppoolname -DatabaseServer $databaseServerName -DatabaseName "MetadataDB" > $null
New-SPMetadataServiceApplicationProxy -Name "$metadataSAName Proxy" -DefaultProxyGroup -ServiceApplication $metadataSAName > $null
Get-SPServiceInstance | where-object {$_.TypeName -eq "Managed Metadata Web Service"} | Start-SPServiceInstance > $null
Write-Host "Creating Performance Point Service and Proxy..."
New-SPPerformancePointServiceApplication -Name $performancePointSAName -ApplicationPool $apppoolname > $null
New-SPPerformancePointServiceApplicationProxy -Default -Name "$performancePointSAName Proxy" -ServiceApplication $performancePointSAName > $null
Get-SPServiceInstance | where-object {$_.TypeName -eq "PerformancePoint Service"} | Start-SPServiceInstance > $null
Write-Host "Creating User Profile Service and Proxy..."
$userProfileService = New-SPProfileServiceApplication -Name $userProfileSAName -ApplicationPool $AppPoolName -ProfileDBServer $databaseServerName -ProfileDBName "ProfileDB" -SocialDBServer $databaseServerName -SocialDBName "SocialDB" -ProfileSyncDBServer $databaseServerName -ProfileSyncDBName "SyncDB"
New-SPProfileServiceApplicationProxy -Name "$userProfileSAName Proxy" -ServiceApplication $userProfileService -DefaultProxyGroup > $null
Get-SPServiceInstance | where-object {$_.TypeName -eq "User Profile Service"} | Start-SPServiceInstance > $null
Write-Host "Creating Web Analytics Service and Proxy..."
$stagerSubscription = "<StagingDatabases><StagingDatabase ServerName='$databaseServerName' DatabaseName='StagerDB'/></StagingDatabases>"
$reportingSubscription = "<ReportingDatabases><ReportingDatabase ServerName='$databaseServerName' DatabaseName='WarehouseDB'/></ReportingDatabases>"
New-SPWebAnalyticsServiceApplication -Name $WebAnalyticsSAName -ApplicationPool $AppPoolName -ReportingDataRetention 20 -SamplingRate 100 -ListOfReportingDatabases $reportingSubscription -ListOfStagingDatabases $stagerSubscription > $null
New-SPWebAnalyticsServiceApplicationProxy -Name "$WebAnalyticsSAName Proxy" -ServiceApplication $WebAnalyticsSAName > $null
Get-SPServiceInstance | where-object {$_.TypeName -eq "Web Analytics Web Service"} | Start-SPServiceInstance > $null
Get-SPServiceInstance | where-object {$_.TypeName -eq "Web Analytics Data Processing Service"} | Start-SPServiceInstance > $null
Write-Host "Creating Secure Store Service and Proxy..."
New-SPSecureStoreServiceapplication -Name $secureStoreSAName -Sharing:$false -DatabaseServer $databaseServerName -DatabaseName "SecureStoreServiceAppDB" -ApplicationPool $AppPoolName -auditingEnabled:$true -auditlogmaxsize 30 | New-SPSecureStoreServiceApplicationProxy -name "$secureStoreSAName Proxy" -DefaultProxygroup > $null
Get-SPServiceInstance | where-object {$_.TypeName -eq "Secure Store Service"} | Start-SPServiceInstance > $null
##----------------------------------------------------------------
Целиком скрипт можно скачать отсюда. Как можно заметить из скрипта, в нем не создается сервисное приложение поиска. Я не стал включать его, поскольку планирую посвятить поиску отдельную статью и создавать сервисное приложение, после разбора архитектуры.
Остается проверить работу скрипта, ну прежде всего в центре администрирования нужно выбрать “Manage Service Application”, вы должны увидеть список созданных сервисных приложений и их прокси. (Рисунок 2)
Рисунок 2. Просмотр списка сервисных приложений и их прокси.
Далее, необходимо убедиться, что прокси сервисных приложений попали в прокси группу Default, т.е закреплены за ней. Для этого идем по пути: CA –> Application Management –> Configure service application associations –> View –> Service Applications –> Application Proxy Group –> Default. И получаем на выходе следующую картинку. (Рисунок 3)
Рисунок 3. Просмотр прокси группы Default.
Но и это еще не все. В самом начале скрипта мы создавали ManagedAccount (New-SPManagedAccount ), в 2010 версии SharePoint слегка изменился подход к сервисным учётным записям, т.е тем от которых запущены сервисы. Теперь подход такой:
1) Вы создаете учетную запись в AD DS
2) Регистрируете ее как ManagedAccount в SharePoint
3) При создании пула приложений выбираете одну из ManagedAccount
Нужно это для того, чтобы снять с администратора бремя устаревания паролей и заставить SharePoint самостоятельно менять пароль как только доменная политика скажет об этом. Опять же после автоматического изменения пароля, администратору не придется заново прописывать его в десятках окон. Так вот в та учетная запись ServicePool, от которой работает пул сервисных приложений была переведена в ManagedAccount, но включить из PowerShell автоматическую смену пароля у меня не получилось. Поэтому идем по пути: CA –> Security –> Configure Managed Accounts –> Выбираем нашу учетку (ServicePool) –> Edit и устанавливаем автоматическую смену пароля “Enable Automatic Password Change. (Рисунок 4)
Рисунок 4 . Установка автоматической смены пароля для конкретной Managed Account.
Резюмируем. После всех манипуляций мы получили группу сервисных приложений (все кроме поиска), которые будут закрепляться за каждым порталом вашего SharePoint , при этом на текущий момент сервисные приложения не сконфигурированы и поэтому перед использованием конкретного сервиса, его необходимо настроить. Но в тоже время задел уже есть. Что предстоит сделать на следующем шаге. В следующей части я покажу как создать веб-приложение и развернуть на нем коллекцию сайтов. Собственно нужен тестовый портал на котором будет можно отработать действие каждого сервисного приложения из созданных в этой статье.
Продолжение следует ...
MCT/MVP Илья Рудь


Спасибо за цикл статей, для начинающих самое то!
Огромное спасибо, отличный материал. Пробовал развернуть в тестовой среде, все работает отлично.
Единственный момент, который считаю стоит упомянуть при планировании развертывания — это именование баз данных SQL. Если разворачивать SP10 в рабочую среду MSSQL он создаст множество нелицеприятных имен баз, содержащих GUID в имени. В листинге по созданию сервисных приложений все прекрасно с именами сервисных баз где заведомо указано имя базы -DatabaseName «DatabaseName». Но, например, при создании PerformancePointServiceApplication этот параметр пропущен и результате получаем имя базы вида PerformancePoint service_1503f249b0a8439faa6191625dc27f48. На работу не влияет, вот только если на вашем MSSQL сервере уже крутится несколько рабочих баз, этот момент может затруднить администрирование SQL и в целом портит вид логически выстроенной структуры баз.
Чтобы этого избежать прежде всего не стоит запускать ни одного визарда. «SharePoint configuration wizard» можно заменить скриптом PowerShell
New-SPConfigurationDatabase -DatabaseName «SP10_ConfigDB» -DatabaseServer «sqlserver.domain.local\instancename» -AdministrationContentDatabaseName «SP10_Admin_ContentDB» -Passphrase (ConvertTo-SecureString «Passw0rd» -AsPlaintext -Force) -FarmCredentials (Get-Credential)
иначе мастер создаст базу админки с именем SharePoint_AdminContent_5453eba1-a204-42f0-8519-188ad85ebc6e
Kerberos включается так New-SPCentralAdministration -Port 50000 -WindowsAuthProvider «Kerberos»
Особенно не стоит запускать визард по настройку фермы, его прекрасно заменяет скрипт предложенный Ильей.
Какие права должны быть у учетки, от имени которой запускается Пул приложений? (в Вашем примере itbrand.ru\ServicePool)
Во время работы возникает столько вопросов, что я даже не успеваю все запомнить. Порекомендуйте литературу/библиотеку, откуда я могу почерпнуть ответы на часто задаваемые вопросы.
А пока вопросы такие:
у меня сейчас 3 пула приложений: один созданный мной, два предопределенных.
Где я могу удалить лишние пулы? Где посмотреть их список? Где посмотреть какие приложения на данный момент, какой пул используют?
спасибо
1. Права необходимые для учетных записей брать отсюда archive.msdn.microsoft.co...x?ReleaseId=5245
2. Посмотреть пулы можно из IIS либо шэлом с коммандлетом: Get-SPServiceApplicationPool Что лишнее в вашем случае и есть ли лишнее, я не знаю.
Илья, наверное некорректно, что я превращаю комментарии в конференцию? может быть имеет смысл перейти на другую площадку?
у меня сейчас такая ошибка:
Следующие службы в настоящий момент запущены под учетными записями, входящими в группу «Администраторы» этого компьютера: SharePoint Central Administration v4 (Application Pool)
SPTimerV4 (Windows Service)
Типа, их надо поменять.
И при этом указана ссылка где я могу это сделать (vm4:25091/_admin/FarmCred...lManagement.aspx)
Проблема в том, что в том окне невозможно поменять учетку запускающего пул (SharePoint Central Administration v4) — это только в ИИС
и саму службу тоже невозможно выбрать — только в стандартной виндовой консоли.
Это нормально или нет?
1.Подскажите, пожалуйста, что это за сервис такой «Usage and Health Data Collection Service»? В предыдущих статьях о нем ничего нет и мастером его не создать
2. Есть ли случаи, при которых важен порядок создания приложений-служб?
Интересно, что после включения «Enable Automatic Password Change» (обычно) невозможно сменить пароль, нажав кнопочку на той же страничке. Причина простая — по умолчанию в Group Policy установлено минимальное время жизни пароля, 1 сутки.
при выполнении скрипта всплывает надпись красным на долю сикунды и резко закрываеться. после выполнения этого скрипта создаеться только Прокси приложения-службы обнаружения и балансировки нагрузки для приложений_9472c921-f213-488a-818b-3f4c568bdd93. Эт так и должно быть?
Костя, думаю имеет смысл выполнить из шэла интерактивно и посмотреть на что ругается.
Здравствуйте Илья, я запустил Ваш скрипт, забыв поменять имя сервера баз данных в нем. Как следствие сервисные службы создались но с ошибками — часть из них я не могу удалить. Есть ли возможность отката скрипта в PowerShell?
в предыдущей статье, в итоговом листе запущенных служб не числилась User Profile Synchronization Service.
В этой части вы ее уже наделяете эту незапущенную службу приложением
как-то не стыкуется
ага, прошу прощения, понял что эти службы наоборотные — сначала приложения, потом запуск
МС маздай однако...
Руками проще чем переписывать батник