Představím vám několik operací, které administrátor může provádět na vzdáleném systému Windows pomocí Ansible playbooků.
Ansible se v současnosti řadí mezi nejpopulárnější nástroje DevOps na trhu. Nabízí rozsáhlou sadu modulů pro systémy Windows, které se používají ke konfiguraci a správě serverů s tímto operačním systémem. Předpokládám, že máte Ansible již nainstalovaný na počítači s Windows, ze kterého chcete spravovat vzdálené servery Windows.
Následují příklady některých často používaných úloh, které správci systémů Windows provádějí každý den. Možná budete překvapeni, jak snadno lze Windows spravovat pomocí Ansible.
IP adresa mého počítače s Ansible, který bude provádět správu, je 192.168.0.106, a IP adresa mého vzdáleného systému Windows je 192.168.0.102. Před zahájením se ujistěte, že jste úspěšně spustili modul win_ping, abyste ověřili, že se dokážete připojit ke vzdálenému serveru Windows.
[email protected] ~ $ ansible win -m win_ping 192.168.0.102 | SUCCESS => { "changed": false, "ping": "pong" }
Mé spojení se vzdáleným hostitelem je tedy úspěšné.
Začněme tedy pracovat s Ansible Playbooky…
Kopírování souborů
Modul `win_copy` umožňuje zkopírovat soubor z místního serveru na vzdálený hostitel Windows. Tento modul využiji pro kopírování souboru PDF.
Níže je uveden příklad kódu YAML, ve kterém musíte specifikovat zdrojovou a cílovou cestu.
[email protected] ~ $ vi copy.yml --- - hosts: win tasks: - name: Copy File win_copy: src: C:output.pdf dest: C:ansible_examples remote_src: yes
Pro spuštění kopírování souboru použijte příkaz `ansible-playbook` s výše uvedeným YAML souborem.
[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
Soubor byl úspěšně zkopírován do cílové lokace na vzdáleném systému Windows.
Instalace a odinstalace MSI
Pro instalaci aplikace pomocí souboru MSI je nutné nejprve stáhnout soubor MSI pomocí modulu `win_get_url` a poté jej nainstalovat s pomocí modulu `win_package`. Stav `present` zajistí, že MSI bude nainstalováno a aplikace bude v aktuálním stavu.
V tomto příkladu instaluji aplikaci Apache.
Následující YAML kód je potřeba použít:
[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
Pro spuštění instalace pomocí MSI použijte příkaz `ansible-playbook` s definovaným YAML souborem.
[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
Nyní se můžete přihlásit do systému Windows a ověřit, zda byla aplikace Apache úspěšně nainstalována.
C:Usersetechblog.cz>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
Aplikaci můžete nainstalovat pomocí MSI také s definovanými argumenty. Níže je uveden stejný příklad jako výše, ale místo stavu `present` používáme argumenty `/install` pro instalaci Apache.
YAML kód pro tento případ:
--- - 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
Pro odinstalaci aplikace pomocí souboru MSI je nutné použít modul `win_package`. Stav `absent` zajistí, že aplikace bude odinstalována pomocí souboru MSI.
Zde odinstaluji aplikaci 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
Spusťte `ansible-playbook` s definovaným YAML souborem pro odinstalaci pomocí 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
Nyní po kontrole verze Apache byste měli obdržet výstup, který potvrzuje, že aplikace byla odinstalována.
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.
Odinstalace software (.EXE)
Můžete odinstalovat software i pomocí souboru .exe, a to za použití ID produktu tohoto softwaru.
[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
Spusťte Ansible playbook pro odinstalaci 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
Zastavení, spuštění a restartování služeb Windows
Modul `win_service` Ansible se používá pro spouštění, zastavování nebo restartování služeb. Ukážu vám, jak zastavit službu Tomcat.
V YAML souboru musíte zadat název služby a nastavit stav na `stopped`.
[email protected] ~ $ vi service.yml --- - hosts: win tasks: - name: Stop service Tomcat win_service: name: Tomcat8 state: stopped
Spusťte `ansible-playbook` pro zastavení služby 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
Pokud zkontrolujete službu Tomcat v systému Windows, bude nyní ve stavu „Zastaveno“.
Pro změnu stavu služby můžete nastavit stav na `started`, `restarted` nebo `paused`.
Získávání informací o disku
Modul Ansible `win_disk_facts` umožňuje získat veškeré informace o discích cílového hostitele.
[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'
Spusťte `ansible-playbook` pro získání informací o disku.
[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
Pomocí modulu `win_command` Ansible můžete spouštět příkazy na vzdáleném hostiteli a získávat informace o CPU, podrobnosti o zařízení a mnoho dalšího.
[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 }}"
Spusťte `ansible-playbook` pro získání informací o vzdáleném systému.
[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
Spouštění příkazů
Jakékoli příkazy, které spouštíte v okně příkazové řádky, můžete spouštět i prostřednictvím modulu `win_command` Ansible. Stačí zadat příkaz v souboru YAML. Zde vytvářím nový adresář.
[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
Spusťte `ansible-playbook` pro provedení operací pomocí `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
Proměnné prostředí
Systém Windows má mnoho proměnných prostředí, například `JAVA_HOME`. Modul `win_environment` Ansible umožňuje přidávat nebo upravovat proměnné prostředí v systému Windows. V tomto příkladu přidávám novou proměnnou do seznamu proměnných prostředí.
[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
Spusťte `ansible-playbook` pro přidání proměnné prostředí na vzdáleném počítači s 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
Přejděte do okna proměnných prostředí; uvidíte, že nová proměnná, kterou jste právě přidali, je zde přítomna.
Přidání nebo úprava registru
Modul `win_regedit` Ansible se používá pro přidávání nebo úpravu podrobností registru na vzdáleném počítači Windows. Musíte zadat cestu k registru a obsah, který se má přidat/aktualizovat. Zde vytvářím novou položku registru `etechblog.cz` v cestě `HKLM:SOFTWARE` a následně do tohoto registru přidávám název a data.
[email protected] ~ $ vi registry.yml --- - hosts: win tasks: - name: Creating a registry win_regedit: path: HKLM:SOFTWAREetechblog.cz - name: Modifying a registry, adding name and data win_regedit: path: HKLM:SOFTWAREetechblog.cz name: Geek data: Flare
Spusťte `ansible-playbook` pro přidání záznamu registru.
[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
Pokud přejdete do Editoru registru ve vzdáleném systému, uvidíte, že tento záznam registru byl úspěšně přidán s parametry „Název“ a „Data“.
Smazání protokolů událostí
Modul `win_eventlog` Ansible se používá pro přidávání, mazání nebo odstraňování protokolů událostí systému Windows ze systému Windows.
Přihlaste se do prostředí Windows Powershell a vypište seznam EventLogs na vzdáleném počítači s Windows.
PS C:Usersetechblog.cz> 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
Nyní ukážu, jak odstranit protokoly ze všech zdrojů pro Internet Explorer.
[email protected] ~ $ vi log.yml --- - hosts: win tasks: - name: Remove Internet Explorer Logs win_eventlog: name: Internet Explorer state: absent
Spusťte `ansible-playbook` pro odstranění protokolů Internet Exploreru ze vzdáleného počítače 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
Pokud nyní znovu vypíšete `EventLogs`, uvidíte, že protokoly Internet Exploreru byly odstraněny.
PS C:Usersetechblog.cz> 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 je vše, co se týče Ansible playbooků, které lze využít pro vzdálenou správu systémů Windows. Neváhejte si vyzkoušet tyto příklady. Můžete se podívat i na další moduly Ansible pro Windows, které jsou k dispozici.