Робимо FTP для Windows Azure Pack

Автор статті — Сергій Груздєв (egel@egel.su), провідний інженер, Dataline
Windows Azure Pack надає користувачам можливість використовувати власні ISO — і VHD(X)-файли, розташовані у виділеній тільки для передплатника бібліотеці. На даний момент єдиним способом закачування файлів в цю папку є організація FTP з кореневою папкою, що вказує на папку бібліотеки, виділеної передплатникам. У цій статті я покажу, як за допомогою ранбуков (runbook) Service Manager Automation (SMA) створювати і видаляти теки передплатників при закладі або видаленні користувача, і як з допомогою розширення Microsoft FTP власними провайдерами авторизації і домашніх каталогів авторизовывать користувачів безпосередньо через Azure Pack, виключаючи необхідність дублювати облікові записи Active Directory.

Підготовка Azure Pack
Попередньо необхідно додати активи SMA:
  1. VMMConnection – змінна типу «З'єднання», в якій вказується FQDN сервера VMM і облікові дані. Обліковий запис повинна входити в групу локальних адміністраторів на сервері бібліотеки, сервері VMM і в VMM входити в групу «Адміністратори»
  2. VMMLibPath – змінна з загальної папки кореневого каталогу бібліотеки передплатників


Ранбуки SMA
Обробка події створення передплатника
Підготуємо ранбук для створення каталогу передплатника і прив'язки його до облікового запису в VMM. Текст ранбука нижче. Як бонус – код, що сповіщає користувача після закладу його на админском порталі (або будь-яким іншим способом) про необхідність зміни пароля. Це позбавляє від потреби генерації паролів і пересиланням їх відкритим текстом користувачеві.
Notify-Created-User
workflow Notify-Created-User
{
param
(
[Parameter(Mandatory=$true)]
[object] $params
) 

$VmmConnection = Get-AutomationConnection -Name 'VmmConnection'
$VmmServerName = $VmmConnection.ComputerName

$SecurePassword = ConvertTo-SecureString -AsPlainText -String $VmmConnection.Password -Force
$VmmCredential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $VmmConnection.Username, $SecurePassword
$eMail = $params.Name.SubString(0, $params.Name.IndexOf("_"))

$vmmLib = Get-AutomationVariable -Name 'VMMLibPath'

$libServer = $vmmLib.SubString(2)
$libServer = $libServer.SubString(0, $libServer.IndexOf("\"))

$tenantPath = "{0}\{1}" -f $vmmLib, $eMail

Write-Output "Invoke create folder on $libServer"
inlinescript
{
try 
{ 
if (!(Test-Path $Using:tenantPath))
{
Write-Output "Creating folder $($Using:tenantPath)"
New-Item -Type Directory Path $Using:tenantPath -ErrorAction Stop | Out-Null 
}
else
{
Write-Output "Folder $($Using:tenantPath) already exist"
}
} 
catch
{ 
Write-Output $_ 
}
} –PSComputer $libServer –PSCredential $VmmCredential

inlinescript
{
$tenantSite = "https://my.azureline.ru" # тут необхідно вказати URL Tenant Site
$authSite = "https://auth.azureline.ru" # тут необхідно вказати URL Tenant Auth Site
$mail = $Using:eMail
$roles = Get-SCUserRole -VMMServer $Using:VmmServerName | ?{$_.Name.Contains($mail)}

# Для кожної підписки створюється UserRole в SCVMM. Щоб уникнути дублікатів листів, посилаємо оповіщення тільки якщо роль одна (при створенні першої передплати)

if (!($roles -is [System.Array]))
{
try
{
[reflection.assembly]::loadwithpartialname("System.Net.Http") | Out-Null
$forget = New Object System.Net.Http.HttpClient

$getMess = $forget.GetAsync($tenantSite).Result
$getMess.EnsureSuccessStatusCode() | Out-Null
$authPage = $getMess.Content.ReadAsStringAsync().Result
$forgRegex = [regex]'form id="__AjaxAntiForgeryForm".*?__RequestVerificationToken.*?value="(?<Token>.*?)"'
$m = $forgRegex.Match($authPage);
if ($m.Success)
{
$forget.DefaultRequestHeaders.Add("x-ms-client-antiforgery-id", $m.Groups["Token"].Value);
$data = New Object System.Net.Http.StringContent("{`"emailAddress`":`"$($Using:eMail)`"}", [System.Text.Encoding]::UTF8, "application/json")
$mess = $forget.PostAsync("$authSite/Account/SendMeResetPasswordLink", $data).Result
$mess.EnsureSuccessStatusCode() | Out-Null

Write-Output "Successfuly sent reset password link to $($Using:eMail)"
}
}
catch
{
Write-Output $_
}

Write-Output "Set library share for $($roles.Name). Share path $($Using:tenantPath)"
Set-SCUserRole -UserRole $roles -UserRoleDataPath $Using:tenantPath -VMMServer $Using:VmmServerName | Out-Null
}
else
{
Write-Output "Nothing to do"
} 
} –PSComputer $VmmServerName –PSCredential $VmmCredential
}



Очищення каталогу FTP
Для очищення каталогу FTP від віддалених каталогів передплатників доведеться зробити ранбук, що виконується за розкладом, так як обробка деяких подій VMM (нам необхідно для об'єкта «VMM UserRole» подія «Delete») в даний час в SMA не реалізована.
CleanUp-Ftp-Folder
workflow CleanUp-Ftp-Folder
{
$VmmConnection = Get-AutomationConnection -Name 'VmmConnection'
$VmmServerName = $VmmConnection.ComputerName
$SecurePassword = ConvertTo-SecureString -AsPlainText -String $VmmConnection.Password -Force
$VmmCredential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $VmmConnection.Username, $SecurePassword

$vmmLib = Get-AutomationVariable -Name 'VMMLibPath'

$libServer = $vmmLib.SubString(2)
$libServer = $libServer.SubString(0, $libServer.IndexOf("\"))

$dataPaths = inlinescript
{
$dataPaths = Get-SCUserRole -VMMServer $Using:VmmServerName | %{ $_.UserRoleDataPath }

$dataPaths
} -PSComputer $VmmServerName –PSCredential $VmmCredential

inlinescript
{
$ftpFolders = Get-ChildItem -Directory Path $Using:vmmLib | %{ $($_.FullName + '\') }

if ($Using:dataPaths -ne $null)
{
$diffList = $ftpFolders | ?{ $Using:dataPaths -notcontains $_ }
}

if ($diffList)
{
foreach ($diff in $diffList)
{
if ([String]::IsNullOrEmpty($diff))
{
continue
}
Write-Output "Deleting $diff"
Remove-Item -Recurse -Force -Confirm:$false -Path $diff
}
}
else
{
Write-Output "Nothing to delete"
}
} –PSComputer $libServer –PSCredential $VmmCredential
}



Дані ранбуки необхідно імпортувати, опублікувати, ранбуку «Notify-Created-User» присвоїти тег SPF і прив'язати до події «Створити» об'єкта «SPF-клієнт»:



Для ранбука «Cleanup-ftp-folder» необхідно створити розклад, щоб він виконувався раз в день:



Підготовка FTP
Необхідно, щоб служби Framework 2.0/3.5 були попередньо встановлені

За допомогою диспетчера сервера додаємо роль FTP з підтримкою розширення:




Створюємо FTP-сервер:



В якості шляху майстра вказуємо фізичний шлях до кореня бібліотеки передплатників. Якщо FTP сервер розгортається не на сервері бібліотеки найкращим виходом буде створення символічної зв'язку із загальним ресурсом, наприклад:
mklink /D C:\TenantsData \\vmmlibserver\TenantsData




На наступній сторінці майстра вказуємо додаткові параметри (використання SSL, номер порту і т. д.):



На завершальній сторінці вказуємо, що всі користувачі мають право на читання і запис, але не вказуємо підтримувані типи аутентифікації:



На цьому первісна настройка закінчена. Інші параметри будуть вказані після установки модуля розширення.

Установка модуля розширення та налаштування FTP
Завантажити прикладений до статті архів «Module.zip» і розпакуйте (наприклад, в «C:\Module»). Запустіть інтерпретатор cmd з правами адміністратора. Виконайте наступні команди (якщо Ваш FTP називається по іншому, вкажіть його ім'я в якості параметра):



Отримаєте наступний висновок:



Після цього необхідно виправити файл «CustomFTPHomeDirectoryProvider.dll.config», вказавши там значення ключів «auth» і «root». Ключ «auth» містить URL сайту TenantAuth, ключ «root» вказує фізичний шлях до бібліотеки передплатників. Приклад:

<configuration>
<appSettings>
<add key="auth" value="https://auth.azureline.ru" />
<add key="root" value="C:\ProgramData\TenantsLibrary" />
</appSettings>
</configuration>

Після цього файл «CustomFTPHomeDirectoryProvider.dll.config» необхідно скопіювати з фізичного шляху«C:\Windows\Microsoft.NET\assembly\GAC_MSIL\CustomFTPHomeDirectoryProvider\v4.0_1.0.0.0__a8ad38bd3b2a69ea».

Перевірка налаштувань
Відкриваємо консоль IIS Management, вибираємо FTP-сайт, відкриваємо налаштування «FTP Authentication». Повинен бути включений єдиний провайдер аутентифікації «CustomAuth»:



Відкриваємо налаштування «FTP User Isolation», переконуємося, що включено «Custom»:



Дана опція вказує рівень ізоляції користувача. За допомогою кастомного провайдера передплатник «замикається» у власному каталозі.
Тепер тестуємо. Я використовував FTP-клієнт входить в FAR. Підключаємося:



Закачуємо файл:



Після оновлення бібліотеки бачимо завантажений файл:



На порталі Azure Pack цей образ тепер можна підключити:



Таким чином, практично без додаткових зусиль, як те, контроль додаткових облікових записів в AD для доступу до FTP, вийшла зручна для передплатника точка завантаження ISO — і VHD(X)-файлів.

Матеріали (архіви з готовим модулем, джерела і ранбуками) можна завантажити за цим посиланням. На цьому все, до нових зустрічей!

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.