앤서블은 SSH를 사용하여 Linux 노드를 관리하는 데 알려져 있지만, 윈도우에서도 잘 작동한다는 사실을 알고 계셨습니까? Windows 원격 관리 (WinRM)을 사용하여 윈도우에서도 앤서블을 효과적으로 모든 윈도우 노드를 관리할 수 있습니다!
윈도우에서의 앤서블을 사용하면 패치 배포, 윈도우 서버 관리, PowerShell 스크립트 실행 등과 같은 작업을 수행할 수 있습니다.
이 자습서에서는 첫 번째 윈도우 노드를 앤서블로 관리하는 방법과 해당 노드에 대한 명령 및 플레이북 실행 방법을 알아볼 것입니다.
전제 조건
자습서를 따라 진행하려면 시작하기 전에 다음이 있는지 확인하십시오:
- 앤서블 컨트롤러 호스트 – 이 자습서에서는 Ubuntu 18.04.5 LTS 머신의 IP 주소가 10.111.4.53인 Ansible v2.9.18을 사용합니다. 윈도우는 제어 노드로 지원되지 않으며 관리되는 노드로만 사용됩니다.
- 앤서블 컨트롤러 호스트에 설치된 Python – 이 자습서에서는 Python v2를 사용하지만 v3도 잘 작동할 것입니다.
- 앤서블 컨트롤러에 설치된 pip 패키지
- A Windows 2012 R2 or greater computer for Ansible to manage – This tutorial will use two Windows Server 2012 R2 Standard machines as remote nodes with IP addresses of 52.242.251.213 and 10.111.4.106.
- A Windows workstation – This tutorial will perform some basic pre-configuration to the node that Windows will manage with Ansible and will require you to sitting at a Windows workstation.
- 관리할 Windows 서버에 PowerShell Remoting이 활성화되어 있어야 함
- A user account in the local Administrators group on the Windows computer. This tutorial will use an account called adminuser.
Windows에서 WinRM 수신 대기열 설정
앤서블(Ansible)이 원격 Windows 노드와 통신할 수 있으려면 먼저 해당 노드에 연결해야 합니다. 이는 Microsoft 프로토콜인 WinRM을 통해 수행됩니다. WinRM은 PowerShell Remoting이 PowerShell 내부에서 원격 명령을 실행하는 데 사용하는 동일한 프로토콜입니다.
현재 상황에서는 Ansible이 관리 프로토콜로 SSH를 지원하지만 실험적인 기능입니다.
앤서블이 Windows 노드와 통신하기 위해 WinRM을 사용하려면 WinRM을 구성해야 합니다. 이를 위해 앤서블은 다양한 WinRM 옵션을 설정하는 PowerShell 스크립트를 제공합니다.
레드햇(Red Hat)이 WinRM을 구성하는 데 제공하는 PowerShell 스크립트는 테스트되었으며 안전하나, 해당 스크립트를 살펴보고 무엇을 수행하는지 전반적으로 이해하는 것이 좋습니다.
첫 번째 작업은 구성 스크립트를 다운로드하고 Windows 노드에서 앤서블을 실행하는 것입니다. 이를 위해 대상 Windows 컴퓨터에서 이미 PowerShell Remoting이 활성화되어 있고 Windows 워크스테이션에 있는 경우:
로컬 Windows 컴퓨터에 ConfigureRemotingForAnsible.ps1 PowerShell 스크립트를 다운로드하세요. 이 튜토리얼에서는 이것이 ~\Downloads에 저장되어 있다고 가정합니다.
Windows 노드를 관리할 Ansible에서 구성 스크립트를 실행합니다. 이 명령은 튜토리얼의 두 데모 머신에서 명령을 실행하고 Windows 노드의 로컬 adminuser 계정 암호를 입력하도록 요청합니다.
기본적으로 구성 스크립트는 기본 HTTP 인증을 위해 WinRM을 구성합니다. 보다 안전한 연결을 사용하려면 Ansible이 HTTPS를 통해 WinRM을 구성하는 방법을 배우세요. Ansible용 HTTPS를 통한 WinRM 구성 방법.
Windows에서 Ansible의 컨트롤러 구성
이제 Windows 노드가 Ansible을 위해 준비되었으므로, 이제 Ansible 컨트롤러를 구성하여 어떻게 통신할지를 표시하세요.
1. 좋아하는 SSH 클라이언트를 사용하여 Ansible 컨트롤러 호스트에 SSH로 연결하세요.
2. pywinrm Python 모듈을 설치하세요. pywinrm Python 모듈은 Windows에서 Ansible이 WinRM 프로토콜을 통해 호스트와 통신하기 위해 필요합니다.
앤서블 인벤토리 파일에서 원격 Windows 노드를 정의합니다. 앤서블 인벤토리는 호스트 이름 또는 IP 주소로 정의된 원격 호스트의 모음입니다. 정의된 후에는 앤서블 인벤토리를 명령어 및 플레이북으로 대상으로 지정할 수 있습니다.
기본 앤서블 인벤토리 파일은 /etc/ansible/hosts 디렉터리에 있습니다.
아래의 샘플 인벤토리 파일은 각 Windows 노드를 포함하는 windows
호스트 그룹을 생성합니다. 이 튜토리얼에서는 호스트 그룹을 사용하여 나중에 여러 대의 Windows 노드를 한꺼번에 대상으로 지정하기 쉽도록 합니다.
4. 그 다음, 앤서블이 인벤토리 파일에서 Windows 호스트에 연결할 때 사용할 필수 변수를 windows:vars
그룹으로 정의합니다.
5. 이제 Ansible win_ping 모듈을 사용하여 단순한 연결 테스트를 실행하십시오. 단계 #3에서 정의된 windows
호스트 그룹 내의 호스트에 대해.
실행되면 아래와 같이 Ansible이 성공적인 핑 시도를 나타내는 SUCCESS 메시지와 녹색 텍스트를 반환하는 것을 볼 수 있습니다.

