2021.11.08

'시간을 절약하는 마법' 윈도우 서버에서 파워셸 활용하기

Tim Ferrill | Network World
파워셸(PowerShell)의 Get-WindowsFeature 명령(또는 더 정확히 말해 cmdlet)은 윈도우를 실행하는 서버 또는 워크스테이션에 설치된 서버 역할을 포함한 윈도우 기능 목록을 불러오는, 서버 관리자에게 요긴한 툴이다. 이 명령에 대해 잘 알아두면 활용도를 높이고 파워셸 명령에 대한 폭넓은 지식을 통해 윈도우 서버를 더 효율적으로 관리할 수 있다. 
 
ⓒ Tim Ferrill

기본적으로 Get-WindowsFeature cmdlet의 출력은 설치 상태에 따라 개별 기능의 확인란이 선택 또는 해제된 계층적 보기를 제공한다. 하나의 서버를 신속하게 살펴보면서 어떤 기능을 제공하는지 알아볼 때 유용하지만, 목록에 최대 250개의 역할과 기능이 포함될 수 있으므로 특정 기능을 찾거나 한 번에 여러 서버를 인벤토리화하려는 경우에는 실용성이 떨어진다. 
 
ⓒ Tim Ferrill

다행히 Get-WindowsFeature는 특정 기능 집합에 손쉽게 초점을 맞출 방법을 제공한다. 이 cmdlet 바로 뒤에 입력하는 모든 텍스트(파워셸 용어로는 매개변수)는 기능 이름을 검색하는 데 사용되며, 역할과 기능 목록을 필터링한다. 

예를 들어 Get-WindowsFeature Hyper-V는 목록에서 하이퍼-V 서버 역할을 반환하고, 역할이 설치되어 있는지 또는 설치가 가능한지를 알려준다. 모든 하이퍼-V 관련 기능을 찾고 싶다면 Get-WindowsFeature Hyper-V*와 같이 별표를 붙여 와일드카드 검색을 하면 된다. 
 

원격 서버 및 오프라인 VM 인벤토리화 

GetWindowsFeature의 용도를 대략적으로 보려면 Get-Help에서 GetWindowsFeature를 첫 번째 매개변수로 사용하면 된다. 출력에서 GetWindowsFeature가 수행하는 작업, 사용 구문, 사용 가능한 매개변수를 볼 수 있다. 다음과 같이 -Examples 스위치를 추가할 수도 있다. 
 
Get-Help Get-WindowsFeature -Examples 

그러면 아래와 같이 필요한 매개변수와 구문이 완성된 형태로 몇 가지 샘플 사용 사례가 출력된다. 여기서 원하는 대로 매개변수를 복사, 붙여넣거나 편집하면 된다(스위치는 추가 입력이 필요 없는 매개변수다).
 
ⓒ Tim Ferrill

출력 결과를 보면 Get-WindowsFeature 기능에 대한 두 가지 중요한 점을 알 수 있다. 첫 번째는 파워셸에서 광범위하게 사용되며 파워셸 창을 연 컴퓨터가 아닌 원격 컴퓨터를 대상으로 명령을 실행하는 -Computername 매개변수다. 많은 cmdlet에서 이 방법을 사용해 여러 컴퓨터를 지정할 수 있지만 Get-WindowsFeature의 경우 <String> 형식으로 표시되는 -Computername 매개변수에서 볼 수 있듯이 하나만 지원한다. 

참고로, Get-Process cmdlet에 대한 Get-Help 출력에는 문자열 목록/배열 입력을 의미하는 <string[ ]>으로 표시될 수 있다. 이 제한을 피해 가는 방법은 아래에서 살펴본다. Hyper-V를 Get-WindowsFeature 매개변수로 사용하는 앞의 예제에 이를 적용해서, 원격 서버에 하이퍼-V 기능이 설치되어 있는지 여부를 확인하려면 다음을 실행하면 된다.
 
Get-WindowsFeature Hyper-V -ComputerName RemoteServer01 

결과는 금방 나온다. 단, 여기에는 자격 증명이 관여하므로 원격 서버에 대한 적절한 권한이 있는 사용자로 파워셸을 실행해야 한다. 또는 -Credential 매개변수를 전달해 같은 결과를 얻을 수도 있다. 일반적으로는 다음과 같이 새 자격 증명을 입력하라는 메시지를 표시하고 이를 변수(값 저장을 위한 메모리 단위)에 저장한다. 그런 다음 -Credential $cred를 사용해서 저장된 자격 증명을 cmdlet에 전달한다.
 
