Windows에서 Ansible 마스터링: 당신의 Go-To 전문가 가이드

앤서블은 SSH를 사용하여 리눅스 노드를 관리하는 것으로 알려져 있지만, 앤서블은 윈도우에서도 아주 잘 작동한다는 사실을 알고 계셨나요? Windows 원격 관리 (WinRM)을 사용하여 앤서블은 윈도우 노드도 효과적으로 관리할 수 있습니다!

윈도우에서 앤서블을 사용하면 패치를 배포하고, 윈도우 서버를 관리하며, PowerShell 스크립트를 실행하는 등의 작업을 수행할 수 있습니다.

이 튜토리얼에서는 첫 번째 윈도우 노드를 앤서블로 관리하도록 설정하고, 해당 노드에 대해 명령 및 플레이북을 실행하는 방법을 알아보겠습니다.

사전 요구 사항

튜토리얼을 따라하기 위해서는 다음 사항을 반드시 준비해야 합니다:

  • 앤서블 컨트롤러 호스트 – 이 튜토리얼에서는 IP 주소가 10.111.4.53인 Ubuntu 18.04.5 LTS 머신에서 앤서블 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.
  • 관리할 윈도우 서버에서 PowerShell Remoting이 활성화되어 있어야 합니다.
  • A user account in the local Administrators group on the Windows computer. This tutorial will use an account called adminuser.

윈도우에서 WinRM 리스너 설정하기

이전에 Ansible이 원격 Windows 노드와 통신할 수 있도록하려면 연결을 설정해야합니다. 이는 Microsoft 프로토콜인 WinRM을 통해 수행됩니다. WinRM은 PowerShell Remoting에서 PowerShell 내에서 원격 명령을 실행하는 데 사용되는 동일한 프로토콜입니다.

현재 기준으로 Ansible은 관리 프로토콜로서 SSH를 지원하고 있지만, 현재는 실험적인 기능입니다.

Ansible이 Windows 노드와 통신하기 위해 WinRM을 사용하려면 WinRM을 구성해야합니다. 이를 위해 Ansible은 여러 WinRM 옵션을 설정하는 PowerShell 스크립트를 제공합니다.

Red Hat이 WinRM을 구성하는 데 제공하는 PowerShell 스크립트는 테스트되었으며 안전하지만, 해당 스크립트를 읽고 수행되는 고수준에서의 내용을 이해하는 것이 좋습니다.

첫 번째 작업은 구성 스크립트를 다운로드하고 Windows 노드에서 Ansible을 실행하는 것입니다. 이를 위해서는 이미 대상 Windows 컴퓨터에서 PowerShell Remoting이 활성화되어 있고 Windows 워크스테이션에서 작업 중이라고 가정합니다.

로컬 Windows 컴퓨터에 ConfigureRemotingForAnsible.ps1 PowerShell 스크립트를 다운로드하세요. 이 튜토리얼에서는 이 스크립트가 ~\Downloads에 저장되어 있다고 가정합니다.

Windows 노드에서 Ansible이 관리할 구성 스크립트를 실행합니다. Invoke-Command 명령을 사용합니다. 아래 명령은 튜토리얼의 두 데모 머신에서 명령을 실행하고 Windows 노드의 로컬 adminuser 계정의 암호를 요청합니다.

Invoke-Command -ComputerName 52.242.251.213, 10.111.4.106 -FilePath '~\Downloads\ConfigureRemotingForAnsible.ps1' -Credential (Get-Credential -UserName adminuser)

기본적으로 구성 스크립트는 기본 HTTP 인증을 위해 WinRM을 구성합니다. Ansible이 더 안전한 연결을 사용하도록 설정하려면 Ansible을 위한 HTTPS로 WinRM 구성 방법을 확인하세요.

Windows에서 Ansible 컨트롤러 구성

이제 Windows 노드가 Ansible을 위해 준비되었으므로, Ansible 컨트롤러를 구성하여 어떻게 통신할지 알려줍시다.

1. 좋아하는 SSH 클라이언트를 사용하여 Ansible 컨트롤러 호스트에 SSH로 연결합니다.

2. pywinrm Python 모듈을 설치합니다. pywinrm Python 모듈은 Windows에서 Ansible이 WinRM 프로토콜을 통해 호스트와 통신하는 데 필요합니다.

pip install pywinrm

Ansible 인벤토리 파일에서 원격 Windows 노드를 정의합니다. Ansible 인벤토리는 호스트 이름 또는 IP 주소로 파일에 정의된 원격 호스트의 모음입니다. 정의된 후에는 명령 및 플레이북을 특정 Ansible 인벤토리에 대상으로 지정할 수 있습니다. 곧 보게 되겠지만,

