본문 바로가기
ANSIBLE

[ ANSIBLE ] ansible 에서 windows 원격 실행

by 정윤재 2020. 4. 26.

Setup-winrm-For-Ansible.ps1
0.02MB

우선 저의 테스트 환경을 먼저 알려 드리겠습니다.

- centos 7

- windows10 (powershell 이 3버전 이상이여야 합니다.)

 

yum 으로 ansible 설치부터 진행 하면서 설명 드리겠습니다.

 

1. Extra Packages for Enterprise Linux 설치

    yum install -y epel-release

 

2. yum 을 통한 ansible 설치

    yum install -y ansible

 

3. python 에서 winrm 을 실행 시킬 수 있도록 해줌

  pip install "pywinrm>=0.3.0"

 

winRM은 기본적으로 사용하는 포트는 5985,6번 입니다.
(http 는 5985, https 는 5986)

https 라니? 리눅스에선 openssl 을 미리 설치 해놔야야겠죠?
(openssl 설치는 https://shonm.tistory.com/614?category=525880 를 참고해주세요)

 

4. /etc/ansible/hosts 파일에 아래와 같은 내용을 기술 해 줍니다.

 (hosts 파일을 inventory 라고 합니다. 작업 할 시스템 목록 설정 파일입니다.)

 

[win10]
172.30.1.6

[win10:vars]
ansible_user=user_id
ansible_password=password
ansible_connection=winrm
ansible_winrm_server_cert_validation=ignore

 

(172.30.1.6 은 실제로 작업 될 테스트 서버의 IP 입니다.)

 

5. windows 에서 power shell 을 관리자 권한으로 띄워서 아래와 같은 명령어를 입력 함

   - Get-Service -Name winrm 

      위 명령어 실행 시 Stopped 라고 멈춤 상태라고 나옵니다.

 

때문에 winrm 을 running 상태로 돌리려면

$url = "https://raw.githubusercontent.com/ansible/ansible/devel/examples/scripts/ConfigureRemotingForAnsible.ps1
$file = "$env:temp\ConfigureRemotingForAnsible.ps1" 
(New-Object -TypeName System.Net.WebClient).DownloadFile($url, $file) 
powershell.exe -ExecutionPolicy ByPass -File $file 


위의 4개줄을 power shell 관리자 권한에서 실행 시킵니다.

(주의할 점 power shell 3.0 버전 이상이여야 하므로 window7,2008 에서는 안됨)

 

인터넷이 안되는 환경이라면 첨부 파일을 power shell 에서 실행 시켜주세요.

PS C:\temp> ./Setup-winrm-For-Ansible.ps1


정상 동작하는지 여부 확인은
Get-Service -Name winrm 이 Running 이라고 나오면 됩니다.
예)

PS C:\WINDOWS\system32> Get-Service -Name winrm

Status   Name               DisplayName
------   ----               -----------
Running  winrm              Windows Remote Management (WS-Manag...

상태에 대한 구체적인 확인은
winrm enumerate winrm/config/Listener
로 확인 하면 됩니다.

예)

$url = "https://raw.githubusercontent.com/ansible/ansible/devel/examples/scripts/ConfigureRemotingForAnsible.ps1"
$file = "$env:temp\ConfigureRemotingForAnsible.ps1"
(New-Object -TypeName System.Net.WebClient).DownloadFile($url, $file)
powershell.exe -ExecutionPolicy ByPass -File $file PS C:\WINDOWS\system32> winrm enumerate winrm/config/Listener
Listener
    Address = *
    Transport = HTTP
    Port = 5985
    Hostname
    Enabled = true
    URLPrefix = wsman
    CertificateThumbprint
    ListeningOn = 127.0.0.1, 169.254.15.227, 169.254.33.58, 169.254.148.118, 169.254.181.236, 169.254.188.81, 172.30.1.6, 192.168.101.1, 192.168.107.1, ::1, fe80::14c9:9320:c958:b5ec%17, fe80::2943:c38:5ec0:bc51%9, fe80::48a3:b37:8d98:9081%19, fe80::509a:b80e:dca2:fe3%5, fe80::54ec:481e:37c6:9476%2, fe80::8589:636c:8999:e3f5%11, fe80::a42c:79cf:b79a:213a%13, fe80::a8fe:7796:104f:b0e4%16

