Настройка желаемого состояния
- Что такое настройка желаемого состояния?
- Требования к хосту
- Почему использовать 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 v5.
После выполнения требований к PowerShell использование DSC так же просто, как создание задачи с помощью модуля win_dsc.
Почему использовать DSC?
DSC и модули Ansible преследуют общую цель: определение и обеспечение состояния ресурса. Именно поэтому такие ресурсы, как ресурс DSC Файл и Ansible win_file, могут использоваться для достижения одинакового результата. Выбор между ними зависит от конкретной ситуации.
Причины использования модуля Ansible вместо ресурса DSC:
- Хост не поддерживает PowerShell v5.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:
- 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") в определении MOF ресурса DSC.
Тип 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") в определении MOF ресурса DSC.
Массивы
Массивы простых типов, такие как [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, будут загружены в профиль 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: yes
Настраиваемые ресурсы 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: 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
См. также
- Руководство пользователя
- Индекс документации
- Работа с 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.8/user_guide/windows_dsc.html