DSC и напильник: часть 1. Настройка DSC Pull Server для работы с базой данных SQL

-4vu2idi-kona7rk1zluhuqtrlk.png

PowerShell Desired State Configuration (DSC) сильно упрощает работу по развертыванию и конфигурированию операционной системы, ролей сервера и приложений, когда у вас сотни серверов.

Но при использовании DSC on-premises, т.е. не в MS Azure, возникает пара нюансов. Они особенно ощутимы, если организация большая (от 300 рабочих станций и серверов) и в ней еще не открыли мир контейнеров:

  • Нет полноценных отчетов о состоянии систем. Если нужная конфигурация не применилась на каких-то серверах, то без этих отчетов мы об этом не узнаем. От встроенного сервера отчетов информацию получить довольно сложно, а для большого количества хостов — еще и долго.
  • Отсутствует масштабируемость и отказоустойчивость. Невозможно построить ферму опрашивающих веб-серверов DSC, которые бы имели единую отказоустойчивую базу данных и общее хранилище mof-файлов конфигураций, модулей и ключей регистрации.


Сегодня я расскажу, как можно решить первую проблему и получить данные для построения отчетности. Все было бы проще, если в качестве базы данных можно было бы использовать SQL. MS обещает встроенную поддержку только в Windows Server 2019 или в build Windows server 1803. Забирать данные с использованием OleDB provider тоже не получится, так как DSC-сервер использует именованный параметр, который не полностью поддерживается OleDbCommand.

Нашел вот такой способ: тем, кто использует Windows Server 2012 и 2016, можно настроить использование БД SQL в качестве backend«a для опрашивающего DSC-сервера. Для этого создадим «прокси» в виде .mdb файла со связанными таблицами, который будет перенаправлять данные, полученные от отчетов клиентов, в БД SQL-сервера.
Примечание: для Windows Server 2016 необходимо использовать AccessDatabaseEngine2016×86, так как Microsoft.Jet.OLEDB.4.0 больше не поддерживается.

Я не буду подробно останавливаться на процессе развертывания опрашивающего DSC-сервера, он очень хорошо описан тут. Отмечу только пару моментов. Если мы разворачиваем опрашивающий DSC на одном веб-сервере со WSUS или Kaspersky Security Center, то в скрипте создания конфигурации необходимо поменять следующие параметры:

  1. UseSecurityBestPractices     = $false

    Иначе TLS 1.0 будет отключен, вы не сможете подключиться к БД SQL. Kaspersky Security Center тоже не будет работать (проблема должна быть решена в Kaspersky Security Center v11).
  2. Enable32BitAppOnWin64   = $true

    Если не внести это изменение, не получится запустить AppPool DSC-сервера на IIS со WSUS.
  3. При установке DSC-сервера совместно с WSUS отключите статическое и динамическое кэширование для сайта DSC.


Перейдем к настройке сервера DSC для использования БД SQL.

Создание БД SQL


  1. Создадим пустую базу данных SQL с именем DSC.

    24jeikjjhurylsfpxfdz-hkdkoo.png

    -ikmhzvewzfmt8ygqaidws2erzm.png

  2. Создадим учетную запись для подключения к этой базе данных. Предварительно проверьте, что на SQL-сервере разрешена аутентификация учетных записей как Windows, так и SQL.

    z-qztxe410jqyjoj7rwna3t9-am.png

    uhnovmv8wsywdxi6ahxiinvkj4y.png

  3. Переходим в раздел User Mapping. Выбираем базу данных, в данном случае — DSC. Даем права владельца базы данных.

    clfgvg0ya7csozw1ner_egxdxs8.png

  4. Готово.

    9ila7nedgtygol496l7da239i1k.png


Создание схемы для базы данных DSC


