Рубрики
Uncategorized

Начало работы с Azure PowerShell Docker Image и Действия GitHub

Возможно, вы заметили, у нас теперь есть официальный документ Docker для модуля Azure PowerShell эти изображения … Теги с лазурным, PowerShell, Docker, Devops.

Возможно, вы заметили, теперь у нас есть официальный документ Docker для Модуль Azure PowerShell Эти изображения обновляются почти каждый день, а последнее изображение содержит последнюю версию модуля PowerShell PowerShell.

Базовое изображение представляет собой PowerShell: Ubuntu-18-04 (он также существует с Centos 7 и Debian 9), поэтому он будет работать только на платформе Linux. Установлена версия PowerShell 6.2.4 или 7,0 в зависимости от тега изображения. Вы можете использовать его на Linux или с Docker Desktop на Windows 10. Последнее изображение соответствует последней версии модуля Azure PowerShell (в настоящее время 3.6.1). Но вы можете использовать теги для выбора других версий (3,4,0 и 3,5,0 тегов). Использовать это:

docker run -it mcr.microsoft.com/azure-powershell:3.4.0-ubuntu-18.04

Вы можете выполнить скрипт с локальной машины. Предположим, у вас есть каталог сценариев в вашей домашней папке, вы можете добавить его как громкость и установить его на/SRC и

docker run -it -v ~/scripts:/src mcr.microsoft.com/azure-powershell pwsh -file /src/test.ps1

Можно использовать сохраненный контекст от хоста в контейнере в контейнере. Но во-первых, контекст Azure должен быть сгенерирован на хост-компьютере.

connect-azaccount 
save-azcontext

Эта команда создаст несколько файлов в каталоге .azure в вашей домашней папке. Вы можете использовать эти файлы в контейнере, установив громкость.

docker run -it -v ~/.Azure/AzureRmContext.json:/root/.Azure/AzureRmContext.json -v ~/.Azure/TokenCache.dat:/root/.Azure/TokenCache.dat -v ~/scripts:/src mcr.microsoft.com/azure-powershell pwsh -file /src/GetRgList.ps1

Где getrglist.ps1 содержит

Get-AzResourceGroup | Select-Object ResourceGroupName,location

Хотя он может быть полезен в некоторых обстоятельствах, таких как тестирование сценария в другой среде или обнаружение изменения изменений в обновлении модуля, одно из лучших случаев использования является использование его в цепочке CI/CD.

Действие GitHub позволяет использовать документы Docker для создания пользовательских задач в рабочем процессе. Чтобы создать рабочий процесс из изображения Azure PowerShell, вам необходимо создать два каталога в вашем репозитории GitHUB, PSAZ-361 и PSAZ-330 (для двух версий модуля Azure PowerShell). В каждой папке нам нужно добавить;

  • DockerFile для настройки контейнера
  • Файл yaml, action.yml, чтобы описать, как использовать изображение в рабочем процессе
  • Скрипт PowerShell для выполнения ваших пользовательских действий.

DockerFile для PZAZ-361

FROM mcr.microsoft.com/azure-powershell:3.6.1-ubuntu-18.04

ENV PSModulePath /usr/local/share/powershell/Modules:/opt/microsoft/powershell/7/Modules:/root/.local/share/powershell/Modules

RUN pwsh -c install-module -name pester -force

ADD entrypoint.ps1 /entrypoint.ps1

ENTRYPOINT ["pwsh", "/entrypoint.ps1"]

Для PZAZ-330 вам нужно использовать изображение 3.4.0

FROM mcr.microsoft.com/azure-powershell:3.4.0-ubuntu-18.04

ENV PSModulePath /usr/local/share/powershell/Modules:/opt/microsoft/powershell/7/Modules:/root/.local/share/powershell/Modules

RUN pwsh -c install-module -name pester -force

ADD entrypoint.ps1 /entrypoint.ps1

ENTRYPOINT ["pwsh", "/entrypoint.ps1"]

Вам необходимо изменить переменную среды PSModulePath, поскольку модуль Azure PowerShell расположен в/root/.local/share/Powershell, но экземпляр работает под контекстом GitHub, а путь по умолчанию/github/home/вместо root.

Если вы не измените путь модуля, модуль Azure PowerShell не будет загружаться во время рабочего процесса GitHub. Если вы хотите использовать его позже, вам нужно установить PESTER THEETO. Теперь, когда у нас есть наш образ, нам нужно подумать о том, как подключиться к Azure из экземпляра — это действие GitHub. Мы не можем использовать стандартную учетную запись, поскольку она может иметь некоторые ограничения, такие как MFA, что предотвратит его подключение. Скорее, вам нужен директор услуг. Существует два варианта создания принципала службы для действий GitHub, используя сервисный главный секрет или использование сертификата. Сервисный главный секрет самый простой способ.

