Windows서버에 원격으로 작업하기 위해서 WinRM 을 사용한다. WinRM은 SOAP 베이스 프로토콜로 HTTP/HTTPS로 통신하며 최신 Windows 운영체제 (Windows Server 2012부터 default enabled) 에서 사용가능하다.
Ansible은 pywinrm 패키지를 통하 WinRM을 사용하며 따로 설치해 주어야 한다.
또, Ansible의 Windows 서버 인증을 위한 여러가지 방법이 있는데 여기서는 Domain 계정 접속을 위해 Kerberos 인증 방식을 사용하였다.
OptionLocal AccountsActive Directory AccountsCredential DelegationHTTP Encryption
Basic | Yes | No | No | No |
Certificate | Yes | No | No | No |
Kerberos | No | Yes | Yes | Yes |
NTLM | Yes | Yes | No | Yes |
CredSSP | Yes | Yes | Yes | Yes |
Windows Host의 조건
- Desktop OS : Windows 7, 8.1, 10
- Windows Server 2008, 2008R2 이상
- PowerShell 3.0 이상
- .NET4.0 이상 설치
- WinRM listener 가 생성, 활성화 상태어야 함
- Windows Server 2008/Windows 7 에서는 .Net Framework Upgrade 필요 (https://github.com/jborean93/ansible-windows/blob/master/scripts/Upgrade-PowerShell.ps1)
- WinRM Memory Hotfix
- PowerShell 3.0 버전에서 WinRM을 사용하면 사용 가능 메모리 제한이 있다.
- 이 hotfix를 설치하지 않으면 Windows에서 특정 명령어를 실행할 때 실패할 수 있다.
- 아래 핫픽스는 system bootstrapping의 부분으로 설치할 수 있다.
- 참조 (https://github.com/jborean93/ansible-windows/blob/master/scripts/Install-WMF3Hotfix.ps1)
$url = "https://raw.githubusercontent.com/jborean93/ansible-windows/master/scripts/Install-WMF3Hotfix.ps1"
$file = "$env:temp\Install-WMF3Hotfix.ps1"
(New-Object -TypeName System.Net.WebClient).DownloadFile($url, $file)
powershell.exe -ExecutionPolicy ByPass -File $file -Verbose
WinRM 셋팅 확인
- WinRM 을 설정을 통해 Ansible이 접속할 수 있다.
- Ansible이 Windows Host와 통신할 수 있는 두가지 컴포넌트
- Listener
- Service
WinRM Listener
winrm enumerate winrm/config/Listener
- Port : (HTTP Defuault 5985)
- URLPrefix : The URL prefix Default는 wsman/ 변경되면 host var인 ansible_winrm_path가 같은 값으로 수정되어야 한다.
WinRM Service Options
winrm get winrm/config/Service
winrm get winrm/config/Winrs
- Service
- AllowUnencrypted : WinRM이 HTTP를 통해 메세지 암호화 없이 통신하는 것을 허용하는 옵션 (Default false) WinRM 메세지를 디버깅하기 위해서는 true로 수정
- Auth : WinRM 을 위한 인증 옵션
- CbtHardeningLevel : Channel binding token 설정, CBT는 HTTPS에서 NTLM이나 Kerberos로 접속할 경우만 사용. Ansible은 최근 NTLM 인증 방식을 사용하며 Kerberos를 CbtHardeningLeve = Strict로 사용 시 404 dpfjrk qkftodgksek.
- NONE : not verified
- Relaxed : verified but not required
- Strict : verified and required
- Winrs
- MaxShellRunTime : 원격 명령이 실행되는 최대 실행 시간 (밀리세컨)
- MaxMemoryPerShellMB : Shell 당 메모리 할당 최대 크기 (Child Process 포함)
# Winrs\MaxShellRunTime 값 변경하기 예
Set-Item -Path WSMan:\localhost\Shell\MaxShellRunTime -Value 2147483647
Common WinRM Issues
# HTPP out 테스트
winrs -r:http://server:5985/wsman -u:Username -p:Password ipconfig
Windows Remote Management
ANSIBLE이 설치된 서버에서 실행
Ansible pywinrm 설치
WinRM으로 Windows 서버와 통신하기 위해서는 pywinrm을 Ansible이 설치된 머신에 설치한다.
Pip install "pywinrm>=0.2.2"
OS 정보와 Ansible이 사용하는 Python Version 확인
ansible --version | grep "python version"
python-kerberos dependency 설치
# CentOS
Yum -y instll python-devel krb5-devel krb5-libs krb5-workstation
# Ubuntu
Sudo apt-get install python-dev libkrb5-dev krb5-user
python-kerberos 설치
Pip install pywinrm[kerberos]
Kerberos 설정 변경
/etc/krb5.conf 에서 접속하고자 하는 도메인 계정 정보에 맞게 설정
#/etc/krb5.conf
[realms]
mydomain.com = {
kdc = dc1_host.mydomain.com
kdc = dc2_host.mydomain.com
}
[domain_realm]
.mydomain.com = MYDOMAIN.COM
mydomain.com = MYDOMAIN.COM
인증 테스트 및 연결 티켓 확인
$ kinit domainuser@MYDOMAIN.COM
Password for domainuser@MYDOMAIN.COM:
$ klist
Ticket cache: KEYRING:persistent:10001:10001
Default principal: domainuser@MYDOMAIN.COM
Valid starting Expires Service principal
06/25/2019 10:19:16 06/25/2019 20:19:16 /MYDOMAIN.COM@MYDOMAIN.COM
renew until 06/25/2019 20:19:16
Inventory 설정
[win]
userdomain.MYDOMAIN.COM
[win:vars]
ansible_user=domainuser@MYDOMAIN.COM
ansible_password=비밀번호
ansible_connection=winrm
ansible_port=5985
ansible_winrm_scheme=http
ansible_winrm_transport=kerberos
ansible_winrm_server_cert_validation=ignore
ansible_become=false
/etc/hosts 설정
호스트명으로 연결하고자 할 때 해당 파일 수정
192.10.10.4 userdomain.MYDOMAIN.COM
Ansible win_ping 실행
ansible win -i inventory -m win_ping
Ansible 결과 확인
userdomain.MYDOMAIN.COM | SUCCESS => { "changed": false, "ping": "pong" } |
Windows 서버에서 Windows 로그 > 보안 > 감사 성공 확인
참조 URL
https://docs.ansible.com/ansible/latest/user_guide/windows_setup.html
https://docs.ansible.com/ansible/latest/user_guide/windows_winrm.html
'Devops > Ansible' 카테고리의 다른 글
병렬 백업과 복원을 위한 async 작업 (0) | 2022.08.30 |
---|---|
MSSQL 별칭 관리 (0) | 2022.08.30 |
[Ansible] SQL Server Uninstall (0) | 2019.10.11 |
Ansible : Public Key 자동 배포 (0) | 2019.04.12 |
Ansible Roles (0) | 2019.04.12 |