Задача: Хочу все конфигурирование/подконфигурирование 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:~$

Окно сообщения на Windows системе с длительностью отображения

Шаг №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

Сервис wuauserv остановлен через Ansible

На заметку: В общем чем больше ставить себе задаче с целью выполнить их через Ansible то, тем больше будет заморочек разобрать работу составления PlayBook в дальнейшем.

На заметку: Разбирайте все что есть по Ansible и как другие пишут свои Playbook, учитесь у других, перенимайте опыт и ваши знания буду улучшаться, не забываем читать книги которые можно скачать на Telegram канале https://t.me/ekzbook

Подведём итог, самое базовое я рассмотрел, как и говорил в самом начале, то заметка не окончательна и будет дописываться, а пока даже такого начала вполне достаточно чтобы оценить на сколько все интересно с его помощью настраивать. Если Вам это интересно в первую очередь.

На этом заметка завершена, с уважением автор блога Олло Александр aka ekzorchik.