$cred = Get-Credential

Get-Help에서 얻을 수 있는 Get-WindowsFeature에 관한 두 번째 중요한 점은 -Vhd 매개변수로 가상 머신(VM) 하드 드라이브(구체적으로 하이퍼-V에 사용되는 VHD 또는 VHDX 파일)를 온라인으로 설정하지 않고도 직접 평가할 수 있다는 것이다. 모두가 사용하는 보편적인 기능은 아니지만 빠른 VM 배포를 위해 템플릿으로 사용되는 VHD 파일 라이브러리가 있거나 특정 상황에서만 가동하는 VM이 있는 경우 상당히 유용할 수 있다. 
 

Get-WindowsFeature에서 더 자세한 정보 얻기 

Get-WindowsFeature를 실행하면 결과는 표시 이름, 이름, 설치 상태의 3열 형식으로 표시된다. 서버 구성을 확인하는 출발점으로는 충분하지만, 적절한 cmdlet을 사용하면 표면 아래에 숨겨진 더 자세한 정보를 얻을 수 있다. 위의 하이퍼-V 예제를 다시 사용해, 아래 Select-Object cmdlet으로 출력이 어떻게 확장되는지 확인해 보자. 
 
ⓒ Tim Ferrill

“Name”은 역할 또는 기능의 짧은 이름이며 “DisplayName”은 읽기 편한 이름이다. 여기서는 두 가지가 똑같이 Hyper-V다. Installed 및 InstallState 필드는 비슷하지만 몇 가지 중요한 차이점이 있다. Installed는 부울 필드이며(True 또는 False) 필터링을 쉽게 해준다. 예를 들어 한 줄로 된 다음의 간단한 명령을 보자. 
 
Get-WindowsFeature | Where-Object Installed 

이 명령은 서버에 설치된 역할과 기능 목록만 출력한다. 

InstallState의 가능한 값은 Installed, Available, Removed 등 3가지다. 이 중에서 중요한 점은 Available과 Removed 간의 차이다. 두 가지 모두 기능이 현재 설치되어 있지 않음을 나타내지만 Available은 기능을 시스템에서 직접 설치할 수 있음을 의미하고 Removed는 설치 파일도 시스템에서 제거되었기 때문에 기능을 설치하려면 미디어에서 설치해야 한다.

그 뒤의 일련의 필드는 역할과 기능이 상호 어떻게 관련되는지를 보여준다. DependsOn 필드는 필요한 다른 기능을 나타낸다. Parent 및 SubFeatures 필드는 기능 간의 관계를 나타내며 설치 중인 기능에 대해 바로 상위이거나 선택적인 하위 구성요소인 기능을 보여준다. 

모든 역할이나 모든 기능에 윈도우 서비스가 있는 것은 아니지만 일부 서버 역할에는 기능을 수행하는 데 이용되는 여러 서비스가 있다. Get-WindowsFeature는 이러한 서비스를 “System Service” 필드에 나열하므로 어떤 서비스가 역할 기반인지를 살펴본 다음 상태를 확인해서 적절히 실행되고 있는지를 파악할 수 있다. 
 

개별 쿼리를 줄이기 위한 Invoke-Command 

파워셸을 사용해 일련의 시스템을 대상으로 대량 작업을 수행할 때는 시스템마다 복수의 작업 또는 cmdlet을 실행해야 하는 경우가 많다. 마이크로소프트에서 이를 위한 몇 가지 방법을 제공하지만 여기서는 Invoke-Command cmdlet만 살펴보자. Invoke-Command는 2개의 주 매개변수를 사용한다. 하나는 -Computername(두 개 이상의 값을 받음), 다른 하나는 원격 시스템을 대상으로 실행할 명령 집합을 정의할 수 있게 해주는 -ScriptBlock이다. 파워셸은 명명과 구문에서 매우 일관적이므로 여러 컴퓨터에서 역할과 기능을 쿼리하는 데 사용되는 코드는 다음과 같이 간단하다. 
 
$features = Invoke-Command -ComputerName ‘srv01’, ‘srv02’, ‘srv03’ -ScriptBlock { Get-WindowsFeature }

여기서 Get-WindowsFeature cmdlet의 전체 출력이 $features 변수에 할당된다. 따라서 원격 컴퓨터를 대상으로 cmdlet을 재실행할 필요 없이(매번 재실행한다면 짧은 시간 동안 메모리에 데이터를 유지하는 경우에 비해 성능에 미치는 영향이 클 것이다) 반환된 정보를 여러 방식으로 분석할 수 있다.  $features 변수에 포함된 데이터를 사용하는 한 가지 방법은 설치된 기능 목록을 만드는 것이다. 
 
