9 Ansible Playbooks Exempel för Windows-administration

By rik

Här kommer jag att demonstrera olika operationer som en systemadministratör kan genomföra på ett Windows-system via fjärråtkomst med hjälp av Ansible playbooks.

Ansible är ett av de mest framstående DevOps-verktygen på dagens marknad. Det erbjuder en uppsättning Windows-moduler som underlättar konfiguration och hantering av Windows-servrar. Jag förutsätter att Ansible redan är installerat på den maskin där du avser att administrera dina Windows-servrar.

Nedan följer några av de vanligaste åtgärderna som Windows-administratörer utför dagligen. Du kommer sannolikt att upptäcka hur enkelt det är att administrera Windows med Ansible.

Min Ansible-kontrollmaskin har IP-adressen 192.168.0.106, och det fjärranslutna Windows-systemets IP-adress är 192.168.0.102. Innan du går vidare, verifiera anslutningen till fjärrservern genom att köra win_ping-modulen.

användare@dator ~
$ ansible win -m win_ping
192.168.0.102 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

Anslutningen till fjärrvärden har bekräftats.

Låt oss nu börja arbeta med Ansible Playbooks…

Filkopiering

Modulen `win_copy` är idealisk för att överföra filer från den lokala servern till en Windows-värd via fjärranslutning. Jag ska använda den här modulen för att kopiera en PDF-fil.

Använd följande YAML-kod och ange käll- och destinationssökvägar.

användare@dator ~
$ vi copy.yml
---
- hosts: win
  tasks:
  - name: Kopiera fil
    win_copy:
      src: C:\output.pdf
      dest: C:\ansible_examples
      remote_src: yes

Starta Ansible-playbook för `win_copy`.

användare@dator ~
$ ansible-playbook copy.yml
PLAY [win] ***********************************************************************************************************************************
TASK [Samlar fakta] ***********************************************************************************************************************
ok: [192.168.0.102]
TASK [Kopiera fil] *****************************************************************************************************************************
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

Filen har framgångsrikt kopierats till den avsedda platsen på det fjärranslutna Windows-systemet.

Installation/Avinstallation av MSI

För att installera ett program med hjälp av en MSI-fil, använd först `win_get_url` för att specificera sökvägen till MSI-filen som ska laddas ned. Därefter, använd modulen `win_package` för att genomföra installationen. Parametern ”state: present” säkerställer att MSI installeras och att applikationen är i aktivt tillstånd.

I detta exempel kommer jag att installera Apache.

YAML-kod för detta:

användare@dator ~
$ vi msi.yml
---
- name: Installera Apache MSI
  hosts: win
  tasks:
    - name: Ladda ner Apache-installationsprogrammet
      win_get_url:
        url: https://archive.apache.org/dist/httpd/binaries/win32/httpd-2.2.25-win32-x86-no_ssl.msi
        dest: C:\ansible_examples\httpd-2.2.25-win32-x86-no_ssl.msi
    - name: Installera MSI
      win_package:
        path: C:\ansible_examples\httpd-2.2.25-win32-x86-no_ssl.msi
        state: present

Starta Ansible-playbook för att installera via MSI.

