Приклад 9 Ansible Playbooks для адміністрування Windows

У цій статті я продемонструю вам декілька операцій, які адміністратор може виконувати на віддаленій системі Windows, використовуючи плейбуки Ansible.

Ansible – це один з провідних інструментів DevOps, який активно застосовується сьогодні. Він пропонує набір модулів для Windows, які дозволяють налаштовувати та керувати серверами Windows. Припустимо, що у вас вже встановлено Ansible на вашій машині з Windows, з якої ви плануєте керувати серверами Windows.

Далі наведено перелік типових завдань, які щоденно виконують системні адміністратори Windows. Ви будете вражені, наскільки зручно та ефективно можна керувати Windows за допомогою Ansible.

Мій комп’ютер з Ansible має IP-адресу 192.168.0.106, а IP-адреса віддаленої Windows машини – 192.168.0.102. Перш ніж почати, переконайтеся, що ви запустили модуль `win_ping`, щоб підтвердити з’єднання з віддаленим сервером Windows.

[email protected] ~
$ ansible win -m win_ping
192.168.0.102 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

З’єднання з віддаленим хостом успішно встановлено.

Отже, розпочнемо з плейбуків Ansible…

Копіювання файлів

Модуль `win_copy` в Ansible дозволяє копіювати файли з локального сервера на віддалений хост Windows. Я скористаюся цим модулем для копіювання файлу PDF.

Скопіюйте наведений нижче код YAML, вказавши правильні шляхи до джерела та місця призначення.

[email protected] ~
$ vi copy.yml
---

- hosts: win

  tasks:

  - name: Copy File

    win_copy:

      src: C:output.pdf

      dest: C:ansible_examples
     
      remote_src: yes

Запустіть плейбук Ansible для копіювання.

[email protected] ~
$ ansible-playbook copy.yml

PLAY [win] ***********************************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************************
ok: [192.168.0.102]

TASK [Copy File] *****************************************************************************************************************************
changed: [192.168.0.102]

PLAY RECAP ***********************************************************************************************************************************
192.168.0.102
: ok=2 changed=1 unreachable=0 failed=0
skipped=0 rescued=0 ignored=0

Файл був успішно скопійований до цільової директорії на віддаленій системі Windows.

Інсталяція/Видалення MSI

Для інсталяції програми з файлу MSI, вам необхідно спочатку використовувати `win_get_url` для завантаження файлу MSI, а потім скористатися модулем `win_package` для її встановлення. Статус “present” гарантує, що MSI буде інстальовано, а програма буде у потрібному стані.

У цьому прикладі я інсталюю Apache.

YAML код для використання:

[email protected] ~
$ vi msi.yml
---
- name: Installing Apache MSI 
  hosts: win 
 
  tasks:
    - name: Download the Apache installer
      win_get_url:
        url: https://archive.apache.org/dist/httpd/binaries/win32/httpd-2.2.25-win32-x86-no_ssl.msi
        dest: C:ansible_exampleshttpd-2.2.25-win32-x86-no_ssl.msi

    - name: Install MSI
      win_package: 
        path: C:ansible_exampleshttpd-2.2.25-win32-x86-no_ssl.msi
        state: present

Запустіть плейбук Ansible для інсталяції за допомогою MSI.

[email protected] ~
$ ansible-playbook msi.yml

PLAY [Installing Apache MSI] *****************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************************
ok: [192.168.0.102]

TASK [Download the Apache installer] *********************************************************************************************************
changed: [192.168.0.102]

TASK [Install MSI] ***************************************************************************************************************************
changed: [192.168.0.102]

PLAY RECAP ***********************************************************************************************************************************
192.168.0.102
: ok=3 changed=2 unreachable=0 failed=0
skipped=0 rescued=0 ignored=0

Перевірте на віддаленій системі Windows, чи Apache успішно інстальовано.

C:Userstechukraine.net>cd C:Program Files (x86)Apache Software FoundationApache2.2bin
C:Program Files (x86)Apache Software FoundationApache2.2bin>httpd -v
Server version: Apache/2.2.25 (Win32)
Server built: Jul 10 2013 01:52:12

Ви також можете інсталювати програми з MSI, використовуючи аргументи. Нижче наведено той самий приклад, де ми використовуємо аргумент установки замість статусу.

