
저는 Ansible로 공부를 시작하고 이를 실제 업무 상황에 적용하고 싶었습니다. Windows Nano Server 2016을 관리하기 위해 Ubuntu에서 Ansible을 구현하고 있습니다. 사용자 계정에 매핑된 인증서를 사용하도록 구성하고 있습니다. 나는 이 튜토리얼을 여기에 기반으로 삼았습니다.https://adamtheautomator.com/winrm-https-ansible/
오류
win_ping 모듈을 사용하여 연결을 테스트했고 다음 출력을 받았습니다.
**ansible windows -vvvv -i hosts -m win_ping**
NanoServer | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: OpenSSH_8.2p1 Ubuntu-4ubuntu0.1, OpenSSL 1.1.1f 31 Mar 2020
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: include /etc/ssh/ssh_config.d/*.conf matched no files
debug1: /etc/ssh/ssh_config line 21: Applying options for
*debug1: auto-mux: Trying existing master
debug1: Control socket \"/home/woliveira/.ansible/cp/6df2d837bc\" does not exist
debug2: resolving \"nanoserver\" port 5986
debug2: ssh_connect_direct
debug1: Connecting to nanoserver [10.11.39.250] port 5986.
debug2: fd 3 setting O_NONBLOCK
debug1: fd 3 clearing O_NONBLOCK
debug1: Connection established.
debug3: timeout: 25000 ms remain after connect
debug1: identity file /home/woliveira/.ssh/id_rsa type -1
debug1: identity file /home/woliveira/.ssh/id_rsa-cert type -1
debug1: identity file /home/woliveira/.ssh/id_dsa type -1
debug1: identity file /home/woliveira/.ssh/id_dsa-cert type -1
debug1: identity file /home/woliveira/.ssh/id_ecdsa type -1
debug1: identity file /home/woliveira/.ssh/id_ecdsa-cert type -1
debug1: identity file /home/woliveira/.ssh/id_ecdsa_sk type -1
debug1: identity file /home/woliveira/.ssh/id_ecdsa_sk-cert type -1
debug1: identity file /home/woliveira/.ssh/id_ed25519 type -1
debug1: identity file /home/woliveira/.ssh/id_ed25519-cert type -1
debug1: identity file /home/woliveira/.ssh/id_ed25519_sk type -1
debug1: identity file /home/woliveira/.ssh/id_ed25519_sk-cert type -1
debug1: identity file /home/woliveira/.ssh/id_xmss type -1
debug1: identity file /home/woliveira/.ssh/id_xmss-cert type -1
debug1: Local version string SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.1
**Connection timed out during banner exchange",
"unreachable": true**
}
다음으로 ansible 구성 파일에서 시간 제한을 늘리려고 시도했는데 피어에서 연결 재설정을 받았습니다.
NanoServer | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: OpenSSH_8.2p1 Ubuntu-4ubuntu0.1, OpenSSL 1.1.1f 31 Mar 2020
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: include /etc/ssh/ssh_config.d/*.conf matched no files
debug1: /etc/ssh/ssh_config line 21: Applying options for
*debug1: auto-mux: Trying existing master
debug1: Control socket \"/home/woliveira/.ansible/cp/6df2d837bc\" does not exist
debug2: resolving \"nanoserver\" port 5986
debug2: ssh_connect_direct
debug1: Connecting to nanoserver [10.11.39.250] port 5986.
debug2: fd 3 setting O_NONBLOCK
debug1: fd 3 clearing O_NONBLOCK
debug1: Connection established.
debug3: timeout: 3600000 ms remain after connect
debug1: identity file /home/woliveira/.ssh/id_rsa type -1
debug1: identity file /home/woliveira/.ssh/id_rsa-cert type -1
debug1: identity file /home/woliveira/.ssh/id_dsa type -1
debug1: identity file /home/woliveira/.ssh/id_dsa-cert type -1
debug1: identity file /home/woliveira/.ssh/id_ecdsa type -1
debug1: identity file /home/woliveira/.ssh/id_ecdsa-cert type -1
debug1: identity file /home/woliveira/.ssh/id_ecdsa_sk type -1
debug1: identity file /home/woliveira/.ssh/id_ecdsa_sk-cert type -1
debug1: identity file /home/woliveira/.ssh/id_ed25519 type -1
debug1: identity file /home/woliveira/.ssh/id_ed25519-cert type -1
debug1: identity file /home/woliveira/.ssh/id_ed25519_sk type -1
debug1: identity file /home/woliveira/.ssh/id_ed25519_sk-cert type -1
debug1: identity file /home/woliveira/.ssh/id_xmss type -1
debug1: identity file /home/woliveira/.ssh/id_xmss-cert type -1
debug1: Local version string SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.1
kex_exchange_identification: read: **Connection reset by peer",
"unreachable": true**
}
환경 설정.
그만큼앤서블 2.9.6 에 설치되어 있습니다 우분투 20.04.1 LTSVM
내 Windows 서버는 다음과 같습니다. OS 이름: Microsoft Windows Server 2016 Standard Evaluation OS 버전: 10.0.14393 해당 없음 빌드 14393
두 VM 모두 고정 IP를 가지며 도메인에 없습니다. 나는 이 튜토리얼을 따릅니다: https://vnuggets.com/2019/08/08/ansible-certificate-authentication-to-windows/
ansibleoperator라는 Windows 로컬 사용자를 생성하고 이 사용자를 Local Admi 그룹에 추가했습니다. 이것은 내 Ansible 호스트 파일입니다.
[windows]
NanoServer
[windows:vars]
ansible_user=ansibleoperator
ansible_password=*********
ansble_connection=winrm
ansible_winrm_cert_pem=/home/woliveira/cert.pem
ansible_winrm_cert_key_pem=/home/woliveira/cert_key.pem
ansible_port=5986
ansible_winrm_scheme=https
ansible_winrm_server_cert_validation=ignore
Windows 방화벽이 비활성화되었습니다. TrustedHosts가 모든 호스트에 대해 구성되었습니다(value=*).
내가 확인한 내용
다른 Windows 호스트가 winrm을 사용하여 연결할 수 있는 경우: PS C:> Test-WSMan -ComputerName "NanoServer" -UseSSL
wsmid : http://schemas.dmtf.org/wbem/wsman/identity/1/wsmanidentity.xsd
ProtocolVersion : http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd
ProductVendor : Microsoft Corporation
ProductVersion : OS: 0.0.0 SP: 0.0 Stack: 3.0
Linux 측에서는 Netcat을 사용하여 다음 명령을 사용하여 5986 포트의 연결을 테스트할 수 있습니다.
nc -z -w1 NanoServer 5986;echo $?
출력은 0(명령 성공)입니다.
이미 다른 Windows에서 연결을 시도했지만 이번에는 pywinrm 스크립트를 사용합니다. 왜냐하면 Ansible이 사용하는 것과 동일한 lib이기 때문입니다. 이 스크립트를 실행합니다.
import winrm
cert_pem = 'C:/Users/woliveira.adm/Desktop/CertificadoAnsible/cert.pem'
cert_key_pem = 'C:/Users/woliveira.adm/Desktop/CertificadoAnsible/cert_key.pem'
session = winrm.Session('NanoServer:5986', auth=('ansibleoperator', '********'),
transport='certificate',
cert_pem=cert_pem,
cert_key_pem=cert_key_pem,
server_cert_validation='ignore',
)
session.run_cmd('ipconfig')
그리고 이것을 받습니다:
Traceback (most recent call last):
File "<ipython-input-56-b902c730fb9c>", line 1, in <module>
runfile('C:/Users/woliveira.adm/Desktop/testewinrm.py', wdir='C:/Users/woliveira.adm/Desktop')
File "C:\ProgramData\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 786, in runfile
execfile(filename, namespace)
File "C:\ProgramData\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 110, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)
File "C:/Users/woliveira.adm/Desktop/testewinrm.py", line 19, in <module>
session.run_cmd('ipconfig')
File "C:\ProgramData\Anaconda3\lib\site-packages\winrm\__init__.py", line 39, in run_cmd
shell_id = self.protocol.open_shell()
File "C:\ProgramData\Anaconda3\lib\site-packages\winrm\protocol.py", line 166, in open_shell
res = self.send_message(xmltodict.unparse(req))
File "C:\ProgramData\Anaconda3\lib\site-packages\winrm\protocol.py", line 243, in send_message
resp = self.transport.send_message(message)
File "C:\ProgramData\Anaconda3\lib\site-packages\winrm\transport.py", line 323, in send_message
response = self._send_message_request(prepared_request, message)
File "C:\ProgramData\Anaconda3\lib\site-packages\winrm\transport.py", line 328, in _send_message_request
response = self.session.send(prepared_request, timeout=self.read_timeout_sec)
File "C:\ProgramData\Anaconda3\lib\site-packages\requests\sessions.py", line 646, in send
r = adapter.send(request, **kwargs)
File "C:\ProgramData\Anaconda3\lib\site-packages\requests\adapters.py", line 529, in send
raise ReadTimeout(e, request=request)
ReadTimeout: HTTPConnectionPool(host='10.11.39.250', port=5986): Read timed out. (read timeout=30)
이것을 어떻게 디버깅할 수 있는지 모르겠습니다. 무엇을 확인할 수 있나요?
내 영어 때문에 미안해요. 명확하지 않은 부분이 있으면 알려주시기 바랍니다.
답변1
vars 파일에 오타가 있습니다.
ansble_connection=winrm
이는 다음과 같아야 합니다.
ansible_connection=winrm
(누락된 부분이 있습니다 i
.)
이것이 바로 Ansible이 WinRM 대신 SSH를 통해 연결을 시도하는 이유입니다.