$features | Where-Object Installed | Format-Table Name, DisplayName, InstallState, PSComputerName

$features 변수로 시작해서 Installed의 값이 참인 인스턴스로 결과를 필터링한 다음 지정된 열을 표시하는 표 형식으로 출력한다. 또 다른 예는 설치된 서버 역할을 CSV 파일로 출력하는 것이다. 이렇게 하면 이메일이나 파일 저장소를 통해 공유하거나 엑셀을 통해 분석할 수 있다. 마찬가지로 $features 변수로 시작하고, 설치된 서버 역할(기능이 아님)로 제한한 다음 CSV 파일로 내보낸다. 다음과 같은 파워셸 한 줄이면 된다. 
 
$features | Where-Object {$_.Installed -and $_.FeatureType -eq ‘Role’} | Export-CSV ‘C:\Users\Administrator\Documents\ServerRoles.csv’
 

파워셸을 익히는 데 시간을 투자하면 더 많은 시간 절약 가능 

파워셸 스크립팅 언어는 의심할 여지 없이 지난 10여 년 동안 데이터센터와 과도한 업무에 시달리는 시스템 관리자에게 큰 도움이 된 기술 중 하나다. 폭넓은 마이크로소프트 운영체제 및 클라우드 플랫폼에 걸쳐 활용 가능한 보편성과 견고함을 갖추었을 뿐만 아니라 일관적, 응집적인 구조, 그리고 모범 사례와 정립된 사용 사례를 이끄는 활발한 커뮤니티도 갖고 있다. 

많은 시스템 관리자는 일상적인 작업에서 시간을 절약할 수 있다는 이유로 언젠가 배워야 할 기술 목록에 파워셸을 넣어둔다. 그러나 여기서 딜레마가 발생할 수 있다. 시간을 절약하기 위해서는 먼저 배우기 위해 시간을 투자해야 한다. 이번에 살펴본 내용이 파워셸을 더 배우는 계기가 되기를 기대한다. editor@itworld.co.kr


2021.11.08

'시간을 절약하는 마법' 윈도우 서버에서 파워셸 활용하기

Tim Ferrill | Network World
파워셸(PowerShell)의 Get-WindowsFeature 명령(또는 더 정확히 말해 cmdlet)은 윈도우를 실행하는 서버 또는 워크스테이션에 설치된 서버 역할을 포함한 윈도우 기능 목록을 불러오는, 서버 관리자에게 요긴한 툴이다. 이 명령에 대해 잘 알아두면 활용도를 높이고 파워셸 명령에 대한 폭넓은 지식을 통해 윈도우 서버를 더 효율적으로 관리할 수 있다. 
 
ⓒ Tim Ferrill

기본적으로 Get-WindowsFeature cmdlet의 출력은 설치 상태에 따라 개별 기능의 확인란이 선택 또는 해제된 계층적 보기를 제공한다. 하나의 서버를 신속하게 살펴보면서 어떤 기능을 제공하는지 알아볼 때 유용하지만, 목록에 최대 250개의 역할과 기능이 포함될 수 있으므로 특정 기능을 찾거나 한 번에 여러 서버를 인벤토리화하려는 경우에는 실용성이 떨어진다. 
 
ⓒ Tim Ferrill

다행히 Get-WindowsFeature는 특정 기능 집합에 손쉽게 초점을 맞출 방법을 제공한다. 이 cmdlet 바로 뒤에 입력하는 모든 텍스트(파워셸 용어로는 매개변수)는 기능 이름을 검색하는 데 사용되며, 역할과 기능 목록을 필터링한다. 

예를 들어 Get-WindowsFeature Hyper-V는 목록에서 하이퍼-V 서버 역할을 반환하고, 역할이 설치되어 있는지 또는 설치가 가능한지를 알려준다. 모든 하이퍼-V 관련 기능을 찾고 싶다면 Get-WindowsFeature Hyper-V*와 같이 별표를 붙여 와일드카드 검색을 하면 된다. 
 

원격 서버 및 오프라인 VM 인벤토리화 

GetWindowsFeature의 용도를 대략적으로 보려면 Get-Help에서 GetWindowsFeature를 첫 번째 매개변수로 사용하면 된다. 출력에서 GetWindowsFeature가 수행하는 작업, 사용 구문, 사용 가능한 매개변수를 볼 수 있다. 다음과 같이 -Examples 스위치를 추가할 수도 있다. 
 
