Взаимодействие с доменными Windows системами через Ansible используя в повседневности Ubuntu 18.04 Server amd64 (или Desktop) вот такую задачу я себе поставил. Просто хотел добиться вроде как есть такое работоспособное решение у людей, но я все на своем примере свел воедино и получил еще один плюс в пользу своих наработок по взаимодействию из привычной системы с контролируемыми системами. А ранее я блоге я показал, как без использования домена управлять.
Тестовая конфигурация:
Windows Server 2012 R2 - AD (polygon.local),DNS,DHCPUbuntu — Ansible Center on Ubuntu 18.04 Server amd64
Ниже пошаговые действия по воплощения задачи в реальность:
ekzorchik@srv-bionic:~$ hg clone --insecure https://172.35.35.8/hg/dproject ekzorchik@srv-bionic:~$ sudo ./dproject/default ekzorchik@srv-bionic:~$ uname -a Linux srv-bionic 4.15.0-36-generic #39-Ubuntu SMP Mon Sep 24 16:19:09 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux ekzorchik@srv-bionic:~$ sudo apt-get install -y software-properties-common ekzorchik@srv-bionic:~$ sudo apt-add-repository ppa:ansible/ansible -y ekzorchik@srv-bionic:~$ apt-cache show ansible | grep Version Version: 2.7.1-1ppa~bionic Version: 2.5.1+dfsg-1 ekzorchik@srv-bionic:~$ sudo apt-get install ansible python3-pip python-pip -y
Устанавливаю пакет для использования модуля winrm:
ekzorchik@srv-bionic:~$ sudo pip install http://github.com/diyan/pywinrm/archive/master.zip#egg=pywinrm ekzorchik@srv-bionic:~$ sudo find / -name "winrm" /usr/local/lib/python3.6/dist-packages/winrm /usr/local/lib/python2.7/dist-packages/winrm
Теперь чтобы подключить к Server 2012 R2 Standard (Role: DC) нужно:
PS C:\Windows\system32> set-executionpolicy remotesigned Execution Policy Change The execution policy helps protect you from scripts that you do not trust. Changing the execution policy might expose you to the security risks described in the about_Execution_Policies help topic at http://go.microsoft.com/fwlink/?LinkID=135170. Do you want to change the execution policy? [Y] Yes [N] No [S] Suspend [?] Help (default is "Y"): Y
После запускаю скрипт который и создает правила в Firewall: Allow 5986/TCP
Скачал его к себе в домашнее хранилище и выкладываю здесь ConfigureRemotingForAnsible
PS C:\Windows\system32> cd c:\1 PS C:\1> .\ConfigureRemotingForAnsible.ps1
После чего пробую подключиться с Ubuntu 18.04 к доменной системе:
ekzorchik@srv-bionic:~$ sudo mkdir -p /etc/ansible/windows/group_vars
ekzorchik@srv-bionic:~$ sudo nano /etc/ansible/windows/hosts
[windows]
10.90.90.2
ekzorchik@srv-bionic:~$ sudo nano /etc/ansible/windows/group_vars/windows.yml
file: group_vars/windows.yml
ansible_user: ekzorchik@POLYGON.LOCAL
ansible_password: 712mbddr@
ansible_winrm_transport: basic
#Если получила эта системе kerberos билет
#ansible_winrm_transport: kerberos
ansible_connection: winrm
ansible_winrm_server_cert_validation: ignore
validate_certs: false
ekzorchik@srv-bionic:~$ sudo ansible windows -i /etc/ansible/windows/hosts -m win_ping
10.90.90.2 | SUCCESS => {
"changed": false,
"ping": "pong"
}
Отлично, но это Basic аутентификация.
Теперь для себя я хочу разобрать чтобы при подключении с Ubuntu системы на Windows систему происходила аутентификация на основе kerberos:
ekzorchik@srv-bionic:~$ sudo apt-get install python-dev libkrb5-dev krb5-user -y
Default Kerberos version 5 realm: ничего не указываю и нажимаю OK
ekzorchik@srv-bionic:~$ sudo pip install http://github.com/diyan/pywinrm/archive/master.zip#egg=pywinrm
ekzorchik@srv-bionic:~$ sudo pip install pyOpenSSL --upgrade
ekzorchik@srv-bionic:~$ sudo pip install kerberos
ekzorchik@srv-bionic:~$ sudo pip install "pywinrm[kerberos]"
ekzorchik@srv-bionic:~$ sudo pip install "pywinrm[credssp]"
ekzorchik@srv-bionic:~$ sudo pip install "requests-credssp" "requests-kerberos"
ekzorchik@srv-bionic:~$ sudo cp /etc/krb5.conf /etc/krb5.conf.backup
ekzorchik@srv-bionic:~$ sudo rm /etc/krb5.conf
ekzorchik@srv-bionic:~$ sudo nano /etc/krb5.conf
[libdefaults]
default_realm = POLYGON.LOCAL
[realms]
POLYGON.LOCAL = {
kdc = srv-dc1.polygon.local
admin_server = srv-dc1.polygon.local
}
[domain_realm]
.polygon.local = POLYGON.LOCAL
polygon.local = POLYGON.LOCAL
Проверяю, могу ли я получить kerberos билет:
ekzorchik@srv-bionic:~$ kinit ekzorchik@POLYGON.LOCAL
Password for ekzorchik@POLYGON.LOCAL:
ekzorchik@srv-bionic:~$ klist
Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: ekzorchik@POLYGON.LOCAL
Valid starting Expires Service principal
11/06/2018 20:44:24 11/07/2018 06:44:24 krbtgt/POLYGON.LOCAL@POLYGON.LOCAL
renew until 11/07/2018 20:44:20
ekzorchik@srv-bionic:~$ kdestroy
ekzorchik@srv-bionic:~$ sudo apt-get install libxml2-utils -y
ekzorchik@srv-bionic:~$ curl --header "Content-Type: application/soap+xml;charset=UTF-8" --header "WSMANIDENTIFY: unauthenticated" http://10.90.90.2:5985/wsman --data '<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:wsmid="http://schemas.dmtf.org/wbem/wsman/identity/1/wsmanidentity.xsd"><s:Header/><s:Body><wsmid:Identify/></s:Body></s:Envelope>' | xmllint --format -
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 694 100 460 100 234 224k 114k --:--:-- --:--:-- --:--:-- 338k
<?xml version="1.0"?>
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope">
<s:Header/>
<s:Body>
<wsmid:IdentifyResponse xmlns:wsmid="http://schemas.dmtf.org/wbem/wsman/identity/1/wsmanidentity.xsd">
<wsmid:ProtocolVersion>http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd</wsmid:ProtocolVersion>
<wsmid:ProductVendor>Microsoft Corporation</wsmid:ProductVendor>
<wsmid:ProductVersion>OS: 0.0.0 SP: 0.0 Stack: 3.0</wsmid:ProductVersion>
</wsmid:IdentifyResponse>
</s:Body>
</s:Envelope>
ekzorchik@srv-bionic:~$ sudo nano /etc/ansible/windows/hosts
[windows]
10.90.90.2
ekzorchik@srv-bionic:~$ sudo nano /etc/ansible/windows/group_vars/windows.yml
file: group_vars/windows.yml
ansible_user: ekzorchik@POLYGON.LOCAL
ansible_password: 712mbddr@
ansible_winrm_transport: kerberos
ansible_port: 5985
ansible_connection: winrm
ansible_winrm_server_cert_validation: ignore
validate_certs: false
Проверяю подключение к Windows хосту используя Kerberos:
ekzorchik@srv-bionic:~$ sudo ansible windows -i /etc/ansible/windows/hosts -m win_ping
10.90.90.2 | SUCCESS => {
"changed": false,
"ping": "pong"
}
Отлично, работает.
Пробую различные примеры:
ekzorchik@srv-bionic:~$ sudo ansible windows -i /etc/ansible/windows/hosts -m win_command -a "cmd.exe /c mkdir c:\a\b\c\d\e\f" 10.90.90.2 | CHANGED | rc=0 >> ekzorchik@srv-bionic:~$ sudo ansible windows -i /etc/ansible/windows/hosts -m win_command -a "cmd.exe /c tree c:\a" 10.90.90.2 | CHANGED | rc=0 >> Folder PATH listing Volume serial number is F24F-EB96 C:\A ����b ����c ����d ����e ����f
Все работает.
Теперь я могу составить PowerShell скрипт и используя данную заметку раскатать его с Ubuntu системы по всему домену. Что мне нравится, это то что я использую Ubuntu 18.04 Desktop/Server для управления инфраструктурой Windows.
На этом у меня всё, с уважением автор блога Олло Александр aka ekzorchik.