Listener
    Address = *
    Transport = HTTPS
    Port = 5986
    Hostname = DESKTOP-PNOJ4TS
    Enabled = true
    URLPrefix = wsman
    CertificateThumbprint = 5E7AF02614ACA9681FC9216326AEC3BD992F3737
    ListeningOn = 127.0.0.1, 169.254.15.227, 169.254.33.58, 169.254.148.118, 169.254.181.236, 169.254.188.81, 172.30.1.6, 192.168.101.1, 192.168.107.1, ::1, fe80::14c9:9320:c958:b5ec%17, fe80::2943:c38:5ec0:bc51%9, fe80::48a3:b37:8d98:9081%19, fe80::509a:b80e:dca2:fe3%5, fe80::54ec:481e:37c6:9476%2, fe80::8589:636c:8999:e3f5%11, fe80::a42c:79cf:b79a:213a%13, fe80::a8fe:7796:104f:b0e4%16

그리고 만약 

 

ssl: the specified credentials were rejected by the server 라는 메시지가 나오면


power shell 에서
Set-Item -Path WSMan:\localhost\Service\Auth\Basic -Value $true

그리고 windows 의 사용자는 administrator 권한을 가진 계정이어야 합니다.

 

6. ansible 이 잘 설치 되었는지 확인 하자면 windows 서버에 ping 을 쳐서

   확인 해보도록 합시다.

 

ansible -i hosts win10 -m win_ping 를 ansible host linux 서버에서 실행 시

172.30.1.6 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

와 같이 windows 서버에 SUCCESS 로 연결 되는지 여부를 확인합니다.

 

7. 이제 playbook 을 만들어 봅시다.

playbook 이란 ansible 을 통해 어떤 작업을 할 것인가를 기술 하는 파일입니다.
설정을 최소화 하기 위해 yml 파일로 설정 하도록 되어 있습니다.
ansible 을 통해 할수 있는 일을 tasks 라는 항목에 기술 하는데 ansible 에서 

기본적으로 제공하는 모듈이 많이 있으니 찾아서 사용하면 좋을 것 같습니다.

 

playbook 실행 방법

ansible-playbook -i [ansible의 inventory] [playbook위치 및 파일 이름)

 

실행을 당할 windows 서버의 

D:\ 에 test.bat 라는 파일을 만들고
내용을 echo test_success 와 같이 만든다

 

그리고 win_test.yml 라는 파일을 아래와 같은 내용으로 생성 한다.

- name: Run test Powershell
  hosts: win10
  gather_facts: false
  tasks:
  - name: Run test.bat
    win_command: D:\test.bat

그럼 다음 아래와 같이 ansible 의 playbook 을 실행 해 줍니다.
ansible-playbook -i hosts win_test.yml -vvv 

아래와 같이 결과 값이 보입니다.

[root@ansible1 ansible]# ansible-playbook -i hosts win_test.yml -vvv
ansible-playbook 2.9.6
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /bin/ansible-playbook
  python version = 2.7.5 (default, Aug  7 2019, 00:51:29) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
Using /etc/ansible/ansible.cfg as config file
host_list declined parsing /etc/ansible/hosts as it did not pass its verify_file() method
script declined parsing /etc/ansible/hosts as it did not pass its verify_file() method
auto declined parsing /etc/ansible/hosts as it did not pass its verify_file() method
Parsed /etc/ansible/hosts inventory source with ini plugin

PLAYBOOK: win.test.yml ***********************************************************************************************************************************************
1 plays in win.test.yml

PLAY [Run test Powershell] *******************************************************************************************************************************************
META: ran handlers

TASK [Run test.bat] **************************************************************************************************************************************************
task path: /etc/ansible/win.test.yml:5
Using module file /usr/lib/python2.7/site-packages/ansible/modules/windows/win_command.ps1
Pipelining is enabled.
<172.30.1.6> ESTABLISH WINRM CONNECTION FOR USER: shonm on PORT 5986 TO 172.30.1.6
EXEC (via pipeline wrapper)
changed: [172.30.1.6] => {
    "changed": true, 
    "cmd": "D:\\test.bat", 
    "delta": "0:00:00.050112", 
    "end": "2020-04-14 05:58:39.070225", 
    "rc": 0, 
    "start": "2020-04-14 05:58:39.020112", 
    "stderr": "", 
    "stderr_lines": [], 
    "stdout": "\r\nC:\\Users\\shonm>echo test_success \r\ntest_success\r\n", 
    "stdout_lines": [
        "", 
        "C:\\Users\\shonm>echo test_success ", 
        "test_success"
    ]
}
META: ran handlers
META: ran handlers

PLAY RECAP ***********************************************************************************************************************************************************
172.30.1.6                 : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

위와 같이 정상적으로 잘 생행 된 것을 볼 수 있습니다.

 

'ANSIBLE' 카테고리의 다른 글

[ ANSIBLE] ansible 에서 windows 로 복사 및 실행  (0) 2020.05.17

댓글