Всем привет.
По случаю всеобщего карантина появилось время освежить кое-что в памяти. Например 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
А что вы думаете по этому поводу?