9 Przykładowe podręczniki Ansible dla administracji Windows

Photo of author

By maciekx

Chciałbym przedstawić kilka operacji, które administrator systemu może wykonywać na zdalnym systemie Windows z wykorzystaniem ansible-playbook.

Ansible to jedno z najpopularniejszych narzędzi DevOps dostępnych na rynku. Oferuje wiele modułów dedykowanych dla systemu Windows, które umożliwiają konfigurację i zarządzanie serwerami Windows. Zakładam, że masz już zainstalowane Ansible na systemie, z którego zamierzasz zarządzać swoimi serwerami Windows.

Poniżej znajdziesz przykłady często wykonywanych zadań przez administratorów systemów Windows. Zobaczysz, jak proste jest zarządzanie systemem Windows za pomocą Ansible.

Mój kontroler Ansible Windows ma adres IP 192.168.0.106, natomiast zdalny system Windows ma przypisany adres 192.168.0.102. Przed przystąpieniem do pracy, upewnij się, że moduł `win_ping` działa poprawnie i że masz połączenie ze zdalnym serwerem.

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

Potwierdzono, że połączenie ze zdalnym hostem przebiegło bez problemów.

Przejdźmy zatem do konkretnych zastosowań Ansible…

Kopiowanie plików

`win_copy` to moduł Ansible służący do kopiowania plików z serwera lokalnego na zdalny host Windows. Wykorzystam go do przesłania pojedynczego pliku PDF.

Użyj poniższego kodu YAML, pamiętając o uzupełnieniu ścieżek źródłowych i docelowych.

[email protected] ~
$ vi copy.yml
---
- hosts: win
  tasks:
  - name: Copy File
    win_copy:
      src: C:output.pdf
      dest: C:ansible_examples
      remote_src: yes

Uruchom `ansible-playbook` dla operacji kopiowania.

[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

Plik został pomyślnie przesłany do docelowej lokalizacji w zdalnym systemie Windows.

Instalacja i deinstalacja pakietów MSI

Aby zainstalować aplikację z użyciem pliku MSI, najpierw użyj `win_get_url` aby pobrać plik MSI, a następnie modułu `win_package` do instalacji. Określenie stanu „present” zapewnia, że plik MSI zostanie zainstalowany na komputerze, a aplikacja będzie w stanie „obecna”.

W tym przykładzie zainstaluję Apache.

Oto kod 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

Uruchom `ansible-playbook`, aby zainstalować pakiet 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

Sprawdź na docelowym systemie Windows, czy Apache zostało poprawnie zainstalowane.

C:Usersnewsblog.pl>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

Aplikacje można również instalować za pomocą MSI z dodatkowymi argumentami. Poniższy przykład demonstruje instalację Apache z użyciem argumentu „install” zamiast stanu.

Kod YAML do użycia:

---
- 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

Aby odinstalować aplikację za pomocą pliku MSI, użyj ponownie modułu `win_package`, a stan „absent” spowoduje deinstalację aplikacji.

W tym przypadku odinstaluję 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

Uruchom `ansible-playbook`, aby zdeinstalować pakiet 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

Po sprawdzeniu wersji Apache otrzymamy informację, że aplikacja została odinstalowana.

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.

Deinstalacja oprogramowania (.EXE)

Możesz również odinstalować oprogramowanie, korzystając z pliku .exe i identyfikatora produktu tego oprogramowania.

[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

Uruchom `ansible-playbook`, aby odinstalować 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

Zatrzymywanie, uruchamianie i ponowne uruchamianie usług Windows

Moduł `win_service` w Ansible pozwala na uruchamianie, zatrzymywanie i ponowne uruchamianie usług. Pokażę teraz, jak zatrzymać usługę Tomcat.

W pliku YAML musisz podać nazwę usługi i ustawić stan na „stopped”.

[email protected] ~
$ vi service.yml
---
- hosts: win
  tasks:
   - name: Stop service Tomcat
     win_service:
       name: Tomcat8
       state: stopped

Uruchom `ansible-playbook`, aby zatrzymać usługę 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

Po sprawdzeniu usług w systemie Windows zobaczysz, że Tomcat jest w stanie zatrzymania.

Możesz ustawić stan na „started”, „restarted” lub „paused” aby zmienić status usługi.

Pobieranie faktów

Używając modułu `win_disk_facts` możesz pozyskać informacje o dyskach zdalnego hosta.

[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'

Uruchom `ansible-playbook`, aby uzyskać informacje o dysku.

[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

Moduł `win_command` pozwala na wykonywanie poleceń na zdalnym hoście i uzyskiwanie szczegółowych danych o procesorze, urządzeniach i innych.

[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 }}"

Uruchom `ansible-playbook`, aby uzyskać informacje o systemie.

[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

Wykonywanie poleceń

Wszystkie polecenia uruchamiane w oknie wiersza poleceń mogą być wykonywane za pomocą modułu `win_command`. W pliku YAML podaj konkretne polecenie. W przykładzie tworzę nowy katalog.

[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

Uruchom `ansible-playbook`, aby wykonać operacje przy użyciu `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

Zmienne środowiskowe

System Windows ma wiele zmiennych środowiskowych, takich jak JAVA_HOME. Za pomocą modułu `win_environment` można dodawać i modyfikować zmienne środowiskowe. Poniżej dodaję nową zmienną do listy zmiennych środowiskowych systemu Windows.

[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

Uruchom `ansible-playbook`, aby dodać nową zmienną środowiskową.

[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

Przejdź do ustawień zmiennych środowiskowych, a zobaczysz nową zmienną, którą właśnie dodałeś.

Dodawanie i edycja rejestru

Moduł `win_regedit` służy do dodawania i edytowania wpisów w rejestrze zdalnego systemu Windows. Musisz podać ścieżkę do rejestru i dane, które chcesz dodać lub zaktualizować. W przykładzie tworzę nowy wpis „newsblog.pl” w ścieżce „HKLM:SOFTWARE”, a następnie dodaję do niego nazwę i dane.

[email protected] ~
$ vi registry.yml
---
- hosts: win
  tasks:
   - name: Creating a registry
     win_regedit:
      path: HKLM:SOFTWAREnewsblog.pl
   - name: Modifying a registry, adding name and data
     win_regedit:
      path: HKLM:SOFTWAREnewsblog.pl
      name: Geek
      data: Flare

Uruchom `ansible-playbook`, aby dodać nowy wpis do rejestru.

[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

Po przejściu do edytora rejestru na zdalnym systemie, znajdziesz nowy rejestr z dodanymi parametrami Name i Data.

Usuwanie dzienników zdarzeń

Moduł `win_eventlog` pozwala na dodawanie, czyszczenie i usuwanie dzienników zdarzeń systemu Windows.

Uruchom PowerShell i wyświetl listę dostępnych dzienników zdarzeń.

PS C:Usersnewsblog.pl> 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

Pokażę teraz, jak usunąć logi ze wszystkich źródeł dla Internet Explorera.

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

Uruchom `ansible-playbook`, aby usunąć dzienniki Internet Explorera.

[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

Po ponownym wyświetleniu dzienników zdarzeń zauważysz, że wpisy związane z Internet Explorerem zostały usunięte.

PS C:Usersnewsblog.pl> 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

To były przykłady playbooków Ansible wykorzystywanych do zdalnej administracji systemem Windows. Zachęcam do przetestowania tych przykładów. Możesz również wypróbować inne moduły Ansible dla Windows.


newsblog.pl