Создать схему для базы данных DSC можно двумя способами:

  • самостоятельно, через скрипт на TSQL
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[Devices](
    [TargetName] [nvarchar](255) NOT NULL,
    [ConfigurationID] [nvarchar](255) NOT NULL,
    [ServerCheckSum] [nvarchar](255) NOT NULL,
    [TargetCheckSum] [nvarchar](255) NOT NULL,
    [NodeCompliant] [bit] NOT NULL,
    [LastComplianceTime] [datetime] NULL,
    [LastHeartbeatTime] [datetime] NULL,
    [Dirty] [bit] NOT NULL,
    [StatusCode] [int] NULL
    ) ON [PRIMARY]
    GO
     
    CREATE TABLE [dbo].[RegistrationData](
    [AgentId] [nvarchar](255) NOT NULL,
    [LCMVersion] [nvarchar](255) NULL,
    [NodeName] [nvarchar](255) NULL,
    [IPAddress] [nvarchar](255) NULL,
    [ConfigurationNames] [nvarchar](max) NULL
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    GO
     
    CREATE TABLE [dbo].[StatusReport](
    [JobId] [nvarchar](50) NOT NULL,
    [Id] [nvarchar](50) NOT NULL,
    [OperationType] [nvarchar](255) NULL,
    [RefreshMode] [nvarchar](255) NULL,
    [Status] [nvarchar](255) NULL,
    [LCMVersion] [nvarchar](50) NULL,
    [ReportFormatVersion] [nvarchar](255) NULL,
    [ConfigurationVersion] [nvarchar](255) NULL,
    [NodeName] [nvarchar](255) NULL,
    [IPAddress] [nvarchar](255) NULL,
    [StartTime] [datetime] NULL,
    [EndTime] [datetime] NULL,
    [Errors] [nvarchar](max) NULL,
    [StatusData] [nvarchar](max) NULL,
    [RebootRequested] [nvarchar](255) NULL
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    GO
  • импортировать данные из пустого devices.mdb в составе PS-модуля PSDesiredStateConfiguration через Мастера импорта данных SQL.

    Devices.mdb, с которым мы будем работать, находится в C:\Windows\SysWOW64\WindowsPowerShell\v1.0\Modules\PSDesiredStateConfiguration\PullServer.


  1. Для импорта данных запускаем SQL Server Import and Export Wizard.

    im3vwwj9ib9wucm4xnl70jow1yy.png

  2. Выбираем, откуда мы будем забирать данные — в нашем случае это база данных Microsoft Access. Нажимаем Next.

    l5rcdqtxvaajv5h5mbil72vv3k0.png

  3. Выбираем файл, откуда импортируем схему.

    thdtxutqcvsrv0laifxjhsbse2w.png

  4. Указываем, куда импортировать, — у нас это БД SQL.

    dcscp5f9n-cdmm0qfo0gv_-k0oy.png

  5. Выбираем SQL-сервер (Server Name) и базу данных, в которую будем импортировать данные (DataBase).

    krsddsbr4jpvi9dgvc3f_qcxwqy.png

  6. Выбираем опцию Copy data from one or more tables or views (копирование данных из таблиц или представлений).

    nuaqq8akzpdz07fwf1gedrxcfns.png

  7. Выбираем таблицы, из которых будем импортировать схему БД.

    bf7kat56ltu-amw0nhvgbp2tkpw.png

  8. Ставим галочку Run Immediately и жмем Finish.

    7iauwo3j_x0qzfwqgfc1u8tyfks.png

  9. Готово.

    oi49w0cedn8ilblfijwlhjsumfm.png

  10. В результате в БД DSC должны появиться таблицы.

    z3uippubkjjk0r2fqolnoweezme.png


Настройка .mdb «прокси» файла


Создание ODBC-подключения к SQL-серверу. Предполагается, что MS Access не установлен на сервере с DSC, поэтому настройка databases.mdb выполняется на промежуточном хосте с установленным MS Access.

Создадим системное ODBC-подключение к SQL-серверу (разрядность подключения должна совпадать с разрядностью MS Access — 64 или 32). Его можно создать с помощью:
— командлета Powershell:

Add-OdbcDsn –Name DSC –DriverName 'SQL Server' –Platform '<64-bit or 32-bit>' –DsnType System –SetPropertyValue @('Description=DSC Pull Server',"Server=",'Trusted_Connection=yes','Database=DSC') –PassThru


— или вручную, с помощью мастера подключений:

  1. Открываем Administrative tools. Выбираем источники данных ODBC в зависимости от версии установленного MS Access. Переходим во вкладку System DSN и создаем системное подключение (Add).

    ptk5cuuxfa2deeqiw_h6vb4vy_4.png

  2. Указываем, что будем подключаться к SQL-серверу. Жмем Finish.

    eyb_dz43l6-xzg3yupw4zgrasbi.png

  3. Указываем имя и сервер для подключения. Потом подключение с такими же параметрами нужно будет создать на сервере DSC.

    _dpylq1y7uycuiq08tkq-jp1eri.png

  4. Указываем, что для подключения к SQL-серверу используется предварительно созданный нами логин с именем DSC.

    _2bwbsadgrihkikrnnh2eq2tkbs.png

  5. Указываем БД в настройках подключения DSC.

    egexegl50aplc4fr_f1jbfx3edq.png

  6. Жмем Finish.

    dia8_nwzir-nhafd9rezwstdwjq.png

  7. Перед завершением настройки проверяем, что подключение работает (Test Data Source).

    ktfttmjcb_8gyb3s-o_xnwewyfy.png

  8. Готово.

    4r4zaalbv3rms8xsfjoijzvtige.png


Создание базы данных devices.mdb в MS Access. Запускаем MS Access и создаем пустую базу данных под названием devices.mdb.

tq4niasnq5av17ozevpg365y_qy.png

  1. Переходим во вкладку Внешние данные, кликаем на База данных ODBC. В появившемся окне выбираем Создать связанную таблицу для связи с источником данных.

    aqqlvqqilfgqgdakivqfna9irvu.png

  2. В новом окне выбираем вкладку Machine Data Source и жмем ОК. В новом окне вводим учетные данные для подключения к SQL-серверу.

    rr8czlircqalebpljfw47h5eax4.png

  3. Выбираем таблицы, которые необходимо прилинковать. Отмечаем галкой Сохранить пароль и жмем ОК. Пароль сохранять каждый раз для всех трех таблиц.

    dyf9w58ztue8ugsagfiieghgqsc.png

  4. В индексах нужно выбрать следующие:
    — TargetName для таблицы dbo_Devices;

    e-fls_elpbmiktv67egcweaxlvq.png

    — NodeName или IPAddress для dbo_RegistrationData;

    xougdoiodatj1tlmsalqpdfzauk.png

    — NodeName или IPAddress для dbo_StatusReport.

    w7ljush_8zrt8hupqoqvrtsgk4g.png

  5. Переименуем таблицы в MS Access, а именно: удалим префикс dbo_, чтобы DSC мог использовать их.

    6wo-1qvgkwua75cv1nd1rsmng1k.png

  6. Готово.

    5816x8uw93muoywridyx-dwjugw.png

  7. Сохраняем файл и закрываем MS Access. Теперь копируем полученный devices.mdb на DSC-сервер (по умолчанию в C:\Program Files\WindowsPowershell\DSCService) и заменяем им существующий (если он есть).


Настройка DSC-сервера для использования SQL


  1. Возвращаемся к серверу DSC. Чтобы подключиться к SQL-серверу с нашим proxy-файлом, создадим новое ODBC подключение на DSC-сервере. Имя, и разрядность, и настройки подключения должны быть такие же, как и при создании MDB-файла. Можно скопировать уже настроенный пустой devices.mdb отсюда.
  2. Чтобы использовать devices.mdb, нужно внести изменения в web.config опрашивающего сервера DSC (по умолчанию — C:\inetpub\PSDSCPullServer\web.config):

— для Windows Server 2012



— для Windows Server 2016


На этом настройка DSC-сервера закончена.

Проверка работоспособности DSC-сервера


  1. Проверим, что DSC-сервер доступен через web-браузер.

    oioe1zuj9x9gvl9eeek9sc38nz8.png

  2. Теперь проверим, правильно ли работает опрашивающий сервер DSC. Для этого в составе модуля xPSDesiredStateConfiguration есть скрипт pullserversetuptests.ps1. Перед запуском этого скрипта необходимо установить модуль Powershell с именем Pester. Устанавливаем его Install-Module -Name Pester.
  3. Открываем C:\Program Files\WindowsPowerShell\Modules\xPSDesiredStateConfiguration\<версия модуля>\DSCPullServerSetup\PullServerDeploymentVerificationTest (в примере версия 8.0.0.0.0).

    _5dbglhxbi5mgboeexxi_pw7oxk.png

  4. Открываем PullServerSetupTests.ps1 и проверяем путь к web.config DSC-сервера. Красным выделил путь к web.config, который будет проверять скрипт. Если нужно, меняем этот путь.

    ettemnvebjfc3kgviqzqsob_eas.png

  5. Запускаем pullserversetuptests.ps1
    Invoke-Pester .\PullServerSetupTests.ps1
    Все работает.

    qcqpm5a4iwsl_-9d7n2uzll9zjg.png

  6. В SQL Management Studio видим, что администрируемые хосты отправляют отчеты на сервер отчетов DSC и данные попадают в базу данных DSC на SQL-сервере.

    baoo048uqhsyxpsv4yaaftqmwvi.png


На этом все. В следующих статьях планирую рассказать, как на полученных данных построить отчеты, и коснусь вопросов про отказоустойчивость и масштабируемость.

© Habrahabr.ru