Get-Help Get-WindowsFeature -Examples 

그러면 아래와 같이 필요한 매개변수와 구문이 완성된 형태로 몇 가지 샘플 사용 사례가 출력된다. 여기서 원하는 대로 매개변수를 복사, 붙여넣거나 편집하면 된다(스위치는 추가 입력이 필요 없는 매개변수다).
 
ⓒ Tim Ferrill

출력 결과를 보면 Get-WindowsFeature 기능에 대한 두 가지 중요한 점을 알 수 있다. 첫 번째는 파워셸에서 광범위하게 사용되며 파워셸 창을 연 컴퓨터가 아닌 원격 컴퓨터를 대상으로 명령을 실행하는 -Computername 매개변수다. 많은 cmdlet에서 이 방법을 사용해 여러 컴퓨터를 지정할 수 있지만 Get-WindowsFeature의 경우 <String> 형식으로 표시되는 -Computername 매개변수에서 볼 수 있듯이 하나만 지원한다. 

참고로, Get-Process cmdlet에 대한 Get-Help 출력에는 문자열 목록/배열 입력을 의미하는 <string[ ]>으로 표시될 수 있다. 이 제한을 피해 가는 방법은 아래에서 살펴본다. Hyper-V를 Get-WindowsFeature 매개변수로 사용하는 앞의 예제에 이를 적용해서, 원격 서버에 하이퍼-V 기능이 설치되어 있는지 여부를 확인하려면 다음을 실행하면 된다.
 
Get-WindowsFeature Hyper-V -ComputerName RemoteServer01 

결과는 금방 나온다. 단, 여기에는 자격 증명이 관여하므로 원격 서버에 대한 적절한 권한이 있는 사용자로 파워셸을 실행해야 한다. 또는 -Credential 매개변수를 전달해 같은 결과를 얻을 수도 있다. 일반적으로는 다음과 같이 새 자격 증명을 입력하라는 메시지를 표시하고 이를 변수(값 저장을 위한 메모리 단위)에 저장한다. 그런 다음 -Credential $cred를 사용해서 저장된 자격 증명을 cmdlet에 전달한다.
 
$cred = Get-Credential

Get-Help에서 얻을 수 있는 Get-WindowsFeature에 관한 두 번째 중요한 점은 -Vhd 매개변수로 가상 머신(VM) 하드 드라이브(구체적으로 하이퍼-V에 사용되는 VHD 또는 VHDX 파일)를 온라인으로 설정하지 않고도 직접 평가할 수 있다는 것이다. 모두가 사용하는 보편적인 기능은 아니지만 빠른 VM 배포를 위해 템플릿으로 사용되는 VHD 파일 라이브러리가 있거나 특정 상황에서만 가동하는 VM이 있는 경우 상당히 유용할 수 있다. 
 

Get-WindowsFeature에서 더 자세한 정보 얻기 

Get-WindowsFeature를 실행하면 결과는 표시 이름, 이름, 설치 상태의 3열 형식으로 표시된다. 서버 구성을 확인하는 출발점으로는 충분하지만, 적절한 cmdlet을 사용하면 표면 아래에 숨겨진 더 자세한 정보를 얻을 수 있다. 위의 하이퍼-V 예제를 다시 사용해, 아래 Select-Object cmdlet으로 출력이 어떻게 확장되는지 확인해 보자. 
 
ⓒ Tim Ferrill

“Name”은 역할 또는 기능의 짧은 이름이며 “DisplayName”은 읽기 편한 이름이다. 여기서는 두 가지가 똑같이 Hyper-V다. Installed 및 InstallState 필드는 비슷하지만 몇 가지 중요한 차이점이 있다. Installed는 부울 필드이며(True 또는 False) 필터링을 쉽게 해준다. 예를 들어 한 줄로 된 다음의 간단한 명령을 보자. 
 
Get-WindowsFeature | Where-Object Installed 

이 명령은 서버에 설치된 역할과 기능 목록만 출력한다. 

InstallState의 가능한 값은 Installed, Available, Removed 등 3가지다. 이 중에서 중요한 점은 Available과 Removed 간의 차이다. 두 가지 모두 기능이 현재 설치되어 있지 않음을 나타내지만 Available은 기능을 시스템에서 직접 설치할 수 있음을 의미하고 Removed는 설치 파일도 시스템에서 제거되었기 때문에 기능을 설치하려면 미디어에서 설치해야 한다.

