Задача: Хочу все конфигурирование/подконфигурирование Windows
систем в домене делать через Ansible
если нужно вот прям сейчас, ну а если на долговременное использование, то тут уже буду через GPO
прорабатывать единую настройку. Да, кстати это будет полезно с точки зрения прокачки умений и составления собственной базы наработок. В последствии отдельной заметкой сделаю и управлением корпоративными системами Ubuntu
также через Ansible
. Сейчас я покажу по составленному плану базовые вещи, а именно:
Развернуть Ansible на Ubuntu 22.04 Server
Настроить взаимодействие через Ansible c доменными системами
На доменные системы через GPO раскатать ConfigureRemotingForAnsible.ps1
Как копировать файлы
Как установить MSI пакет (+ файл ответов)
Как установить/удалить exe-файлы
Как управлять службами Windows
На заметку: Данная заметка будет дополняться дабы, обратившись к ней я мог быстро вспомнить, как решить повторяющуюся задачу.
Сперва как всегда все обкатываю на своем стенде на базе виртуализации Debian 10 + Proxmox 6.4:
srv-ansible.polygon.local
OS: Ubuntu 22.04 Server
ISO: ubuntu-22.04.2-live-server-amd64.iso
Roles: Сервис Ansible
IP: 10.90.90.11
Srv-dc01.polygon.local
OS: Windows Server 2012 R2
ISO: SW_DVD9_Windows_Svr_Std_and_DataCtr_2012_R2_64Bit_English_-4_MLF_X19-82891.ISO
Roles: Active Directory, DNS, DHCP
IP: 10.90.90.3
wrkst0002.polygon.local
OS: Windows 10 Pro
ISO: SW_DVD9_Win_Pro_10_1909.2_64BIT_Russian_Pro_Ent_EDU_N_MLF_X22-26638.ISO
Roles: workstation
IP: 10.90.90.12
Шаг №1:
Опираясь на заметку "Через Ansible с доменными Windows системами на Ubuntu 22.04 Server"
произвожу установку Ansible
на Ubuntu 22.04 Server
и настраиваю рабочие станции Windows
в домене на работу подключения к ним через winrm:
ekzorchik@srv-ansible:~$ sudo apt-get install -y ansible ekzorchik@srv-ansible:~$ ansible --version ansible [core 2.15.2] config file = /etc/ansible/ansible.cfg configured module search path = ['/home/ekzorchik/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python3/dist-packages/ansible ansible collection location = /home/ekzorchik/.ansible/collections:/usr/share/ansible/collections executable location = /usr/bin/ansible python version = 3.10.12 (main, Jun 11 2023, 05:26:28) [GCC 11.4.0] (/usr/bin/python3) jinja version = 3.0.3 libyaml = True ekzorchik@srv-ansible:~$ ekzorchik@srv-ansible:~$ sudo pip install http://github.com/diyan/pywinrm/archive/master.zip#egg=pywinrm sudo: pip: command not found ekzorchik@srv-ansible:~$ ekzorchik@srv-ansible:~$ sudo apt-get install -y pip python2-dev build-essential ekzorchik@srv-ansible:~$ sudo pip install http://github.com/diyan/pywinrm/archive/master.zip#egg=pywinrm Collecting pywinrm Downloading http://github.com/diyan/pywinrm/archive/master.zip \ 49.5 kB 596.5 kB/s 0:00:00 Preparing metadata (setup.py) ... done Requirement already satisfied: requests>=2.9.1 in /usr/lib/python3/dist-packages (from pywinrm) (2.25.1) Requirement already satisfied: requests_ntlm>=1.1.0 in /usr/lib/python3/dist-packages (from pywinrm) (1.1.0) Requirement already satisfied: six in /usr/lib/python3/dist-packages (from pywinrm) (1.16.0) Requirement already satisfied: xmltodict in /usr/lib/python3/dist-packages (from pywinrm) (0.12.0) Building wheels for collected packages: pywinrm Building wheel for pywinrm (setup.py) ... done Created wheel for pywinrm: filename=pywinrm-0.4.3-py2.py3-none-any.whl size=40371 sha256=79802323fbf65b4872d4828f2e6ac1018474ea501aeb1fec84bbdbf59188153e Stored in directory: /tmp/pip-ephem-wheel-cache-nwhbya18/wheels/bf/1a/60/6fcec85d39b2eab779d3e008cd8cf279153104dfb412921e2e Successfully built pywinrm Installing collected packages: pywinrm Attempting uninstall: pywinrm Found existing installation: pywinrm 0.3.0 Not uninstalling pywinrm at /usr/lib/python3/dist-packages, outside environment /usr Can't uninstall 'pywinrm'. No files were found to uninstall. Successfully installed pywinrm-0.4.3 WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv ekzorchik@srv-ansible:~$ ekzorchik@srv-ansible:~$ sudo find / -name "winrm" /usr/local/lib/python3.10/dist-packages/winrm /usr/lib/python3/dist-packages/winrm ekzorchik@srv-ansible:~$
На Windows
системах через заметку "Выполнить ConfigureRemotingForAnsible.ps1 через GPO"
раскатал данный скрипт
посредством групповых политик.
C:\Windows\system32>powershell -command "set-executionpolicy unresticted" C:\Windows\system32>powershell -command "c:\Soft\ConfigureRemotingForAnsible.ps1"
Шаг №2:
Настраиваем Ubuntu 22.04 Server
чтобы подключение с данной системы к Windows
системам в домене происходило на основе Kerberos
аутентификации:
ekzorchik@srv-us2204a:~$ sudo apt-get install python3-dev libkrb5-dev krb5-user -y Default Kerberos version 5 realm: ничего не указываю и нажимаю OK ekzorchik@srv-us2204a:~$ sudo pip install http://github.com/diyan/pywinrm/archive/master.zip#egg=pywinrm ekzorchik@srv-us2204a:~$ sudo pip install pyOpenSSL --upgrade ekzorchik@srv-us2204a:~$ sudo pip install kerberos ekzorchik@srv-us2204a:~$ sudo pip install "pywinrm[kerberos]" ekzorchik@srv-us2204a:~$ sudo pip install "pywinrm[credssp]" ekzorchik@srv-us2204a:~$ sudo pip install "requests-credssp" "requests-kerberos" ekzorchik@srv-us2204a:~$ sudo cp /etc/krb5.conf /etc/krb5.conf.backup ekzorchik@srv-us2204a:~$ sudo rm /etc/krb5.conf ekzorchik@srv-us2204a:~$ sudo nano /etc/krb5.conf [libdefaults] default_realm = POLYGON.LOCAL [realms] POLYGON.LOCAL = { kdc = srv-dc01.polygon.local admin_server = srv-dc01.polygon.local } [domain_realm] .polygon.local = POLYGON.LOCAL polygon.local = POLYGON.LOCAL
Шаг №3:
Проверяю, могу ли я c Ubuntu 22.04 Server
получить kerberos
билет:
ekzorchik@srv-ansible:~$ kinit ekzorchik@POLYGON.LOCAL Password for ekzorchik@POLYGON.LOCAL: указываю пароль 712mbbdr@ и нажимаю клавишу Enter ekzorchik@srv-ansible:~$ klist Ticket cache: FILE:/tmp/krb5cc_1000 Default principal: ekzorchik@POLYGON.LOCAL Valid starting Expires Service principal 08/30/2023 10:59:16 08/30/2023 20:59:16 krbtgt/POLYGON.LOCAL@POLYGON.LOCAL renew until 08/31/2023 10:59:14 ekzorchik@srv-ansible:~$
из вывода выше видно, что билет получен
Удаляю полученный билет через утилиту ниже:
ekzorchik@srv-ansible:~$ kdestroy ekzorchik@srv-ansible:~$ sudo apt-get install libxml2-utils -y ekzorchik@srv-ansible:~$ curl --header "Content-Type: application/soap+xml;charset=UTF-8" --header "WSMANIDENTIFY: unauthenticated" http://10.90.90.3: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 90891 46235 --:--:-- --:--:-- --:--:-- 169k <?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-ansible:~$
Шаг №4:
Формирую обращение через Ansible
посредством Kerberos
билета:
ekzorchik@srv-ansible:~$ sudo mkdir /etc/ansible/windows ekzorchik@srv-ansible:~$ sudo nano /etc/ansible/windows/hosts [windows] wrkst0002.polygon.local ekzorchik@srv-ansible:~$ sudo mkdir /etc/ansible/windows/group_vars ekzorchik@srv-ansible:~$ 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
через модуль win_ping:
ekzorchik@srv-ansible:~$ sudo ansible windows -i /etc/ansible/windows/hosts -m win_ping wrkst0002.polygon.local | SUCCESS => { "changed": false, "ping": "pong" } ekzorchik@srv-ansible:~$
Отлично, подключение через Kerberos
с Ubuntu 22.04
к Windows
системе, рабочей станции успешно проходит посредством доменной учетной записи, Login: ekzorchik (Group: Domain Admins)
Шаг №5:
Создадим каталог где буду располагаться плейбуки необходимые для Администрирования Windows
станций:
ekzorchik@srv-ansible:~$ sudo mkdir /etc/ansible/playbook
Шаг №6:
Рассмотрим модуль копирование файлов с локального сервера на удаленный хост Windows:
ekzorchik@srv-ansible:~$ sudo nano /etc/ansible/playbook/copy.yml - hosts: windows tasks: - name: Copy file win_copy: src: c:\soft\tips_windows10_v1.bat dest: c:\soft\tips_windows10_v2.bat remote_src: yes
Запускаю созданный playbook:
ekzorchik@srv-ansible:~$ sudo ansible-playbook -i /etc/ansible/windows/hosts /etc/ansible/playbook/copy.yml PLAY [windows] ************************************************************************************************************************* TASK [Gathering Facts] ***************************************************************************************************************** ok: [wrkst0002.polygon.local] TASK [Copy file] *********************************************************************************************************************** changed: [wrkst0002.polygon.local] PLAY RECAP ***************************************************************************************************************************** wrkst0002.polygon.local : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 ekzorchik@srv-ansible:~$
Проверяю, отработал ли PlayBook
также подключившись к Windows
системе посредством модуля win_command:
ekzorchik@srv-ansible:~$ sudo ansible windows -i /etc/ansible/windows/hosts -m win_command -a "cmd.exe /c dir c:\soft" wrkst0002.polygon.local | CHANGED | rc=0 >> Volume in drive C is Windows Volume Serial Number is 8ED5-C36F Directory of c:\soft 30.08.2023 11:20 <DIR> . 30.08.2023 11:20 <DIR> .. 06.11.2018 20:21 15 733 ConfigureRemotingForAnsible.ps1 27.03.2023 08:18 3 750 tips_windows10_v1.bat 27.03.2023 08:18 3 750 tips_windows10_v2.bat 23.06.2022 10:27 382 tips_windows_10_wsus_disable_v1.reg 4 File(s) 23 615 bytes 2 Dir(s) 42 893 926 400 bytes free ekzorchik@srv-ansible:~$
Как видно из вывода при использовании модуля win_command
в каталоге C:\Soft
на Windows
системе файл tips_windows10_v1.bat
был скопирован в файл tips_windows10_v2.bat
, т.е. модуль копирования успешно отработал.
На заметку: Благодаря данному модулю я решил задачу по замене nethasp.ini
на рабочих местах, см. заметку "Распространяем nethasp.ini через Ansible"
Шаг №7:
Рассмотрим модуль посредством которому можно отправить на Windows
системы сообщение:
ekzorchik@srv-ansible:~$ sudo nano /etc/ansible/playbook/msg.yml - name: Send Message hosts: windows tasks: - name: message win_msg: # время активности окна display_seconds: 60 msg: Сохраните результаты работы, система будет перезагружена через 5 минут
Результат выполнения PlayBook
для отображения окна с заданным сообщением:
ekzorchik@srv-ansible:~$ sudo ansible-playbook -i /etc/ansible/windows/hosts /etc/ansible/playbook/msg.yml PLAY [Send Message] ******************************************************************************************************************** TASK [Gathering Facts] ***************************************************************************************************************** ok: [wrkst0002.polygon.local] TASK [message] ************************************************************************************************************************* changed: [wrkst0002.polygon.local] PLAY RECAP ***************************************************************************************************************************** wrkst0002.polygon.local : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 ekzorchik@srv-ansible:~$
Шаг №8:
Рассмотрим модель установки msi
пакетов: сперва загрузить msi
файл через модуль win_get_url
, а после задействовать модуль win_package
для его установки:
к примеру, будет производить установку TightVNC
ekzorchik@srv-ansible:~$ sudo nano /etc/ansible/playbook/tightvnc.yml - name: Install TightVNC MSI package hosts: windows tasks: - name: Download TightVNC win_get_url: url: https://www.tightvnc.com/download/2.8.81/tightvnc-2.8.81-gpl-setup-64bit.msi dest: c:\soft\tightvnc-2.8.81-gpl-setup-64bit.msi - name: Install TightVNC MSI win_package: path: c:\soft\tightvnc-2.8.81-gpl-setup-64bit.msi state: present ekzorchik@srv-ansible:~$ sudo ansible-playbook -i /etc/ansible/windows/hosts /etc/ansible/playbook/tightvnc.yml PLAY [Install TightVNC MSI package] **************************************************************************************************** TASK [Gathering Facts] ***************************************************************************************************************** ok: [wrkst0002.polygon.local] TASK [Download TightVNC] *************************************************************************************************************** changed: [wrkst0002.polygon.local] TASK [Install TightVNC MSI] ************************************************************************************************************ changed: [wrkst0002.polygon.local] PLAY RECAP ***************************************************************************************************************************** wrkst0002.polygon.local : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 ekzorchik@srv-ansible:~$ sudo ansible windows -i /etc/ansible/windows/hosts -m win_command -a "cmd.exe /c netstat -a | findstr /I :5900" wrkst0002.polygon.local | CHANGED | rc=0 >> TCP 0.0.0.0:5900 wrkst0002:0 LISTENING ekzorchik@srv-ansible:~$
Отлично пакет TightVNC
успешно установлен, порт 5900
открыт на подключение, т.е. серверная часть удаленного Администрирования запущена и можно через VNC
клиент подключиться к Windows
системе.
На заметку: Если софт который нужно установить нужно установить с указанием каких-либо параметров, то playbook
может выглядеть так:
ekzorchik@srv-ansible:~$ sudo nano /etc/ansible/playbook/tightvnc.yml - name: Install TightVNC MSI package hosts: windows tasks: - name: Download TightVNC win_get_url: url: https://www.tightvnc.com/download/2.8.81/tightvnc-2.8.81-gpl-setup-64bit.msi dest: c:\soft\tightvnc-2.8.81-gpl-setup-64bit.msi - name: Install TightVNC MSI win_package: path: c:\soft\tightvnc-2.8.81-gpl-setup-64bit.msi arguments: /quiet /norestart ADDLOCAL="Server" SERVER_REGISTER_AS_SERVICE=1 SERVER_ADD_FIREWALL_EXCEPTION=1 SERVER_ALLOW_SAS=1 SET_USEVNCAUTHENTICATION=1 VALUE_OF_USEVNCAUTHENTICATION=1 SET_PASSWORD=12345678 VALUE_OF_PASSWORD=12345678 SET_USECONTROLAUTHENTICATION=1 VALUE_OF_USECONTROLAUTHENTICATION=1 SET_CONTROLPASSWORD=1 VALUE_OF_CONTROLPASSWORD=12345678
Шаг №9:
Чтобы удалить приложение, установленное через MSI
, задействуем модуль win_package
, к примеру, удалять будем установленное выше TightVNC
. Сперва на тестовой системе устанавливаем, изучаем документацию дабы выделить ключи, посредством которых из командной строки происходит удаление, а уже после составляем PlayBook.
ekzorchik@srv-ansible:~$ sudo nano /etc/ansible/playbook/tightvncuninstall.yml - name: TightVNC Uninstall hosts: windows tasks: - name: Download TightVNC win_get_url: url: https://www.tightvnc.com/download/2.8.81/tightvnc-2.8.81-gpl-setup-64bit.msi dest: c:\soft\tightvnc-2.8.81-gpl-setup-64bit.msi - name: Uninstall TightVNC MSI win_package: path: c:\soft\tightvnc-2.8.81-gpl-setup-64bit.msi state: absent ekzorchik@srv-ansible:~$ sudo ansible-playbook -i /etc/ansible/windows/hosts /etc/ansible/playbook/tightvncuninstall.yml PLAY [TightVNC Uninstall] ************************************************************************************************************** TASK [Gathering Facts] ***************************************************************************************************************** ok: [wrkst0002.polygon.local] TASK [Download TightVNC] *************************************************************************************************************** ok: [wrkst0002.polygon.local] TASK [Uninstall TightVNC MSI] ********************************************************************************************************** changed: [wrkst0002.polygon.local] PLAY RECAP ***************************************************************************************************************************** wrkst0002.polygon.local : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 ekzorchik@srv-ansible:~$
можно конечно удалить и используя ключи деинсталляции:
ekzorchik@srv-ansible:~$ sudo ansible windows -i /etc/ansible/windows/hosts -m win_command -a "cmd.exe /c wmic product where name=\"TightVNC\" call uninstall /nointeractive" wrkst0002.polygon.local | CHANGED | rc=0 >> Executing (\\WRKST0002\ROOT\CIMV2:Win32_Product.IdentifyingNumber="{20B44B5F-5DDC-4261-BA3E-3EE3D3F2B106}",Name="TightVNC",Version="2.8.81.0")->Uninstall() Method execution successful. Out Parameters: instance of __PARAMETERS { ReturnValue = 0; }; ekzorchik@srv-ansible:~$ ekzorchik@srv-ansible:~$ sudo ansible windows -i /etc/ansible/windows/hosts -m win_command -a "cmd.exe /c REG DELETE HKLM\Software\TightVNC /f" wrkst0002.polygon.local | CHANGED | rc=0 >> The operation completed successfully. ekzorchik@srv-ansible:~$ sudo ansible windows -i /etc/ansible/windows/hosts -m win_command -a "REG DELETE HKLM\Software\Microsoft\Windows\CurrentVersion\Run /v tvncontrol /f" wrkst0002.polygon.local | CHANGED | rc=0 >> The operation completed successfully. ekzorchik@srv-ansible:~$
Шаг №10:
Чтобы установить программное обеспечение (EXE
-файлы), к примеру, скачаем с внешнего доверенного ресурса aspia.exe
и произведем его установку:
ekzorchik@srv-ansible:~$ sudo nano /etc/ansible/playbook/aspiaexe.yml - name: Install Aspia Hosts hosts: windows tasks: - name: Download Aspia Hosts win_get_url: url: http://ekzorchik.ru/out/aspia.exe dest: c:\soft\aspia.exe - name: Install Aspia Hosts win_package: path: c:\soft\aspia.exe product_id: Aspia Hosts ekzorchik@srv-ansible:~$ sudo ansible-playbook -i /etc/ansible/windows/hosts /etc/ansible/playbook/aspiaexe.yml PLAY [Install Aspia Hosts] ************************************************************************************************************* TASK [Gathering Facts] ***************************************************************************************************************** ok: [wrkst0002.polygon.local] TASK [Download Aspia Hosts] ************************************************************************************************************ changed: [wrkst0002.polygon.local] TASK [Install Aspia Hosts] ************************************************************************************************************* changed: [wrkst0002.polygon.local] PLAY RECAP ***************************************************************************************************************************** wrkst0002.polygon.local : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 ekzorchik@srv-ansible:~$
На заметку: В заметке используется aspia.exe файл — это файл который я распросраняю на станции которым нужна моя помощь, чтобы Вам сделать такой же, обратитесь к заметке "Переносная установка Aspia host на Windows систему"
Шаг №11:
Чтобы удалить программное обеспечение (.EXE):
ekzorchik@srv-ansible:~$ sudo nano /etc/ansible/playbook/aspiaexeuninstall.yml - name: Uninstall Aspia Hosts hosts: windows tasks: - name: Kill Aspia Process win_command: cmd.exe /c taskkill /F /IM "aspia_*" - name: Uninstall Aspia Host win_command: cmd.exe /c wmic product where "name like '%Aspia'" call uninstall /nointeractive - name: RMdir Aspia Catalog win_command: cmd.exe /c rmdir /S /Q %programdata%\aspia ekzorchik@srv-ansible:~$ sudo ansible-playbook -i /etc/ansible/windows/hosts /etc/ansible/playbook/aspiaexeuninstall.yml PLAY [Uninstall Aspia Hosts] *********************************************************************************************************** TASK [Gathering Facts] ***************************************************************************************************************** ok: [wrkst0002.polygon.local] TASK [Kill Aspia Process] ************************************************************************************************************** changed: [wrkst0002.polygon.local] TASK [Uninstall Aspia Host] ************************************************************************************************************ changed: [wrkst0002.polygon.local] TASK [RMdir Aspia Catalog] ************************************************************************************************************* changed: [wrkst0002.polygon.local] PLAY RECAP ***************************************************************************************************************************** wrkst0002.polygon.local : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 ekzorchik@srv-ansible:~$
Шаг №12:
Остановить/Запустить/Перезапустить службу Windows:
к примеру служба wuauserv
ekzorchik@srv-ansible:~$ sudo nano /etc/ansible/playbook/services.yml - name: Services hosts: windows tasks: - name: Stop Services win_service: name: wuauserv start_mode: disabled state: stopped ekzorchik@srv-ansible:~$ sudo ansible-playbook -i /etc/ansible/windows/hosts /etc/ansible/playbook/services.yml
На заметку: В общем чем больше ставить себе задаче с целью выполнить их через Ansible
то, тем больше будет заморочек разобрать работу составления PlayBook
в дальнейшем.
На заметку: Разбирайте все что есть по Ansible
и как другие пишут свои Playbook
, учитесь у других, перенимайте опыт и ваши знания буду улучшаться, не забываем читать книги которые можно скачать на Telegram
канале https://t.me/ekzbook
Подведём итог, самое базовое я рассмотрел, как и говорил в самом начале, то заметка не окончательна и будет дописываться, а пока даже такого начала вполне достаточно чтобы оценить на сколько все интересно с его помощью настраивать. Если Вам это интересно в первую очередь.
На этом заметка завершена, с уважением автор блога Олло Александр aka ekzorchik.