본문 바로가기
IT/Azure

Azure PowerShell Module 재설치

by rapker 2023. 4. 26.
반응형
728x90
ADH 유지관리기간 정보에 접근하기 위해 Az.Maintenance 사용을 하려는데
  • Az.Maintenance 모듈을 import해라,
  • 특정 version 이상의 Az.Accounts가 필요하다
등등 오류가 계속 해결되지 않아 Azure Module을 싸~~악 다 지우고 새로 설치
 
삽질의 결과
모듈이 여러 경로에 설치가 될 수 있는 구조인것 같은데, 이런경우 첫번째 경로부터 모듈을 찾는 것이 문제가 되는 것 같습니다.
Module을 저장하는 경로가 여러 개 있는상황을 가정해보면
  • 첫번 째 경로의 모듈의 버전 1.2
  • 두번 째 경로의 모듈 버전 2.8 (최신이라 가정)
 
위 경우 두번째 경로에 최신버전이 설치되어 있어도 기본으로 로딩되는 버전은 1.2 였습니다.
반응형
 
훗날 유사한 사례가 있을법하여 기록삼아 저장해 두기로 합니다.
아래 기록을 토대로 이것저것 해보면서 Azure Module을 새로 설치하는데 성공했지만
한번에 깔끔하게 진행되진 않았습니다.
 
 
 
function Uninstall-AzModule {
  [CmdletBinding(SupportsShouldProcess)]
  param(
    [ValidateNotNullOrEmpty()]
    [ValidateSet('Az','AzureRM','Azure')]
    [string]$Name = 'Az',
    [Parameter(Mandatory)]
    [string]$Version,
    [switch]$AllowPrerelease
  )
  $Params = @{}
  if ($PSBoundParameters.AllowPrerelease) {
    $Params.AllowPrerelease = $true
  }
  $IsAdmin = ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] 'Administrator')
  if (-not(Get-InstalledModule -Name $Name -RequiredVersion $Version -ErrorAction SilentlyContinue -OutVariable RootModule @Params)) {
    Write-Warning -Message "Uninstall aborted. $Name version $Version not found."
  } elseif (($RootModule.InstalledLocation -notlike "*$env:USERPROFILE*") -and ($IsAdmin -eq $false)) {
    Write-Warning -Message "Uninstall aborted. $Name version $Version exists in a system path. PowerShell must be run elevated as an admin to remove it."
  } elseif ((Get-Process -Name powershell, pwsh -OutVariable Sessions -ErrorAction SilentlyContinue).Count -gt 1) {
    Write-Warning -Message "Uninstall aborted. Please close all other PowerShell sessions before continuing. There are currently $($Sessions.Count) PowerShell sessions running."
  } else {
    Write-Verbose -Message 'Creating list of dependencies...'
    $target = Find-Module -Name $Name -RequiredVersion $Version @Params
    $AllModules = @([pscustomobject]@{
      Name = $Name
      Version = $Version
    })
    $AllModules += foreach ($dependency in $target.Dependencies) {
      switch ($dependency.keys) {
        {$_ -contains 'RequiredVersion'} {$UninstallVersion = $dependency.RequiredVersion; break}
        {$_ -contains 'MinimumVersion'} {$UninstallVersion = $dependency.MinimumVersion; break}
      }
      [pscustomobject]@{
        Name = $dependency.Name
        Version = $UninstallVersion
      }
    }
    [int]$i = 100 / $AllModules.Count
    foreach ($module in $AllModules) {
      Write-Progress -Activity 'Uninstallation in Progress' -Status "$i% Complete:" -PercentComplete $i
      $i++
      if (Get-InstalledModule -Name $module.Name -RequiredVersion $module.Version -ErrorAction SilentlyContinue @Params) {
        Write-Verbose -Message "Uninstalling $($module.Name) version $($module.Version)"
        Remove-Module -FullyQualifiedName @{ModuleName=$module.Name;ModuleVersion=$module.Version} -ErrorAction SilentlyContinue
        try {
          if ($PSCmdlet.ShouldProcess("$($module.Name) version $($module.Version)")) {
            Uninstall-Module -Name $module.Name -RequiredVersion $module.Version -Force -ErrorAction Stop @Params
          }
          $State = 'Uninstalled'
        } Catch {
          $State = 'Manual uninstall required'
          Write-Verbose -Message "$($module.Name) version: $($module.Version) may require manual uninstallation."
        }
      } else {
        $State = 'Not found'
        Write-Verbose -Message "$($module.Name) version: $($module.Version) not found."
      }
      if (-not $PSBoundParameters.WhatIf) {
        [pscustomobject]@{
          ModuleName = $module.Name
          Version = $module.Version
          State = $State
        }
      }
    }
  }
}
<#
# 환경변수 : Module 경로
$Env:PSModulePath

# 모듈 자동 로드
$PSModuleAutoloadingPreference = 'All'

Get-InstalledModule -Name Az -AllVersions
Get-InstalledModule -Name Az.Accounts -AllVersions
Get-InstalledModule -Name Az.Maintenance -AllVersions
Get-Module
Get-Module -List
Uninstall-AzModule -Name Az -Version 5.3.0
Uninstall-AzModule -Name Az -Version 6.3.0
Uninstall-AzModule -Name Az -Version 7.1.0
Uninstall-Module -Name Az.Accounts
Uninstall-Module -Name Az.Maintenance

Install-Module -Name Az -AllowClobber -Scope AllUsers
Install-Module -Name Az.Accounts -AllowClobber -Scope AllUsers

Import-Module Az
Import-Module Az.Maintenance
#>

 

반응형
LIST

'IT > Azure' 카테고리의 다른 글

VMSS Flexible Mode  (0) 2023.04.26
가상화 종류와 차이 조사  (0) 2023.04.26
Storage Account blob 이동 테스트  (0) 2023.04.26
Azure에서 인증서 백업받기  (0) 2023.04.26
DevOps로 ASP.NET 빌드 후 WebApp에 배포  (0) 2023.04.25