기본 Ansible 인벤토리 파일은 /etc/ansible/hosts 디렉토리에 위치합니다.

아래 예제 인벤토리 파일은 각 Windows 노드를 포함하는 windows 호스트 그룹을 생성합니다. 여기에서 호스트 그룹을 사용하여 나중에 모든 Windows 노드를 한 번에 대상으로 지정하는 것이 편리합니다.

[windows]
 54.242.251.213
 10.111.4.106

4. 그 다음으로, 인벤토리 파일에서 windows:vars 그룹으로 Windows 호스트에 연결할 때 Ansible이 사용할 몇 가지 필수 변수를 정의합니다.

[windows:vars]
 ansible_user=localadmin ## ansible 통신에 사용할 Windows 사용자 이름
 ansible_password=s3crect ## ansible 통신에 사용할 Windows 암호
 ansible_connection=winrm ## Ansible이 원격 Windows 노드와 수행할 연결 유형
 ansible_winrm_server_cert_validation=ignore ## 인증서 유효성 검사를 무시합니다. 왜냐하면 Ansible과 함께 제공되는 자체 서명된 인증서를 사용할 것이기 때문입니다.

5. 지금은 Ansible win_ping 모듈을 사용하여 단계 #3에서 정의된 windows 호스트 그룹 내의 호스트에 대한 간단한 연결 테스트를 실행하십시오.

# windows는 호스트 그룹입니다.
# -m은 Ansible이 win_ping 모듈을 사용하도록 지시합니다.
 ansible windows -m win_ping

실행한 후에는 아래에서 확인할 수 있듯이 Ansible이 성공적인 핑 시도를 나타내는 SUCCESS 메시지와 녹색 텍스트를 반환합니다.

Successful win_ping connection

출력은 Ansible 컨트롤러 호스트가 WinRM을 통해 Windows 원격 호스트와 성공적으로 통신할 수 있음을 확인합니다.

Windows 호스트에서 ad-hoc 명령 실행

이 시점에서 Ansible이 Windows 노드를 제어하기 시작할 준비가 되었습니다. 이제 인벤토리 파일에서 정의된 windows 호스트 그룹의 Windows 노드에서 ad-hoc 명령을 실행하여 테스트합니다. Ad-hoc 명령은 먼저 플레이북을 생성하지 않고 노드에서 간단한 명령을 실행해야 할 때 훌륭합니다.

우리는 Windows 노드에 Windows 기능을 설치하여 ad-hoc 명령을 따라 해 보겠습니다. 이를 위해서는 여전히 Ansible 컨트롤러 노드에 SSH로 연결되어 있는 것으로 가정합니다.

1. 대신에 이번에는 win_feature 모듈 (-m)을 호출하여 namestate 두 인수 (-a)를 전달하십시오. 이는 Windows 기능의 이름과 원하는 상태를 나타냅니다.

# 여기서 windows는 호스트 그룹입니다
# win_feature는 모듈의 이름입니다
# state=present는 패키지 또는 서비스를 설치하라는 것을 의미합니다
 ansible windows -m win_feature -a "name=Telnet-Client state=present"

위의 명령을 실행하면 모든 것이 잘 되면 Ansible은 windows 호스트 그룹의 모든 노드에 연결하고 각각에서 win_feature 명령을 실행하여 Telnet-Client Windows 기능을 확인하고 없으면 설치해야 합니다.

Ansible Windows Feature

2. Ansible은 성공을 표시하지만 확실하게 하려면 PowerShell을 사용하여 Windows 노드에 수동으로 연결하고 Telnet Client Windows 기능이 이제 설치되었는지 확인하십시오. 로컬 Windows 워크스테이션에서 각 Windows 컴퓨터에서 Get-WindowsFeature PowerShell 명령을 실행하기 위해 Invoke-Command를 실행하십시오.

Invoke-Command -ComputerName 52.242.251.213, 10.111.4.106 -ScriptBlock { Get-WindowsFeature -Name 'Telnet-Service' } -Credential (Get-Credential -UserName adminuser)

이 시점에서 원하는 대로 원하는 Windows 모듈을 ad-hoc 명령으로 실행할 수 있습니다!

Windows에서 Ansible Playbooks 만들기 및 실행

한 번 Windows 관리 노드에서 ad-hoc 명령을 실행하는 기술을 마스터했다면, 다음 작업은 playbooks를 작성하고 실행하는 것입니다. Ansible playbook은 명령을 하나로 결합하고 복잡한 자동화 시나리오를 수행하기 위한 복잡한 논리를 작성할 수 있게 해줍니다.

