Конфигурация Желаемого Состояния
- Что такое Конфигурация Желаемого Состояния?
- Требования к хосту
- Зачем использовать 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 и параметры win_dsc Ansible.
Вот как выглядит версия задачи 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
Начиная с Ansible 2.8, модуль win_dsc автоматически проверяет входные параметры из Ansible с определением DSC. Это означает, что Ansible завершится ошибкой, если имя параметра неверно, обязательный параметр не задан или значение не является допустимым выбором. При запуске Ansible с уровнем подробности 3 или более (-vvv) возвращаемое значение будет содержать возможные варианты вызова на основе заданного resource_name. Вот пример выходных данных вызова для задачи Registry выше:
changed: [2016] => {
"changed": true,
"invocation": {
"module_args": {
"DependsOn": null,
"Ensure": "Present",
"Force": null,
"Hex": null,
"Key": "HKEY_LOCAL_MACHINE\\SOFTWARE\\ExampleKey",
"PsDscRunAsCredential_password": null,
"PsDscRunAsCredential_username": null,
"ValueData": [
"TestData"
],
"ValueName": "TestValue",
"ValueType": null,
"module_version": "latest",
"resource_name": "Registry"
}
},
"module_version": "1.1",
"reboot_required": false,
"verbose_set": [
"Perform operation 'Invoke CimMethod' with following parameters, ''methodName' = ResourceSet,'className' = MSFT_DSCLocalConfigurationManager,'namespaceName' = root/Microsoft/Windows/DesiredStateConfiguration'.",
"An LCM method call arrived from computer SERVER2016 with user sid S-1-5-21-3088887838-4058132883-1884671576-1105.",
"[SERVER2016]: LCM: [ Start Set ] [[Registry]DirectResourceAccess]",
"[SERVER2016]: [[Registry]DirectResourceAccess] (SET) Create registry key 'HKLM:\\SOFTWARE\\ExampleKey'",
"[SERVER2016]: [[Registry]DirectResourceAccess] (SET) Set registry key value 'HKLM:\\SOFTWARE\\ExampleKey\\TestValue' to 'TestData' of type 'String'",
"[SERVER2016]: LCM: [ End Set ] [[Registry]DirectResourceAccess] in 0.1930 seconds.",
"[SERVER2016]: LCM: [ End Set ] in 0.2720 seconds.",
"Operation 'Invoke CimMethod' complete.",
"Time taken for configuration job to complete is 0.402 seconds"
],
"verbose_test": [
"Perform operation 'Invoke CimMethod' with following parameters, ''methodName' = ResourceTest,'className' = MSFT_DSCLocalConfigurationManager,'namespaceName' = root/Microsoft/Windows/DesiredStateConfiguration'.",
"An LCM method call arrived from computer SERVER2016 with user sid S-1-5-21-3088887838-4058132883-1884671576-1105.",
"[SERVER2016]: LCM: [ Start Test ] [[Registry]DirectResourceAccess]",
"[SERVER2016]: [[Registry]DirectResourceAccess] Registry key 'HKLM:\\SOFTWARE\\ExampleKey' does not exist",
"[SERVER2016]: LCM: [ End Test ] [[Registry]DirectResourceAccess] False in 0.2510 seconds.",
"[SERVER2016]: LCM: [ End Set ] in 0.3310 seconds.",
"Operation 'Invoke CimMethod' complete.",
"Time taken for configuration job to complete is 0.475 seconds"
]
}
Ключ invocation.module_args показывает фактические заданные значения, а также другие возможные значения, которые не были заданы. К сожалению, это не покажет значение по умолчанию для свойства DSC, только то, что было задано задачей Ansible. Любой параметр *_password будет скрыт в выходных данных по соображениям безопасности, если есть другие чувствительные параметры модуля, установите no_log: True в задаче, чтобы прекратить регистрацию всех выходных данных задачи.
Типы свойств
У каждого свойства ресурса 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
Примечание
В версиях Ansible старше 2.8 вы должны установить no_log: yes в определении задачи Ansible, чтобы убедиться, что любые используемые учетные данные не будут храниться в файлах или выводе консоли.
Объект [PSCredential] определяется с EmbeddedInstance("MSFT_Credential") в определении ресурса DSC MOF.
Тип CimInstance
Объект [CimInstance] используется DSC для хранения словаря объектов на основе пользовательского класса, определенного этим ресурсом. Определение значения, принимающего [CimInstance], в YAML эквивалентно определению словаря в YAML. Например, чтобы определить значение [CimInstance] в Ansible:
# [CimInstance]AuthenticationInfo == MSFT_xWebAuthenticationInformation AuthenticationInfo: Anonymous: no Basic: yes Digest: no Windows: yes
В приведенном примере CIM-объект представляет класс MSFT_xWebAuthenticationInformation. Этот класс принимает четыре булевых переменных, Anonymous, Basic, Digest, и Windows. Ключи для использования в [CimInstance] зависят от представляемого класса. Пожалуйста, ознакомьтесь с документацией ресурса, чтобы определить ключи, которые можно использовать, и типы каждого значения ключа. Определение класса обычно находится в <resource name>.schema.mof.
Тип HashTable
Объект [HashTable] также является словарем, но не имеет строгого набора ключей, которые нужно определить. Как и [CimInstance], определяйте его как обычное значение словаря в YAML. Объект [HashTable]] определяется с EmbeddedInstance("MSFT_KeyValuePair") в определении ресурса DSC 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. При определении [CimInstance[]], обязательно ознакомьтесь с документацией ресурса, чтобы узнать, какие ключи использовать в определении.
DateTime
Объект [DateTime] — это строка DateTime, представляющая дату и время в формате ISO 8601. Значение поля [DateTime] должно быть заключено в кавычки в YAML, чтобы обеспечить правильную сериализацию строки в хост Windows. Вот пример определения значения [DateTime] в Ansible:
# As UTC-0 (No timezone) DateTime: '2019-02-22T13:57:31.2311892+00:00' # As UTC+4 DateTime: '2019-02-22T17:57:31.2311892+04:00' # As UTC-4 DateTime: '2019-02-22T09:57:31.2311892-04:00'
Все вышеперечисленные значения соответствуют дате и времени UTC 22 февраля 2019 года в 13:57:31.2311892.
Запуск от имени другого пользователя
По умолчанию DSC выполняет каждый ресурс как учетную запись SYSTEM, а не учетную запись, используемую Ansible для запуска модуля. Это означает, что ресурсы, которые динамически загружаются на основе профиля пользователя, такие как реестр HKEY_CURRENT_USER hive, будут загружаться в профиль SYSTEM . Параметр PsDscRunAsCredential — это параметр, который может быть установлен для каждого ресурса DSC, чтобы принудительно запустить движок DSC под другой учетной записью. Поскольку PsDscRunAsCredential имеет тип PSCredential, он определяется с суффиксами _username и _password.
В качестве примера, используя тип ресурса реестра, вот как определить задачу для доступа к реестру HKEY_CURRENT_USER hive пользователя 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: yes
Пользовательские ресурсы DSC
Ресурсы DSC не ограничиваются встроенными опциями от Microsoft. Можно установить пользовательские модули для управления другими ресурсами, которые обычно недоступны.
Поиск пользовательских ресурсов DSC
Вы можете использовать PSGallery для поиска пользовательских ресурсов, а также документации по их установке на хост Windows.
Для поиска пользовательских ресурсов также можно использовать cmdlet 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 на хост:
- Вручную с помощью cmdlet
Install-Module - Используя модуль Ansible
win_psmodule - Сохранение модуля вручную и копирование его на другой хост
Это пример установки ресурсов xWebAdministration с использованием win_psmodule.
- name: Install xWebAdministration DSC resource
win_psmodule:
name: xWebAdministration
state: present
После установки модуль win_dsc сможет использовать этот ресурс, ссылаясь на него с опцией resource_name.
Первые два метода работают только при наличии интернет-доступа у хоста. Если доступа в интернет нет, модуль необходимо сначала установить на другой хост с доступом в интернет, а затем скопировать. Для сохранения модуля в локальный путь можно запустить следующий PowerShell cmdlet:
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: yes
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
loop:
- 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
См. также
- О Playbooks
- Введение в Playbooks
- Рекомендации по лучшим практикам
- Рекомендации по лучшим практикам
- Список модулей Windows
- Список модулей, специфичных для Windows, реализованных в PowerShell
- Список рассылки пользователей
- У вас есть вопрос? Загляните на страницу группы Google!
- irc.freenode.net
- #ansible IRC чат-канал
© 2012–2018 Michael DeHaan
© 2018–2019 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.9/user_guide/windows_dsc.html