YAML код для використання:

---

- name: Installing Apache MSI 

  hosts: win 

  tasks:

    - name: Download the Apache installer

      win_get_url:

        url: https://archive.apache.org/dist/httpd/binaries/win32/httpd-2.2.25-win32-x86-no_ssl.msi

        dest: C:ansible_exampleshttpd-2.2.25-win32-x86-no_ssl.msi


    - name: Install MSI

      win_package: 

        path: C:ansible_exampleshttpd-2.2.25-win32-x86-no_ssl.msi

        arguments:

          - /install

          - /passive

          - /norestart

Для видалення програми з файлу MSI, необхідно використати модуль `win_package` зі статусом “absent”, що вказує на видалення.

Ось приклад видалення Apache.

[email protected] ~
$ vi uninstall_msi.yml

---

- name: UnInstalling Apache MSI 

  hosts: win 

  tasks:

    - name: UnInstall MSI

      win_package: 

        path: C:ansible_exampleshttpd-2.2.25-win32-x86-no_ssl.msi

        state: absent

Запустіть плейбук Ansible для видалення за допомогою MSI.

[email protected] ~
$ ansible-playbook uninstall_msi.yml

PLAY [UnInstalling Apache MSI] *****************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************************
ok: [192.168.0.102]

TASK [UnInstall MSI] *************************************************************************************************************************
changed: [192.168.0.102]

PLAY RECAP ***********************************************************************************************************************************
192.168.0.102
: ok=2 changed=1 unreachable=0 failed=0
skipped=0 rescued=0 ignored=0

Тепер, якщо ви перевірите версію Apache, ви отримаєте наведений нижче результат, оскільки програма була успішно видалена.

C:Program Files (x86)Apache Software FoundationApache2.2bin>httpd -v 'httpd' is not recognized as an internal or external command,
operable program or batch file.

Видалення програмного забезпечення (.EXE)

Програмне забезпечення можна видаляти, використовуючи файл .exe та ідентифікатор продукту.

[email protected] ~
$ vi uninstall.yml 
---

- hosts: win 

  tasks:

   - name: Uninstall 7-Zip from the exe

     win_package:

       path: C:Program Files7-ZipUninstall.exe

       product_id: 7-Zip

       arguments: /S

       state: absent

Запустіть плейбук Ansible для видалення 7-Zip.

[email protected] ~
$ ansible-playbook uninstall.yml

PLAY [win] *************************************************************************************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************************************************************************
ok: [192.168.0.102]

TASK [Uninstall 7-Zip from the exe] ***********************************************************************************************************************************************************
changed: [192.168.0.102]

PLAY RECAP *************************************************************************************************************************************************************************************
192.168.0.102              : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Зупинка/запуск/перезапуск служб Windows

Модуль `win_service` використовується для керування службами Windows: запуску, зупинки або перезапуску. Тут я продемонструю, як зупинити службу tomcat.

У файлі YAML вкажіть ім’я служби та встановіть статус на `stopped`.

[email protected] ~
$ vi service.yml
---
- hosts: win 

  tasks: 

   - name: Stop service Tomcat

     win_service:

       name: Tomcat8

       state: stopped

Запустіть плейбук Ansible, щоб зупинити службу tomcat.

[email protected] ~
$ ansible-playbook service.yml

PLAY [win] ***********************************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************************
ok: [192.168.0.102]

TASK [Stop service Tomcat] ****************************************************************************************************************
changed: [192.168.0.102]

PLAY RECAP ***********************************************************************************************************************************
192.168.0.102
: ok=2 changed=1 unreachable=0 failed=0
skipped=0 rescued=0 ignored=0

Якщо перевірити службу tomcat в системі Windows, її стан буде “зупинено”.

Ви можете встановити стан на `started`, `restarted` або `paused` для зміни статусу служби.

Збір фактів

Використовуючи модуль `win_disk_facts`, ви можете отримати детальну інформацію про диски цільового хоста.

