J'ai une machine de contrôle ansible (host-A) qui doit communiquer avec host-C, une machine Windows qui n'a pas d'utilisateurs locaux (c'est un Active Directory).
L'hôte-A n'a pas d'accès réseau à l'hôte-C, mais la communication est possible en utilisant l'hôte-B.
host-B c'est une machine linux.
L'hôte-A accède à l'hôte-B par ssh.
Suite à cette article J'ai créé un serveur nginx pour acheminer le trafic de WinRM sur hôte-B
server {
listen 5986 default ssl;
server_name localhost;
ssl_certificate ssl/nginx.crt;
ssl_certificate_key ssl/nginx.key;
location /host-c {
proxy_pass https://host-c-address:5986/wsman;
}
}
Mon inventaire ansible pour host-C c'est comme :
[windows]
host-c ansible_host=host-b ansible_winrm_path=host-c
Et group_vars
pour Windows est :
ansible_user: myuser
ansible_pass: andmypass
ansible_port: 5986
ansible_connection: winrm
ansible_winrm_realm: HOSTCDOMAIN.LOCAL
ansible_winrm_scheme: https
ansible_winrm_transport: kerberos
ansible_winrm_server_cert_validation: ignore
Les choses que j'ai testées jusqu'à présent
1 Test sans Kerberos
J'ai changé cette ligne : ansible_winrm_transport: ssl
Ce n'est pas possible car l'hôte-c ne peut pas avoir d'utilisateurs locaux.
fatal: [host-c]: FAILED! => {"failed": true, "msg": "ssl: 401 Unauthorized."}
2 Créez un NAT pour acheminer le port kerberos 88 vers l'hôte C.
Avec cela, je pourrais authentifier mon utilisateur en utilisant le client Kerberos, mais pas dans ansible.
krb5.conf :
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
default_realm = HOSTCDOMAIN.LOCAL
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = false
[realms]
HOSTCDOMAIN.LOCAL = {
kdc = host-b
}
[domain_realm]
.hostcdomain.local = HOSTCDOMAIN.LOCAL
Utilisation du kerberos local
# kinit myuser@HOSTCDOMAIN.LOCAL
Password for myuser@HOSTCDOMAIN.LOCAL:
# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: myuser@HOSTCDOMAIN.LOCAL
Valid starting Expires Service principal
03/12/2016 20:23:35 03/13/2016 06:23:35 krbtgt/HOSTCDOMAIN.LOCAL@HOSTCDOMAIN.LOCAL
renew until 03/19/2016 20:23:31
Test Ansible avec ansible_winrm_transport: kerberos
e# ansible-playbook test_win.yml -vvv
Using /etc/ansible/ansible.cfg as config file
1 plays in test_win.yml
PLAY [Ping windows] ************************************************************
TASK [ping] ********************************************************************
task path: /etc/ansible/test_win.yml:5
<host-b> ESTABLISH WINRM CONNECTION FOR USER: myuser on PORT 5986 TO host-b
fatal: [host-c]: FAILED! => {"failed": true, "msg": "kerberos: (('Unspecified GSS failure. Minor code may provide more information', 851968), ('Server not found in Kerberos database', -1765328377))"}
Quelqu'un peut-il m'aider à trouver un moyen de surmonter ce problème ? Je pense qu'il me manque quelque chose.
Il est possible pour l'hôte-a d'utiliser l'hôte-b pour s'authentifier sur l'hôte-c ?