Главная

Tuesday, 5 May 2020

Настройка Windows для Ansible.

Всем привет.

По случаю всеобщего карантина появилось время освежить кое-что в памяти. Например Ansible. А началось все с того мне сказали что он легко рулит как Linux так и Windows хостами. А поскольку сейчас Windows сервера мне попадаются намного чаще то почему бы нет. Тем более в описании Ansible, как было раньше, сказано что на хостах Windows никаких Ansible-агентов не нужно.

На самом деле, подготовительные меры на хостах Windows нужны. Нет, никакого кода дополнительно ставить нет необходимости, но подкрутить кое-что придется. В сети полно инструкций на эту тему, и сводятся они в идеале к следующему: запуск службы WinRM, куда уж без нее, и прописывание правила на локальном фаерволле для слушателя по порту 5896. Это в двух словах. Но выполнить это надо на каждом Windows-хосте, которым хотите управлять.

Для автоматизации этого процесса хорошие люди придумали скрипт PowerShell. Запускаете, получаете "Ок" и готово.


Что дальше? Далее на мастер-хосте с Ansible устанавливаете pywinrm, указываете в hosts Windows-хосты и переменные доступа:
[windows]
192.168.1.180

[windows:vars]
ansible_user=admin
ansible_password="********"
ansible_connection=winrm
ansible_winrm_server_cert_validation=ignore


Вот в принципе и все. Проверяем что пинг проходит с Ansible:
ansible -m win_ping windows --ask-pass


Как видите все ок. Можно рулить Windows. 

Но так было не сразу). Это в идеале, если ничего наложилось. Ansible может написать в ошибку что угодно даже с четырехкратным выводом -vvvv. Но проблемы в основном возникают со стороны подопытной Windows.

Прежде всего проверяем что скрипт конфигуратора отработал удачно. Выполняем вот это на хосте Windows в Powershell:

$httpResult = Invoke-Command -ComputerName "localhost" -ScriptBlock {$env:COMPUTERNAME} -ErrorVariable httpError -ErrorAction SilentlyContinue

$httpsOptions = New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck
$httpsResult = New-PSSession -UseSSL -ComputerName "localhost" -SessionOption $httpsOptions -ErrorVariable httpsError -ErrorAction SilentlyContinue

If ($httpResult -and $httpsResult)
{
    Write-Host "HTTP: Enabled | HTTPS: Enabled"
}
ElseIf ($httpsResult -and !$httpResult)
{
    Write-Host "HTTP: Disabled | HTTPS: Enabled"
}
ElseIf ($httpResult -and !$httpsResult)
{
    Write-Host "HTTP: Enabled | HTTPS: Disabled"
}
Else
{
    Write-host "Unable to establish an HTTP or HTTPS remoting session."
}

Нам нужен выхлоп "HTTPS: Enabled".

Далее проверяем службу WinRM: winrm get winrm/config


а также какие IP-адреса прослушиваются: winrm e winrm/config/listener


Параметр ListeningOn не должен быть равен null. Если null то в вашей политике для WinRM указан определенный IP-адрес вместо "*". И это не сработает даже если вы добавите в политику IP-адрес Ansible-мастера.

Ну и последнее - учетная запись admin должна быть с административными правами.

Получилось малость сумбурно, но практично.
Удачи.



No comments:

Post a Comment

А что вы думаете по этому поводу?