[email protected] ~
$ vi disk.yml
---
- hosts: win 
  tasks: 
  - name: Get disk facts
    win_disk_facts:

  - name: Output first disk size
    debug:
      var: ansible_facts.disks[0].size

  - name: Convert first system disk into various formats
    debug:
      msg: '{{ disksize_gib }} vs {{ disksize_gib_human }}'
    vars:
      # Get first system disk
      disk: '{{ ansible_facts.disks|selectattr("system_disk")|first }}'

      # Show disk size in Gibibytes
      disksize_gib_human: '{{ disk.size|filesizeformat(true) }}' 
      disksize_gib: '{{ (disk.size/1024|pow(3))|round|int }} GiB'

Запустіть плейбук Ansible для отримання інформації про диски.

[email protected] ~
$ ansible-playbook disk.yml

PLAY [win] ***********************************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************************
ok: [192.168.0.102]

TASK [Get disk facts] ************************************************************************************************************************
ok: [192.168.0.102]

TASK [Output first disk size] ****************************************************************************************************************
ok: [192.168.0.102] => {

"ansible_facts.disks[0].size": "1000204886016"
}

TASK [Convert first system disk into various formats] ****************************************************************************************
ok: [192.168.0.102] => {
"msg": "932 GiB vs 931.5 GiB"
}

PLAY RECAP ***********************************************************************************************************************************
192.168.0.102
: ok=4 changed=0 unreachable=0 failed=0
skipped=0 rescued=0 ignored=0

За допомогою модуля `win_command` можна виконувати команди на віддаленому хості, отримуючи інформацію про процесор, пристрої та іншу системну інформацію.

[email protected] ~
$ vi check.yml
---
- hosts: win 
  tasks:
   - name: Get disk facts
     win_command: wmic cpu get caption, deviceid, name, numberofcores, maxclockspeed, status
     register: usage

   - debug: msg="{{ usage.stdout }}"

Запустіть плейбук Ansible для отримання інформації про віддалену систему.

[email protected] ~
$ ansible-playbook check.yml

PLAY [win] ***********************************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************************
ok: [192.168.0.102]

TASK [Get facts] ************************************************************************************************************************
changed: [192.168.0.102]

TASK [debug] *********************************************************************************************************************************
ok: [192.168.0.102] => {
"msg": "Caption DeviceID MaxClockSpeed
Name
NumberOfCores Status rrnIntel64 Family 6 Model 142 Stepping 9 CPU0 2712 Intel(R) Core(TM) i5-7200U CPU @ 2.50GHz 2 OK rrnrrn"
}

PLAY RECAP ***********************************************************************************************************************************
192.168.0.102
: ok=3 changed=1 unreachable=0 failed=0
skipped=0 rescued=0
ignored=0

Виконання команд

Будь-які команди, які ви виконуєте у вікні терміналу, можна виконати через модуль Ansible `win_command`. Потрібно лише вказати команду у вашому YAML файлі. Наприклад, нижче ми створюємо каталог.

[email protected] ~
$ vi commands.yml
---

- hosts: win 

  tasks:

   - name: run an executable using win_command

     win_command: whoami.exe


   - name: run a cmd command

      win_command: cmd.exe /c mkdir C:test

Запустіть плейбук Ansible для виконання операції `win_command`.

[email protected] ~
$ ansible-playbook commands.yml

PLAY [win] ***********************************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************************
ok: [192.168.0.102]

TASK [run an executable using win_command] ***************************************************************************************************
changed: [192.168.0.102]

TASK [run a cmd command] *********************************************************************************************************************
changed: [192.168.0.102]

PLAY RECAP ***********************************************************************************************************************************
192.168.0.102
: ok=3 changed=2 unreachable=0 failed=0
skipped=0 rescued=0 ignored=0

Змінні середовища

Система Windows має різноманітні змінні середовища, такі як `JAVA_HOME`. За допомогою модуля Ansible `win_environment` можна додавати або змінювати ці змінні. В цьому прикладі, я створюю нову змінну.

[email protected] ~
$ vi env.yml
---
- hosts: win 
  tasks:
   - name: Set an environment variable for all users
     win_environment:
       state: present
       name: NewVariable
       value: New Value
       level: machine

Запустіть плейбук Ansible для додавання змінної середовища на віддаленій машині Windows.

[email protected] ~
$ ansible-playbook env.yml

PLAY [win] ***********************************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************************
ok: [192.168.0.102]

