Не удалось найти сборки, зависящие от ошибки типа [CloudFileDirectory], в настраиваемом модуле Azure DSC

Я создал собственный модуль как класс PowerShell, примерно следуя инструкциям, доступным на Написание собственного ресурса DSC с классами PowerShell. Намерение состоит в том, чтобы подключиться к хранилищу файлов Azure и загрузить некоторые файлы. Я использую DSC службы автоматизации Azure в качестве опрашивающего сервера.

Позвольте мне начать с того, что при запуске через PowerShell ISE код работает очень хорошо. Что-то идет не так, когда я загружаю его в Azure - я получаю сообщение об ошибке Unable to find type [CloudFileDirectory]. Этот спецификатор типа поступает из сборок, на которые имеется ссылка в модуле Azure.Storage, который определенно входит в мой список средств автоматизации.

В верхней части моего psm1 файла у меня есть

Using namespace Microsoft.WindowsAzure.Storage.File

[DscResource()]
class tAzureStorageFileSync
{
    ...
    # Create the search context
    [CloudFileDirectory] GetBlobRoot()
    {
        ...
    }
    ...
}

Я не уверен, поддерживается ли этот Using в данном сценарии или нет, поэтому назовем его вопросом 1.

На сегодняшний день я пробовал:

  • Добавление RequiredModules = @( "Azure.Storage" ) в psd1 файл
  • Добавление RequiredAssemblies = @( "Microsoft.WindowsAzure.Storage.dll" ) в psd1 файл
  • Отправка фактического файла Microsoft.WindowsAzure.Storage.dll в корень загружаемого мною zip модуля (от которого ужасно пахнет)

Когда я развертываю модуль в Azure с New-AzureRmAutomationModule, он отлично загружается и обрабатывается. Шаг Extracting activities... работает и ошибок не выдает.

Однако, когда я компилирую конфигурацию, процесс компиляции завершается с ошибкой Unable to find type, о которой я упоминал.

Я подумывал добавить Import-Module Azure.Storage над объявлением class, но никогда раньше не видел, чтобы это было сделано где-либо еще.

Вопрос 2. Можно ли выполнить локальную компиляцию, используя процесс, аналогичный тому, который используется в Azure DSC, чтобы быстрее протестировать изменения?

Вопрос 3. Кто-нибудь знает, что здесь не так?


person Richard Hauer    schedule 02.11.2016    source источник


Ответы (3)


Вопрос 1/3: Если вы создаете классы в PowerShell и используете в нем другие классы, убедитесь, что эти классы присутствуют ДО загрузки файла сценария, содержащего ваш новый класс.

То есть: Loader.ps1:

Import-Module Azure.Storage
. .\MyDSC-Class.ps1

Powershell проверяет, находит ли он все типы, на которые вы ссылаетесь, при интерпретации скрипта, поэтому все типы должны быть загружены до того, как это произойдет. Вы можете сделать это, создав файл сценария, который сначала загружает все зависимости, а затем загружает ваш сценарий.

person restless1987    schedule 02.11.2016
comment
Разве не в этом вся цель поля RequiredModules в psd1? - person Richard Hauer; 02.11.2016
comment
Кроме того, «использование» должно быть вверху, так где же мне поставить Import-Module? После «использования», но перед «классом»? Может быть, сделать зависимый скрипт и подключить его к psd1? - person Richard Hauer; 02.11.2016
comment
Я думаю, что это больше похоже на обработку ошибок - но я не знаю - person restless1987; 02.11.2016
comment
Не совсем уверен, что ты имеешь в виду - person Richard Hauer; 02.11.2016
comment
Оператор using используется только для сокращения имен типов. - person restless1987; 02.11.2016
comment
просмотрите этот ответ: stackoverflow.com/questions/34625440/ - person restless1987; 02.11.2016
comment
Да, верно. Однако пространство имен, на которое ссылается слово using, содержится в сборке в импортируемом модуле, и оно должно находиться наверху. Таким образом, «использование» предшествует импорту, что, вероятно, неверно. Я думал, что система зависимостей psd1 была разработана для решения этой проблемы. Только это не работает так, как я ожидал - person Richard Hauer; 02.11.2016
comment
Основываясь на этой статье и вашем руководстве, я добавлю Import-Module в саму конфигурацию DSC, даже если он нужен только в модуле. Может быть, это как-то добавит это в какой-то контекст. Понятно, что я не могу добавить его в сам класс psm1. Возможно, процесс компиляции Config не учитывает зависимости модулей должным образом? Попробую завтра и доложу. - person Richard Hauer; 02.11.2016

