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.