win_command 모듈을 사용하여 원격 Windows 명령 실행

Ansible 컨트롤러 호스트에 여전히 연결된 상태로 가정합니다:

1. 홈 디렉터리에 ansible-windows-demo라는 이름의 폴더를 만들고 해당 폴더로 이동합니다. 이 폴더는 playbook을 보관합니다.

mkdir ~/ansible-windows-demo 
cd ~/ansible-windows-demo 

2. 좋아하는 텍스트 편집기를 열고 ansible-windows.yml이라는 파일을 ~/ansible-windows-demo 디렉터리에 만들고 저장합니다.

Ansible playbooks는 YAML로 작성됩니다.

3. 이제 아래 playbook을 ansible-windows.yml 파일로 복사하여 단일 task를 만듭니다. 이 playbook은 windows 호스트 그룹 내의 모든 호스트에서 win_command Windows Ansible 모듈을 사용하여 netstat Windows 명령을 실행합니다.

win_command 모듈은 원격 Windows 호스트에서 명령을 실행합니다. 특수 문자, 줄 바꿈, 큰 부등호 등과 같은 변수를 포함하는 명령을 허용하지 않습니다.

---
 - name: Ansible win_command module example  
   hosts: windows # 모듈을 실행할 호스트 그룹
   tasks: 
   -  name: run an executable command on a remote Windows system
      win_command: netstat -e # win_command는 Windows 모듈입니다.

4. ansible-windows.yml 플레이북을 호출하여 다음 명령을 실행하여 원격 호스트에서 작업을 실행합니다.

ansible-playbook ansible-windows.yml

모든 것이 잘 진행되었다면 아래와 같은 출력이 표시됩니다.

Ansible successfully executed the netstat command using win_command module

win_shell 모듈을 사용하여 원격 cmd.exe 명령(netstat)을 실행하는 플레이북을 이전 예제에서 Windows 관리 노드에서 만들었습니다. 이제 조금 더 높은 수준의 PowerShell 명령을 실행해 보겠습니다.

기본적으로 win_shell 모듈은 Windows 호스트에서 PowerShell을 실행합니다.

로컬 Windows 워크스테이션에서:

1. 먼저, 로컬 Windows 워크스테이션에서 좋아하는 텍스트 편집기를 열고 샘플 PowerShell 스크립트를 만들어 아래 코드를 복사하여 one.ps1로 저장하십시오. 이 튜토리얼에서 스크립트는 ~\one.ps1에 저장됩니다.

아래 코드는 C:\temp 디렉토리에 test2.txt라는 빈 텍스트 파일을 생성합니다.

Set-Content -Path C:\temp\test2.txt -Value ''

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 코드를 전달하려면 | 파이프 문자를 사용하십시오.

---
 - name: Ansible win_shell module example 
   remote_user: localadmin # 로컬 Windows 사용자를 연결하는
   hosts: windows # 원격 호스트 그룹
   tasks:
    - name: Single line PowerShell # win_shell 모듈을 사용하여 단일 명령을 실행합니다.
      win_shell: C:\temp\one.ps1
    - name: Run multi-lined shell commands 
      win_shell: |
        $text = ' Iam Author of ATA'
       Set-Content -Path C:\temp\test3.txt -Value $text 

5. 이제 두 번째 playbook ansible-windows-shell.yml을 호출하세요. 이 playbook은 PowerShell을 사용하여 원격 호스트에서 실행됩니다.

ansible-playbook ansible-windows-shell.yml
ansible-playbook ansible-windows-shell.yml

6. 필요한 경우 로컬 Windows 작업 스테이션에서 playbook이 기존 스크립트와 playbook의 PowerShell 코드를 실행했는지 확인합니다.

Invoke-Command -ComputerName 52.242.251.213, 10.111.4.106 -ScriptBlock { Test-Path -Path 'C:\Temp\test3.txt','C:\Temp\test2.txt' } -Credential (Get-Credential -UserName adminuser)

만약 Ansible playbook이 성공적으로 실행되었다면 PowerShell은 이제 파일이 존재한다는 것을 나타내는 두 개의 True 문을 반환해야 합니다.

결론

이 튜토리얼에서는 Ansible에서 첫 번째 Windows 관리 노드를 설정하는 방법을 배웠습니다. Ansible은 전통적으로 Linux 도구로 알려져 왔지만 Windows에도 쉽게 사용할 수 있습니다!

Windows를 Ansible로 관리하기 위해 어떤 playbook과 Windows 모듈을 사용하시겠습니까?

Source:
https://adamtheautomator.com/ansible-on-windows/