출력 결과는 Ansible 컨트롤러 호스트가 WinRM을 통해 Windows 원격 호스트와 성공적으로 통신할 수 있음을 확인합니다.
Windows 호스트에 대한 ad-hoc 명령 실행
이 시점에서 Ansible이 Windows 노드를 제어하기 시작할 준비가 되었습니다. 이제 인벤토리 파일의 windows
호스트 그룹에 정의된 Windows 노드에서 ad-hoc 명령을 실행하여 이를 테스트해 봅시다. ad-hoc 명령은 먼저 플레이북을 생성하지 않고 노드에서 간단한 명령을 실행해야 할 때 유용합니다.
이를 위해 여전히 Ansible 컨트롤러 노드에 SSH로 연결된 상태를 가정합니다:
1. 이번에는 -m
을 사용하여 win_feature 모듈을 호출하고, name
및 state
두 개의 인수를 전달합니다. 여기서 name
은 Windows 기능의 이름을 나타내고, state
는 원하는 상태를 나타냅니다.
위의 명령을 실행하면, 모든 것이 순조롭게 진행되면 Ansible은 windows
호스트 그룹의 모든 노드에 연결하고, 각각에 win_feature 명령을 실행하여 Telnet-Client
Windows 기능이 설치되어 있는지 확인하고 없으면 설치합니다.