$ServicePrincipal = New-AzADServicePrincipal -DisplayName "GithubAction-demo" -SkipAssignment 
We can now assign a role to our application 
New-AzRoleAssignment -RoleDefinitionName Reader -ServicePrincipalName $ServicePrincipal.ApplicationId

Мы должны извлечь основной секрет сервиса, чтобы использовать его позже.

$SecureStringBinary = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($servicePrincipal.Secret)
[System.Runtime.InteropServices.Marshal]::PtrToStringAuto($SecureStringBinary)

Но мы не можем использовать пароль и приложение непосредственно в скрипт PowerShell. Это не будет безопасно. Действие GitHub поддерживает использование секретов в ваших рабочих процессах. Откройте одну из ваших репозиториев и перейдите к настройкам, а затем на секреты. Вы можете добавить пароли, нажав на добавление нового секрета. Для соединения с руководителем службы необходимо создать 3 секрета, один для APPID, один для идентификатора арендатора, а другой для службы основного пароля, AppID, TENANTID и ServicePrinciPalsecret Теперь нам нужно пройти эти три элемента к экземпляру. Каждый рабочий процесс должен начинаться с этих параметров.

Файл Action Metadata, ACTE.YAML, определить, как должен быть реализован рабочий процесс. Он определяет, что ожидается в качестве ввода, то, что будет выходом и какое действие для выполнения, сценарий enterPoint.ps1.

name: 'AzurePowerShellAction'
author: 'omiossec'
description: 'Perform Pester Tests'
branding:
  icon: 'cloud'
  color: 'blue'
inputs:
  directory:
    description: 'Directory to test'
    default: "."
    required: false
  appID:
    description: 'The Service Principal Application ID'
    required: true
  spSecret:
    description: 'The Service Princtipal Secret'
    required: true
  tenantID:
    description: 'The Tenant ID'
    required: true
runs:
  using: 'docker'
  image: 'Dockerfile'
  args:
    - ${{ inputs.directory }}
    - ${{ inputs.appID }}
    - ${{ inputs.spSecret }}
    - ${{ inputs.tenantID }}

Сценарий ententpoint.ps1 будет сердцем действия. Сценарий позволяет вам определить любые действия, которые вы хотите; Разверните шаблон, обновите веб-приложение, … или просто протестируйте скрипт PowerShell или модуль против нескольких версий модуля Azure PowerShell в Linux. Первая проблема для решения — это то, как подключиться к Azure. Мы добавили секреты в Github для хранения принципала службы AppID и секрет наряду с идентификатором арендатора. В файле Action.yaml мы определили эти секреты в качестве входных данных и как аргументы для образа докера. Другими словами, для запуска рабочего процесса вам необходимо предоставить AppID, главный секрет сервиса и идентификатор арендатора. Эти значения, затем, передаются в экземпляр контейнера в качестве переменных среды.

Чтобы получить доступ к этим значениям от PowerShell, вам просто нужно использовать ввод формы до названия значения, AppID становится вводом_appid. В скрипте PowerShell вам необходимо использовать $ env: input_argname для обработки данных. Все переменные должны быть заглавными. Для подключения к Azure с руководителем службы вам нужно будет создать PSCredential объект. Существует две меры, преобразуйте принципиальную тайну простого текстового сервиса в безопасную строку и создать PSCredential Object.

$SpSecret = ConvertTo-SecureString  $env:INPUT_SPSECRET -AsPlainText -Force

$SpCredential = New-Object System.Management.Automation.PSCredential $env:INPUT_APPID,$SpSecret

Теперь вы можете подключиться к Azure

Connect-AzAccount -Credential $SpCredential -Tenant $ENV:INPUT_TENANTID -ServicePrincipal

Полный скрипт

import-module AZ
$SpSecret = ConvertTo-SecureString  $env:INPUT_SPSECRET -AsPlainText -Force
$SpCredential = New-Object System.Management.Automation.PSCredential $env:INPUT_APPID,$SpSecret

Connect-AzAccount -Credential $SpCredential -Tenant $ENV:INPUT_TENANTID -ServicePrincipal

$TestsDir = join-path -Path $Env:INPUT_DIRECTORY -ChildPath "tests"
Push-Location $TestsDir
$PesterResult = invoke-pester -PassThru 

if ($PesterResult.FailedCount) {
    write-output "Fail"
    throw "Unit testing not passing"
} else {
    Write-Output "Success"
}

Скрипт подключается к Azure и изменяет местоположение по умолчанию для тестирования папки. PowerShell Testying Texting Testying Colving с коммутатором Passthru сбрать данные испытаний. Если один тест не удается, будет определен ShifeCount, и он будет бросать ошибку, а рабочий процесс GitHub потерпит неудачу. Технология модуля содержит только две функции, один для тестирования, если есть подключение к подписке Azure и другой для сбора данных приложения функции.

