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
Maciej – redaktor, pasjonat technologii i samozwańczy pogromca błędów w systemie Windows. Zna Linuxa lepiej niż własną lodówkę, a kawa to jego główne źródło zasilania. Pisze, testuje, naprawia – i czasem nawet wyłącza i włącza ponownie. W wolnych chwilach udaje, że odpoczywa, ale i tak kończy z laptopem na kolanach.