Настройка желаемого состояния
- Что такое настройка желаемого состояния?
- Требования к хосту
- Зачем использовать DSC?
- Как использовать DSC?
- Пользовательские ресурсы DSC
- Примеры
Что такое настройка желаемого состояния?
Настройка желаемого состояния, или DSC, — это инструмент, встроенный в PowerShell, который позволяет задавать конфигурацию хоста Windows с помощью кода. Основная цель DSC такая же, как у Ansible, просто она выполняется другим способом. С Ansible 2.4 был добавлен модуль win_dsc, позволяющий использовать существующие ресурсы DSC при взаимодействии с хостом Windows.
Более подробную информацию о DSC можно найти на странице Обзор DSC.
Требования к хосту
Для использования модуля win_dsc, хост Windows должен иметь установленную PowerShell версию 5.0 или выше. Все поддерживаемые хосты, кроме Windows Server 2008 (без R2), могут быть обновлены до PowerShell 5.
После выполнения требований к PowerShell использование DSC сводится к созданию задачи с модулем win_dsc.
Зачем использовать DSC?
DSC и модули Ansible имеют общую цель — определение и обеспечение состояния ресурса. Из-за этого ресурсы, такие как ресурс DSC Файл и Ansible win_file, могут использоваться для достижения одинакового результата. Выбор между ними зависит от конкретной ситуации.
Причины использования модуля Ansible вместо ресурса DSC:
- Хост не поддерживает PowerShell 5.0 или его нельзя легко обновить
- Ресурс DSC не предлагает функцию, присутствующую в модуле Ansible. Например, win_regedit может управлять типом свойства
REG_NONE, в то время как ресурс DSCRegistryне может - Ресурсы DSC ограниченно поддерживают режим проверки, в то время как некоторые модули Ansible имеют лучшие средства проверки
- Ресурсы DSC не поддерживают режим сравнения, в то время как некоторые модули Ansible поддерживают
- Пользовательские ресурсы требуют дополнительных шагов установки на хосте, в то время как модули Ansible встроенные в Ansible
- В ресурсе DSC есть ошибки, которых нет в модуле Ansible
Причины использования ресурса DSC вместо модуля Ansible:
- Модуль Ansible не поддерживает функцию, присутствующую в ресурсе DSC
- Отсутствует модуль Ansible
- В существующем модуле Ansible есть ошибки
В конечном счете, неважно, выполняется ли задача с помощью DSC или модуля Ansible; важно, чтобы задача выполнялась правильно, и плейбуки оставались удобочитаемыми. Если у вас больше опыта с DSC, чем с Ansible, и DSC выполняет задачу, просто используйте DSC для этой задачи.
Как использовать DSC?
Модуль win_dsc принимает свободноформатные параметры, поэтому он изменяется в соответствии с управляемым ресурсом. Список встроенных ресурсов можно найти на странице resources.
В качестве примера, используя ресурс Регистр, вот определение DSC, как документировано Microsoft:
Registry [string] #ResourceName
{
Key = [string]
ValueName = [string]
[ Ensure = [string] { Enable | Disable } ]
[ Force = [bool] ]
[ Hex = [bool] ]
[ DependsOn = [string[]] ]
[ ValueData = [string[]] ]
[ ValueType = [string] { Binary | Dword | ExpandString | MultiString | Qword | String } ]
}
При определении задачи resource_name должно быть задано имя используемого ресурса DSC — в этом случае resource_name должно быть установлено в Registry. module_version может ссылаться на определенную версию установленного ресурса DSC; если оставить пустым, будет использоваться последняя версия. Другие параметры — это параметры, используемые для определения ресурса, такие как Key и ValueName. Хотя параметры в задаче не чувствительны к регистру, рекомендуется сохранять исходный регистр, так как это упрощает различение параметров ресурса DSC от параметров Ansible win_dsc.
Вот как бы выглядела аналогичная задача Ansible для ресурса DSC Регистр:
- name: use win_dsc module with the Registry DSC resource
win_dsc:
resource_name: Registry
Ensure: Present
Key: HKEY_LOCAL_MACHINE\SOFTWARE\ExampleKey
ValueName: TestValue
ValueData: TestData
Типы свойств
У каждого свойства ресурса DSC есть связанный с ним тип. Ansible попытается преобразовать заданные параметры в соответствующий тип во время выполнения. Для простых типов, таких как [string] и [bool], это простая операция, но для сложных типов, таких как [PSCredential] или массивов (например, [string[]] ), требуются определенные правила.
PSCredential
Объект [PSCredential] используется для безопасного хранения учетных данных, но Ansible не имеет возможности сериализовать их через JSON. Для задания свойства DSC PSCredential определение параметра должно содержать две записи, имеющие суффиксы _username и _password для имени пользователя и пароля соответственно. Например:
PsDscRunAsCredential_username: '{{ansible_user}}'
PsDscRunAsCredential_password: '{{ansible_password}}'
SourceCredential_username: AdminUser
SourceCredential_password: PasswordForAdminUser
Примечание
Вы должны установить no_log: true в определении задачи Ansible, чтобы убедиться, что используемые учетные данные не записываются в файлы журналов или вывод консоли.
Тип CimInstance
Объект [CimInstance] используется DSC для хранения объекта словаря, основанного на пользовательском классе, определённом этим ресурсом. Определение значения, принимающего [CimInstance], в YAML эквивалентно определению словаря в YAML. Например, для определения значения [CimInstance] в Ansible:
# [CimInstance]AuthenticationInfo == MSFT_xWebAuthenticationInformation AuthenticationInfo: Anonymous: no Basic: yes Digest: no Windows: yes
В приведенном выше примере экземпляр CIM представляет класс MSFT_xWebAuthenticationInformation <https://github.com/PowerShell/xWebAdministration/blob/dev/DSCResources/MSFT_xWebsite/MSFT_xWebsite.schema.mof>``_.
This class accepts four boolean variables, ``Anonymous, Basic, Digest, и Windows. Ключи для использования в [CimInstance] зависят от представляемого класса. Обратитесь к документации ресурса, чтобы определить используемые ключи и типы каждого значения ключа. Определение класса обычно находится в <resource name>.schema.mof.
Массивы
Массивы простых типов, такие как [string[]] или [UInt32[]], определяются как список или как строка, разделенная запятыми, которая затем преобразуется в соответствующий тип. Использование списка рекомендуется, поскольку модуль win_dsc не выполняет ручную обработку значений перед передачей их в движок DSC. Например, для определения массива простого типа в Ansible:
# [string[]] ValueData: entry1, entry2, entry3 ValueData: - entry1 - entry2 - entry3 # [UInt32[]] ReturnCode: 0,3010 ReturnCode: - 0 - 3010
Массивы сложных типов, такие как [CimInstance[]] (массив словарей), можно определить следующим образом:
# [CimInstance[]]BindingInfo == MSFT_xWebBindingInformation BindingInfo: - Protocol: https Port: 443 CertificateStoreName: My CertificateThumbprint: C676A89018C4D5902353545343634F35E6B3A659 HostName: DSCTest IPAddress: '*' SSLFlags: 1 - Protocol: http Port: 80 IPAddress: '*'
В примере выше — массив с двумя значениями класса MSFT_xWebBindingInformation <https://github.com/PowerShell/xWebAdministration/blob/dev/DSCResources/MSFT_xWebsite/MSFT_xWebsite.schema.mof>``_.
When defining a ``[CimInstance[]], убедитесь, что вы прочитали документацию ресурса, чтобы узнать, какие ключи использовать в определении.
Запуск от другого пользователя
По умолчанию DSC выполняет каждый ресурс от учётной записи SYSTEM, а не от учётной записи, под которой Ansible запускает модуль. Это означает, что ресурсы, динамически загружаемые на основе профиля пользователя, такие как реестр HKEY_CURRENT_USER , загружаются в профиль учётной записи SYSTEM. Параметр PsDscRunAsCredential` — это параметр, который может быть задан для каждого ресурса DSC, чтобы заставить движок DSC запускаться от другой учётной записи. Так как PsDscRunAsCredential имеет тип PSCredential, он определяется с суффиксами _username и _password.
В качестве примера, используя ресурс Регистр, вот как определить задачу для доступа к ветви реестра HKEY_CURRENT_USER пользователя Ansible:
- name: use win_dsc with PsDscRunAsCredential to run as a different user
win_dsc:
resource_name: Registry
Ensure: Present
Key: HKEY_CURRENT_USER\ExampleKey
ValueName: TestValue
ValueData: TestData
PsDscRunAsCredential_username: '{{ansible_user}}'
PsDscRunAsCredential_password: '{{ansible_password}}'
no_log: true
Пользовательские ресурсы DSC
Ресурсы DSC не ограничиваются встроенными вариантами от Microsoft. Можно установить пользовательские модули для управления другими ресурсами, которые обычно недоступны.
Поиск пользовательских ресурсов DSC
Для поиска пользовательских ресурсов можно использовать PSGallery, а также документацию по установке на хосте Windows.
Для поиска пользовательских ресурсов также можно использовать командлет Find-DscResource. Например:
# find all DSC resources in the configured repositories Find-DscResource # find all DSC resources that relate to SQL Find-DscResource -ModuleName "*sql*"
Примечание
Ресурсы DSC, разработанные Microsoft и начинающиеся с x, являются экспериментальными и не поддерживаются.
Установка пользовательского ресурса
Существует три способа установки ресурса DSC на хосте:
- Вручную с помощью командлета
Install-Module - Используя модуль Ansible
win_psmodule - Сохранение модуля вручную и копирование его на другой хост
Пример установки ресурсов xWebAdministration с помощью win_psmodule:
- name: install xWebAdministration DSC resource
win_psmodule:
name: xWebAdministration
state: present
После установки модуль win_dsc сможет использовать ресурс, ссылаясь на него с помощью параметра resource_name.
Первые два способа работают только в том случае, если хост имеет доступ к интернету. Если хост не имеет доступа к интернету, модуль необходимо сначала установить на другой хост с доступом к интернету, а затем скопировать его. Чтобы сохранить модуль в локальный путь, можно запустить следующий командлет PowerShell:
Save-Module -Name xWebAdministration -Path C:\temp
Это создаст папку xWebAdministration в C:\temp, которую можно скопировать на любой хост. Для того, чтобы PowerShell увидел этот автономный ресурс, его необходимо скопировать в каталог, указанный в переменной среды PSModulePath . В большинстве случаев путь C:\Program Files\WindowsPowerShell\Module задается через эту переменную, но можно использовать модуль win_path для добавления других путей.
Примеры
Извлечение zip-архива
- name: extract a zip file
win_dsc:
resource_name: Archive
Destination: c:\temp\output
Path: C:\temp\zip.zip
Ensure: Present
Создание каталога
- name: create file with some text
win_dsc:
resource_name: File
DestinationPath: C:\temp\file
Contents: |
Hello
World
Ensure: Present
Type: File
- name: create directory that is hidden is set with the System attribute
win_dsc:
resource_name: File
DestinationPath: C:\temp\hidden-directory
Attributes: Hidden,System
Ensure: Present
Type: Directory
Взаимодействие с Azure
- name: install xAzure DSC resources
win_psmodule:
name: xAzure
state: present
- name: create virtual machine in Azure
win_dsc:
resource_name: xAzureVM
ImageName: a699494373c04fc0bc8f2bb1389d6106__Windows-Server-2012-R2-201409.01-en.us-127GB.vhd
Name: DSCHOST01
ServiceName: ServiceName
StorageAccountName: StorageAccountName
InstanceSize: Medium
Windows: True
Ensure: Present
Credential_username: '{{ansible_user}}'
Credential_password: '{{ansible_password}}'
Настройка веб-сайта IIS
- name: install xWebAdministration module
win_psmodule:
name: xWebAdministration
state: present
- name: install IIS features that are required
win_dsc:
resource_name: WindowsFeature
Name: '{{item}}'
Ensure: Present
with_items:
- Web-Server
- Web-Asp-Net45
- name: setup web content
win_dsc:
resource_name: File
DestinationPath: C:\inetpub\IISSite\index.html
Type: File
Contents: |
<html>
<head><title>IIS Site</title></head>
<body>This is the body</body>
</html>
Ensure: present
- name: create new website
win_dsc:
resource_name: xWebsite
Name: NewIISSite
State: Started
PhysicalPath: C:\inetpub\IISSite\index.html
BindingInfo:
- Protocol: https
Port: 8443
CertificateStoreName: My
CertificateThumbprint: C676A89018C4D5902353545343634F35E6B3A659
HostName: DSCTest
IPAddress: '*'
SSLFlags: 1
- Protocol: http
Port: 8080
IPAddress: '*'
AuthenticationInfo:
Anonymous: no
Basic: yes
Digest: no
Windows: yes
См. также
- Руководство пользователя
- Индекс документации
- Работа с Playbook
- Введение в Playbook
- Рекомендации по наилучшим практикам
- Рекомендации по наилучшим практикам
- Список модулей Windows
- Список модулей, специфичных для Windows, все реализованы в PowerShell
- Список рассылки пользователей
- Есть вопрос? Загляните в группу Google!
- irc.freenode.net
- Чат-канал IRC #ansible
© 2012–2018 Michael DeHaan
© 2018–2019 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.7/user_guide/windows_dsc.html