Function Test-MyConnection 
{
    try {
        $AzContext = get-azContext 
        if ($null -eq $AzContext) {
            return $false
        }
        else {
            return $true
        }
    }
    catch [System.Management.Automation.CommandNotFoundException] {
        write-error "No AZURE PowerShell module"
        return $false
    }
    catch {
        Write-Error -Message " Exception Type: $($_.Exception.GetType().FullName) $($_.Exception.Message)"
        return $false
    }
}

Function Get-MyFunctionsApp {
    [OutputType([pscustomobject])]
    [CmdletBinding()]
    param(
        [parameter(Mandatory = $true)]
        [string]
        $FunctionResourceGroup,
        [parameter(Mandatory = $true)]
        [string]
        $FunctionAppName
    )
    if (Test-MyConnection)  {
        try {
            $FunctionAppConfig = Get-AzWebApp -ResourceGroupName $FunctionResourceGroup -Name $FunctionAppName 
            $FunctionStorageConfigString = ($FunctionAppConfig.SiteConfig.AppSettings | where-object name -eq "AzureWebJobsStorage").Value 

            return [pscustomobject]@{
                FunctionAppName                 = $FunctionAppName
                FunctionAppLocation             = $FunctionAppConfig.Location
                FunctionHostName                = $FunctionAppConfig.HostNames[0]
           }
        }
        catch {
            Write-Error -Message " Exception Type: $($_.Exception.GetType().FullName) $($_.Exception.Message)"
        }
    }
    else {
        throw "Not connected to Azure, use Login-AzAccount first"
    }
}

Испытательные сценарии Petter.

$ModuleName = "myAzFuncModule"
$ModuleManifestPath =  "./src/module/myAzFuncModule.psd1"
Get-Module -Name $ModuleName | remove-module

$ModuleInformation = Import-module -Name $ModuleManifestPath -PassThru
Describe "$ModuleName Testing"{
    InModuleScope $ModuleName {
        Context "$($ModuleName) Cmdlet testing" {
            It "Test-MyConnection Should return true" {
                Test-MyConnection | Should -Be $true
            }
        }
    }
}

Загрузит модуль и выполнить тест на первую функцию Test-MyConnection. Если функция возвращает true, если подключение открывается на работе enterpoint.ps1, тестовый проход.

Одни эти файлы не запускают действие GitHub. Вам нужно создать рабочий процесс. Для этого вам нужно создать папку. Гитуб в корне репозитория. Внутри создайте папку с именем рабочих процессов. Любые файлы yaml в этой папке запускают действие GitHub. Вам нужны два теста по одному для версии 3.6.1, а другая форма 3.3 версия. Для выполнения двух тестов создайте новый файл YAML под названием Dockertest.yaml.

name: docker-wks

on: [push]

jobs:
  test:
    name: Test Job
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1

      - name: PesterTest-361
        uses: ./psaz-361
        with:
          appID: ${{ secrets.APPID }}
          spSecret: ${{ secrets.SERVICEPRINCIPALSECRET }}
          tenantID: ${{ secrets.TENNATID }}

      - name: PesterTest-33
        uses: ./psaz-330
        with:
          appID: ${{ secrets.APPID }}
          spSecret: ${{ secrets.SERVICEPRINCIPALSECRET }}
          tenantID: ${{ secrets.TENNATID }}

Имя в верхней части файла — это имя рабочего процесса. Пункт на Github, когда начать рабочий процесс. Какое событие может вызвать действие? Это может быть толкание, запрос на тягу, событие веб -ook, развертывание или график и многое другое. Здесь у нас есть только толкание. Это потому, что нам нужно использовать секреты И невозможно использовать секрет с pull_request.

Раздел «Работа» описывает, как работает рабочий процесс, у нас есть имя и параметр прогонов, скажите GitHub ОС для использования. Раздел «Шаги» позволяет определить, как запустить два экземпляра Dockers. Во-первых, вам нужно использовать оформление заказа, чтобы получить репозиторий внутри рабочего пространства. Затем вы можете описать, как установить документы Docker.

Для каждого экземпляра вам необходимо дать имя и путь к изображению Docker, который вы хотите использовать. Синтаксис прост, вы можете использовать ./mydockerfolder Если изображение находится в репозитории или Repoowner/DockerActionRepos, если изображение находится снаружи. Затем с ключевым словом данные запрошены в файле Action.yaml.

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

Докер Azure PowerShell может быть полезен для местных тестов, интеграции и действий развертывания. Вы можете использовать его в цепочке CI/CD для развертывания шаблона ARM или выполнять сценарии PowerShell с точной версией модуля Azure PowerShell, который вам нужен.

Оригинал: «https://dev.to/omiossec/getting-started-with-azure-powershell-docker-image-and-github-actions-1g7»