Spec-Zone.ru › Ansible 2.6

Настройка желаемого состояния

  • Что такое настройка желаемого состояния?
  • Требования к хосту
  • Зачем использовать DSC?
  • Как использовать DSC?
    • Типы свойств
      • PSCredential
      • Тип CimInstance
      • Массивы
    • Запуск от имени другого пользователя
  • Пользовательские ресурсы DSC
    • Поиск пользовательских ресурсов DSC
    • Установка пользовательского ресурса
  • Примеры
    • Извлечение файла zip
    • Создание каталога
    • Взаимодействие с Azure
    • Настройка веб-сайта IIS

Что такое настройка желаемого состояния?

Настройка желаемого состояния, или 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, в то время как ресурс DSC Registry не может
  • Ресурсы 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API