Что касается вопроса 2, если вы зарегистрируете свой компьютер как гибридный рабочий, вы сможете запускать скрипт быстрее и компилировать локально. (Для получения дополнительных сведений о гибридных рабочих местах https://azure.microsoft.com/en-us/documentation/articles/automation-hybrid-runbook-worker/).

Если вам нужен простой способ зарегистрировать гибридного рабочего, вы можете запустить этот скрипт на своем локальном компьютере (https://github.com/azureautomation/runbooks/blob/master/Utility/ARM/New-OnPremiseHybridWorker.ps1). Просто убедитесь, что на вашем компьютере установлен WMF 5.

person Jenny Hunter    schedule 02.11.2016
comment
На странице в конце первой ссылки написано: ›Примечание:› Гибридные рабочие процессы Runbook в настоящее время не поддерживают конфигурации DSC. Разве это не означает, что я фактически не могу использовать их для компиляции конфигураций? - person Richard Hauer; 03.11.2016
comment
Это примечание вводит в заблуждение и будет изменено в нашей документации. Гибридные рабочие процессы Runbook изначально не поддерживают конфигурации DSC из нашей службы. Вы должны зарегистрировать их как узлы DSC для применения конфигураций DSC, но вы все равно можете использовать любой из командлетов Azure для импорта или компиляции конфигураций DSC. - person Jenny Hunter; 14.11.2016

Для создания конфигураций DSC и локального тестирования я бы посмотрел на надстройку Azure Automation ISE, доступную на https://www.powershellgallery.com/packages/AzureAutomationAuthoringToolkit/0.2.3.6 Вы можете установить его, выполнив приведенную ниже команду из окна административной оболочки PowerShell ISE. Установить-модуль AzureAutomationAuthoringToolkit -Scope CurrentUser

Я также заметил, что для загрузки библиотек мне нужно вызвать import-module, чтобы иметь возможность вызывать методы. Мне нужно провести небольшое исследование, чтобы определить, что для этого нужно. Вы можете увидеть пример, который я написал для копирования файлов из хранилища Azure с использованием ключа хранилища на https://github.com/azureautomation/modules/tree/master/cAzureStorage

Поскольку вы, вероятно, не хотите развертывать библиотеку хранилища на всех узлах, я включил библиотеку хранилища в образец модуля выше, чтобы он автоматически распределялся по всем узлам службой автоматизации.

Надеюсь, это поможет, Эамон

person Eamon O'Reilly    schedule 03.11.2016
comment
@EamonOReilly спасибо за это - попробую авторинговый комплект. Я заметил ваш модуль, но пытался избежать распространения dll (которая устаревает) - я предполагал, что ресурса Azure.Storage DSC было достаточно, но, очевидно, нет. Мне не удалось устранить описанную ошибку синтаксического анализа, поэтому я удалил на данный момент все ссылки на типы. - person Richard Hauer; 03.11.2016
comment
Спасибо, Ричард. Причина, по которой я написал этот модуль, заключалась в том, чтобы у меня был последовательный способ загрузки файлов на мою виртуальную машину, независимо от того, находятся ли они в Azure или в локальном центре обработки данных. Если все ваши виртуальные машины находятся в Azure, вы можете просто использовать собственные возможности SMB для файлов Azure, а затем получить к ним доступ с помощью встроенного ресурса File и указать SourcePath в качестве общего ресурса SMB. - person Eamon O'Reilly; 04.11.2016
comment
Кроме того, преимущество распространения dll внутри модуля заключается в том, что я могу контролировать, какая версия будет использоваться. Если я хочу обновить библиотеку хранилища, я могу загрузить новую версию модуля, и тогда она будет автоматически распространена на все узлы службой DSC автоматизации. Спасибо - person Eamon O'Reilly; 04.11.2016
comment
Спасибо, но, несмотря на то, что я прочитал пару статей, мне так и не удалось правильно смонтировать общий файловый ресурс SMB, так что это мой план Б. - person Richard Hauer; 04.11.2016