TASK [Set an environment variable for all users] *********************************************************************************************
changed: [192.168.0.102]

PLAY RECAP ***********************************************************************************************************************************
192.168.0.102
: ok=2 changed=1 unreachable=0 failed=0
skipped=0 rescued=0 ignored=0

Перейдіть до вікна змінних середовища, і ви побачите нову додану змінну.

Додавання/редагування реєстру

Модуль Ansible `win_regedit` використовується для додавання або редагування записів в реєстрі віддаленої машини Windows. Вам необхідно вказати шлях до реєстру та дані, які необхідно додати чи оновити. У цьому прикладі я створюю новий запис реєстру `techukraine.net` за шляхом `HKLM:SOFTWARE`, потім додаю ім’я та дані до цього реєстру.

[email protected] ~
$ vi registry.yml
---

- hosts: win 

  tasks:

   - name: Creating a registry

     win_regedit:

      path: HKLM:SOFTWAREtechukraine.net

   - name: Modifying a registry, adding name and data

     win_regedit:

      path: HKLM:SOFTWAREtechukraine.net

      name: Geek

      data: Flare

Запустіть плейбук Ansible для додавання реєстру.

[email protected] ~
$ ansible-playbook registry.yml

PLAY [win] ***********************************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************************
ok: [192.168.0.102]

TASK [Creating a registry] *******************************************************************************************************************
changed: [192.168.0.102]

TASK [Modifying a registry, adding name and data] ********************************************************************************************
changed: [192.168.0.102]

PLAY RECAP ***********************************************************************************************************************************
192.168.0.102
: ok=3 changed=2 unreachable=0 failed=0
skipped=0 rescued=0 ignored=0

Якщо ви перейдете до редактора реєстру на віддаленій системі, ви побачите, що необхідний реєстр успішно створено з вказаними параметрами.

Видалення журналу

Модуль Ansible `win_eventlog` застосовується для додавання, очищення або видалення журналів подій Windows.

Відкрийте Windows Powershell і перегляньте журнали подій на віддаленій машині Windows.

PS C:Userstechukraine.net> Get-EventLog -List                                                                                 
  Max(K) Retain OverflowAction        Entries Log
  ------ ------ --------------        ------- ---
  20,480      0 OverwriteAsNeeded      33,549 Application
  20,480      0 OverwriteAsNeeded           0 HardwareEvents
     512      7 OverwriteOlder             20 Internet Explorer
  20,480      0 OverwriteAsNeeded           0 Key Management Service
     128      0 OverwriteAsNeeded         190 OAlerts
                                              Security
  20,480      0 OverwriteAsNeeded      44,828 System
  15,360      0 OverwriteAsNeeded       3,662 Windows PowerShell

Нижче показано, як видалити журнали з усіх джерел для Internet Explorer.

[email protected] ~
$ vi log.yml
---
- hosts: win 
  tasks:
   - name: Remove Internet Explorer Logs
     win_eventlog:
      name: Internet Explorer
      state: absent

Запустіть плейбук Ansible для видалення журналів Internet Explorer з віддаленої машини Windows.

[email protected] ~
$ ansible-playbook log.yml

PLAY [win] *************************************************************************************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************************************************************************
ok: [192.168.0.102]

TASK [Remove Internet Explorer Logs] **********************************************************************************************************************************************
changed: [192.168.0.102]

PLAY RECAP *************************************************************************************************************************************************************************************
192.168.0.102              : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Після повторного переліку журналів подій, ви побачите, що журнали Internet Explorer було видалено.

PS C:Userstechukraine.net> Get-EventLog -List

  Max(K) Retain OverflowAction        Entries Log
  ------ ------ --------------        ------- ---
  20,480      0 OverwriteAsNeeded      33,549 Application
  20,480      0 OverwriteAsNeeded           0 HardwareEvents
  20,480      0 OverwriteAsNeeded           0 Key Management Service
     128      0 OverwriteAsNeeded         190 OAlerts
                                              Security
  20,480      0 OverwriteAsNeeded      44,835 System
  15,360      0 OverwriteAsNeeded          56 Windows PowerShell

Отже, це базові приклади використання Ansible для віддаленого адміністрування Windows. Спробуйте ці плейбуки, а також інші модулі Ansible для Windows, які доступні для вас.