2. Ansible은 성공을 표시하지만, Windows 노드에 수동으로 PowerShell로 연결하여 Telnet Client Windows 기능이 현재 설치되어 있는지 확인합니다. 로컬 Windows 워크스테이션에서 각 Windows 컴퓨터에 Get-WindowsFeature
PowerShell 명령을 실행하기 위해 Invoke-Command
를 실행합니다.
이 시점에서 원하는 Windows 모듈을 ad-hoc 명령으로 실행할 수 있습니다!
Windows 플레이북을 생성하고 실행하기
당신이 윈도우 관리 노드에서 즉석 명령을 실행하는 기술을 마스터했다면, 다음 작업은 플레이북을 생성하고 실행하는 것입니다. Ansible 플레이북은 명령을 하나의 장소에 결합하고 복잡한 자동화 시나리오를 수행하기 위한 복잡한 로직을 작성할 수 있게 해줍니다.
win_command 모듈을 사용하여 원격 Windows 명령 실행
아직 Ansible 컨트롤러 호스트에 연결되어 있다고 가정합니다:1. 홈 디렉토리 아래에 ansible-windows-demo라는 폴더를 만들고 해당 폴더로 이동하십시오. 이 폴더는 플레이북을 보관할 것입니다.
2. 좋아하는 텍스트 편집기를 열고, ~/ansible-windows-demo 디렉토리에 ansible-windows.yml이라는 파일을 생성하고 저장하십시오.
3. 이제 아래 플레이북을 ansible-windows.yml 파일로 복사하여 하나의 작업을 만드십시오. 이 플레이북은 windows
호스트 그룹 내의 모든 호스트에서 win_command Windows Ansible 모듈을 사용하여 netstat Windows 명령을 실행할 것입니다.
win_command 모듈은 원격 Windows 호스트에서 명령을 실행합니다. 특수 문자, 줄 바꿈, 크다(>) 기호 등과 같은 변수를 포함하는 명령을 허용하지 않습니다.
4. 다음 명령을 실행하여 원격 호스트에서 작업을 실행하는 ansible-windows.yml 플레이북을 호출하십시오.
모두 잘 되었다면, 아래와 같은 출력을 볼 수 있어야 합니다.

cmd.exe 명령(netstat
)을 이용하여 이전 예제에서는 관리되는 Windows
노드에 대한 원격 명령을 실행하는 플레이북을 만들었습니다. 이제 좀 더 나아가서 win_shell 모듈을 사용하여 PowerShell 명령을 실행해 보겠습니다.
win_shell 모듈은 기본적으로 Windows 호스트에서 PowerShell을 실행합니다.
로컬 Windows 워크스테이션에서:
1. 먼저, 로컬 Windows 작업 스테이션에서 좋아하는 텍스트 편집기를 열고 샘플 PowerShell 스크립트를 만들고 다음 코드를 복사하여 one.ps1로 저장합니다. 이 튜토리얼에서는 스크립트를 ~\one.ps1로 저장합니다.
아래 코드는 test2.txt라는 빈 텍스트 파일을 C:\temp 디렉토리에 생성합니다.
2. one.ps1 PowerShell 스크립트를 선호하는 방법을 사용하여 Windows 관리 노드로 복사합니다. 이 튜토리얼에서는 one.ps1 스크립트를 각 Windows 노드의 C:\Temp 폴더로 복사한 것으로 가정합니다.
3. 샘플 PowerShell 스크립트가 Windows 노드에 있으면 Ansible 컨트롤러 호스트에 연결하고 다시 좋아하는 텍스트 편집기를 엽니다. 이번에는 동일한 ~/ansible-windows-demo 디렉토리에 ansible-windows-shell.yml이라는 또 다른 플레이북을 만들고 저장합니다.
4. 다음 플레이북을 ansible-windows-shell.yml 파일에 복사하여 붙여넣습니다. 이 플레이북은 win_shell 모듈을 시연하기 위해 두 개의 작업을 실행합니다. 단계 #2에서 복사한 PowerShell 스크립트를 호출하고 플레이북에 PowerShell 코드를 직접 삽입하여 스크립트가 전혀 필요하지 않음을 시연합니다.
win_shell 모듈에 여러 줄의 PowerShell 코드를 전달하려면
|
파이프 문자를 사용하십시오.
5. 이제 PowerShell에서 실행되는 두 번째 플레이북 ansible-windows-shell.yml을 호출합니다.

6. 필요한 경우 로컬 Windows 워크스테이션에서 플레이북이 기존 스크립트와 플레이북의 PowerShell 코드를 실행했는지 확인하십시오.
Ansible 플레이북이 성공적으로 실행되었다면 PowerShell은 파일이 이제 존재한다는 두 개의 True
문을 반환해야 합니다.
결론
이 튜토리얼에서는 Ansible에서 첫 번째 Windows 관리 노드를 설정하는 방법을 배웠습니다. Ansible은 기존에 Linux 도구로 알려져 있었지만 Windows에도 쉽게 사용할 수 있습니다!
어떤 플레이북과 Windows 모듈을 사용하여 Ansible로 Windows를 관리하시겠습니까?