användare@dator ~
$ ansible-playbook msi.yml
PLAY [Installera Apache MSI] *****************************************************************************************************************
TASK [Samlar fakta] ***********************************************************************************************************************
ok: [192.168.0.102]
TASK [Ladda ner Apache-installationsprogrammet] *********************************************************************************************************
changed: [192.168.0.102]
TASK [Installera 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

Kontrollera nu på Windows-systemet att Apache har installerats korrekt.

C:\Users\användare\dator>cd C:\Program Files (x86)\Apache Software Foundation\Apache2.2\bin
C:\Program Files (x86)\Apache Software Foundation\Apache2.2\bin>httpd -v
Server version: Apache/2.2.25 (Win32)
Server built: Jul 10 2013 01:52:12

Du kan även installera program med MSI och argument. Följande exempel visar samma procedur, men med installationsargument istället för ett tillstånd.

YAML-kod:

---
- name: Installera Apache MSI
  hosts: win
  tasks:
    - name: Ladda ner Apache-installationsprogrammet
      win_get_url:
        url: https://archive.apache.org/dist/httpd/binaries/win32/httpd-2.2.25-win32-x86-no_ssl.msi
        dest: C:\ansible_examples\httpd-2.2.25-win32-x86-no_ssl.msi
    - name: Installera MSI
      win_package:
        path: C:\ansible_examples\httpd-2.2.25-win32-x86-no_ssl.msi
        arguments:
          - /install
          - /passive
          - /norestart

För att avinstallera ett program med MSI-filen, använd modulen `win_package` med tillståndet ”absent”. Detta indikerar att applikationen ska avinstalleras med hjälp av MSI-filen.

Här avinstallerar jag Apache.

användare@dator ~
$ vi uninstall_msi.yml
---
- name: Avinstallera Apache MSI
  hosts: win
  tasks:
    - name: Avinstallera MSI
      win_package:
        path: C:\ansible_examples\httpd-2.2.25-win32-x86-no_ssl.msi
        state: absent

Kör Ansible-playbook för avinstallation med MSI.

användare@dator ~
$ ansible-playbook uninstall_msi.yml
PLAY [Avinstallera Apache MSI] *****************************************************************************************************************
TASK [Samlar fakta] ***********************************************************************************************************************
ok: [192.168.0.102]
TASK [Avinstallera 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

Om jag nu kontrollerar Apache-versionen, får jag följande utdata, som visar att applikationen är avinstallerad.

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

Avinstallera program (.EXE)

Du kan även avinstallera program med .exe-filer, med hjälp av programvarans produkt-ID.

användare@dator ~
$ vi uninstall.yml
---
- hosts: win
  tasks:
    - name: Avinstallera 7-Zip från exe
      win_package:
        path: C:\Program Files\7-Zip\Uninstall.exe
        product_id: 7-Zip
        arguments: /S
        state: absent

Kör Ansible-playbook för att avinstallera 7-Zip.

användare@dator ~
$ ansible-playbook uninstall.yml
PLAY [win] *************************************************************************************************************************************************************************************
TASK [Samlar fakta] *************************************************************************************************************************************************************************
ok: [192.168.0.102]
TASK [Avinstallera 7-Zip från 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

Stoppa/Starta/Starta om Windows-tjänster

Ansible-modulen `win_service` används för att starta, stoppa eller starta om en tjänst. Här visar jag hur du stoppar Tomcat-tjänsten.

Du behöver ange tjänstens namn i YAML-filen och sätta tillståndet till ”stopped”.

användare@dator ~
$ vi service.yml
---
- hosts: win
  tasks:
    - name: Stoppa tjänsten Tomcat
      win_service:
        name: Tomcat8
        state: stopped

Kör Ansible-playbook för att stoppa Tomcat-tjänsten.

användare@dator ~
$ ansible-playbook service.yml
PLAY [win] ***********************************************************************************************************************************
TASK [Samlar fakta] ***********************************************************************************************************************
ok: [192.168.0.102]
TASK [Stoppa tjänsten 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

Om du kontrollerar Tomcat-tjänsten på Windows-systemet, kommer den nu vara i stoppat läge.

Du kan ändra tjänstens status genom att definiera tillstånden till ”started”, ”restarted” eller ”paused”.

Samla fakta

Med hjälp av Ansible-modulen `win_disk_facts`, kan du hämta all diskinformation från målvärden.

användare@dator ~
$ vi disk.yml
---
- hosts: win
  tasks:
  - name: Hämta diskfakta
    win_disk_facts:
  - name: Visa första diskstorleken
    debug:
      var: ansible_facts.disks[0].size
  - name: Konvertera första systemdisken till olika format
    debug:
      msg: '{{ disksize_gib }} vs {{ disksize_gib_human }}'
    vars:
      # Hämta första systemdisken
      disk: '{{ ansible_facts.disks|selectattr("system_disk")|first }}'
      # Visa diskstorlek i Gibibytes
      disksize_gib_human: '{{ disk.size|filesizeformat(true) }}'
      disksize_gib: '{{ (disk.size/1024|pow(3))|round|int }} GiB'

Kör Ansible-playbook för att hämta diskdata.

användare@dator ~
$ ansible-playbook disk.yml
PLAY [win] ***********************************************************************************************************************************
TASK [Samlar fakta] ***********************************************************************************************************************
ok: [192.168.0.102]
TASK [Hämta diskfakta] ************************************************************************************************************************
ok: [192.168.0.102]
TASK [Visa första diskstorleken] ****************************************************************************************************************
ok: [192.168.0.102] => {
"ansible_facts.disks[0].size": "1000204886016"
}
TASK [Konvertera första systemdisken till olika format] ****************************************************************************************
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

Med Ansible-modulen `win_command`, kan du köra kommandon på fjärrvärden och samla information om CPU, enhetsdetaljer och mycket mer.

användare@dator ~
$ vi check.yml
---
- hosts: win
  tasks:
   - name: Hämta diskfakta
     win_command: wmic cpu get caption, deviceid, name, numberofcores, maxclockspeed, status
     register: usage
   - debug: msg="{{ usage.stdout }}"

Kör Ansible-playbook för att samla fjärrsystemsinformation.

användare@dator ~
$ ansible-playbook check.yml
PLAY [win] ***********************************************************************************************************************************
TASK [Samlar fakta] ***********************************************************************************************************************
ok: [192.168.0.102]
TASK [Hämta fakta] ************************************************************************************************************************
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

Kör kommandon

Alla kommandon som du vanligtvis kör i Windows kan utföras med hjälp av Ansible-modulen `win_command`. Du behöver bara specificera kommandot i din YAML-fil. Här skapar jag bara en katalog.

användare@dator ~
$ vi commands.yml
---
- hosts: win
  tasks:
    - name: kör en körbar fil med win_command
      win_command: whoami.exe
    - name: kör ett cmd-kommando
       win_command: cmd.exe /c mkdir C:\test

Kör Ansible-playbook för att utföra `win_command`.

användare@dator ~
$ ansible-playbook commands.yml
PLAY [win] ***********************************************************************************************************************************
TASK [Samlar fakta] ***********************************************************************************************************************
ok: [192.168.0.102]
TASK [kör en körbar fil med win_command] ***************************************************************************************************
changed: [192.168.0.102]
TASK [kör ett cmd-kommando] *********************************************************************************************************************
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

Miljövariabler

Ett Windows-system innehåller många miljövariabler, som till exempel `JAVA_HOME`. Med Ansible-modulen `win_environment` kan du lägga till eller ändra miljövariabler i Windows. I detta exempel lägger jag till en ny variabel i listan med miljövariabler i Windows.

användare@dator ~
$ vi env.yml
---
- hosts: win
  tasks:
   - name: Ange en miljövariabel för alla användare
     win_environment:
       state: present
       name: NewVariable
       value: New Value
       level: machine

Kör Ansible-playbook för att lägga till miljövariabeln på en fjärransluten Windows-maskin.

användare@dator ~
$ ansible-playbook env.yml
PLAY [win] ***********************************************************************************************************************************
TASK [Samlar fakta] ***********************************************************************************************************************
ok: [192.168.0.102]
TASK [Ange en miljövariabel för alla användare] *********************************************************************************************
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

Gå till fönstret för miljövariabler så kommer du att se att den nya variabeln du just lade till nu finns där.

Lägg till/redigera register

Ansible-modulen `win_regedit` används för att lägga till eller redigera registerposter på en fjärransluten Windows-maskin. Du behöver specificera registersökvägen och det innehåll som ska läggas till/uppdateras. Här skapar jag en ny registerpost `adminvista.com` i sökvägen `HKLM:\SOFTWARE` och lägger sedan till namn och data till detta register.

användare@dator ~
$ vi registry.yml
---
- hosts: win
  tasks:
   - name: Skapar ett register
     win_regedit:
      path: HKLM:\SOFTWARE\adminvista.com
   - name: Modifiera ett register, lägg till namn och data
     win_regedit:
      path: HKLM:\SOFTWARE\adminvista.com
      name: Geek
      data: Flare

Kör Ansible-playbook för att lägga till registret.

användare@dator ~
$ ansible-playbook registry.yml
PLAY [win] ***********************************************************************************************************************************
TASK [Samlar fakta] ***********************************************************************************************************************
ok: [192.168.0.102]
TASK [Skapar ett register] *******************************************************************************************************************
changed: [192.168.0.102]
TASK [Modifiera ett register, lägg till namn och 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

Om du går till Registereditorn på fjärrsystemet kan du se att det här registret har lagts till med namn- och datavärden.

Ta bort loggar

Ansible-modulen `win_eventlog` används för att lägga till, rensa eller ta bort Windows-händelseloggar från ett Windows-system.

I Windows Powershell, lista händelseloggarna som finns på den fjärranslutna Windows-maskinen.

PS C:\Users\användare\dator> 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

Nu kommer jag att visa hur man tar bort loggar från alla källor för Internet Explorer.

användare@dator ~
$ vi log.yml
---
- hosts: win
  tasks:
   - name: Ta bort Internet Explorer-loggar
     win_eventlog:
      name: Internet Explorer
      state: absent

Kör Ansible-playbook för att ta bort Internet Explorer-loggarna från den fjärranslutna Windows-maskinen.

användare@dator ~
$ ansible-playbook log.yml
PLAY [win] *************************************************************************************************************************************************************************************
TASK [Samlar fakta] *************************************************************************************************************************************************************************
ok: [192.168.0.102]
TASK [Ta bort Internet Explorer-loggar] **********************************************************************************************************************************************
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

Om du nu listar händelseloggarna igen, kommer du att se att Internet Explorer-loggarna har tagits bort.

PS C:\Users\användare\dator> 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

Detta var några exempel på Ansible playbooks som kan användas för fjärradministration av Windows. Testa gärna dessa playbooks. Du kan även utforska andra Ansible Windows-moduler som finns tillgängliga.