그 뒤의 일련의 필드는 역할과 기능이 상호 어떻게 관련되는지를 보여준다. DependsOn 필드는 필요한 다른 기능을 나타낸다. Parent 및 SubFeatures 필드는 기능 간의 관계를 나타내며 설치 중인 기능에 대해 바로 상위이거나 선택적인 하위 구성요소인 기능을 보여준다. 

모든 역할이나 모든 기능에 윈도우 서비스가 있는 것은 아니지만 일부 서버 역할에는 기능을 수행하는 데 이용되는 여러 서비스가 있다. Get-WindowsFeature는 이러한 서비스를 “System Service” 필드에 나열하므로 어떤 서비스가 역할 기반인지를 살펴본 다음 상태를 확인해서 적절히 실행되고 있는지를 파악할 수 있다. 
 

개별 쿼리를 줄이기 위한 Invoke-Command 

파워셸을 사용해 일련의 시스템을 대상으로 대량 작업을 수행할 때는 시스템마다 복수의 작업 또는 cmdlet을 실행해야 하는 경우가 많다. 마이크로소프트에서 이를 위한 몇 가지 방법을 제공하지만 여기서는 Invoke-Command cmdlet만 살펴보자. Invoke-Command는 2개의 주 매개변수를 사용한다. 하나는 -Computername(두 개 이상의 값을 받음), 다른 하나는 원격 시스템을 대상으로 실행할 명령 집합을 정의할 수 있게 해주는 -ScriptBlock이다. 파워셸은 명명과 구문에서 매우 일관적이므로 여러 컴퓨터에서 역할과 기능을 쿼리하는 데 사용되는 코드는 다음과 같이 간단하다. 
 
$features = Invoke-Command -ComputerName ‘srv01’, ‘srv02’, ‘srv03’ -ScriptBlock { Get-WindowsFeature }

여기서 Get-WindowsFeature cmdlet의 전체 출력이 $features 변수에 할당된다. 따라서 원격 컴퓨터를 대상으로 cmdlet을 재실행할 필요 없이(매번 재실행한다면 짧은 시간 동안 메모리에 데이터를 유지하는 경우에 비해 성능에 미치는 영향이 클 것이다) 반환된 정보를 여러 방식으로 분석할 수 있다.  $features 변수에 포함된 데이터를 사용하는 한 가지 방법은 설치된 기능 목록을 만드는 것이다. 
 
$features | Where-Object Installed | Format-Table Name, DisplayName, InstallState, PSComputerName

$features 변수로 시작해서 Installed의 값이 참인 인스턴스로 결과를 필터링한 다음 지정된 열을 표시하는 표 형식으로 출력한다. 또 다른 예는 설치된 서버 역할을 CSV 파일로 출력하는 것이다. 이렇게 하면 이메일이나 파일 저장소를 통해 공유하거나 엑셀을 통해 분석할 수 있다. 마찬가지로 $features 변수로 시작하고, 설치된 서버 역할(기능이 아님)로 제한한 다음 CSV 파일로 내보낸다. 다음과 같은 파워셸 한 줄이면 된다. 
 
$features | Where-Object {$_.Installed -and $_.FeatureType -eq ‘Role’} | Export-CSV ‘C:\Users\Administrator\Documents\ServerRoles.csv’
 

파워셸을 익히는 데 시간을 투자하면 더 많은 시간 절약 가능 

파워셸 스크립팅 언어는 의심할 여지 없이 지난 10여 년 동안 데이터센터와 과도한 업무에 시달리는 시스템 관리자에게 큰 도움이 된 기술 중 하나다. 폭넓은 마이크로소프트 운영체제 및 클라우드 플랫폼에 걸쳐 활용 가능한 보편성과 견고함을 갖추었을 뿐만 아니라 일관적, 응집적인 구조, 그리고 모범 사례와 정립된 사용 사례를 이끄는 활발한 커뮤니티도 갖고 있다. 

많은 시스템 관리자는 일상적인 작업에서 시간을 절약할 수 있다는 이유로 언젠가 배워야 할 기술 목록에 파워셸을 넣어둔다. 그러나 여기서 딜레마가 발생할 수 있다. 시간을 절약하기 위해서는 먼저 배우기 위해 시간을 투자해야 한다. 이번에 살펴본 내용이 파워셸을 더 배우는 계기가 되기를 기대한다. editor@itworld.co.kr


X