Настройка желаемого состояния
- Что такое настройка желаемого состояния?
- Требования к хосту
- Зачем использовать 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 File resource и 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?
Модуль win_dsc принимает произвольный набор параметров, чтобы изменять поведение в зависимости от управляемого ресурса. Список встроенных ресурсов можно найти по адресу resources.
В качестве примера, используя ресурс Registry, вот определение 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 для ресурса Registry 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. Чтобы задать свойство PSCredential DSC, определение параметра должно содержать два элемента, которые имеют суффикс _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.
Взяв за пример ресурс Registry, вот как определить задачу для доступа к ветви реестра 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
- Рекомендации по наилучшим практикам
- Рекомендации по наилучшим практикам
-
List of Windows Modules :ref:`<windows_modules> - Список модулей, специфичных для 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.6/user_guide/windows_dsc.html