[PYTHON] Installieren Sie das Sicherheitsupdate (KB) einzeln auf Windows Server mit Ansible Part 2 ~ Erfassen Sie mit dem Befehl ls dynamisch mehrere MSU-Dateien im Verzeichnis und installieren Sie sie in einer Schleife

0. Einleitung

Dies ist ein Beispiel für ein Ansible-Playbook, mit dem KB mithilfe von MSU-Dateien von Ansible auf Windows2012ServerR2 installiert wird. Ich denke, Sie können mit Chef etwas Ähnliches tun.

Dieser Beitrag ist eine aktualisierte Version des vorherigen Beitrags. Die MSU-Datei unter dem Patch-Verzeichnis wird vom Befehl ls dynamisch erfasst und auf die Form des Schleifens und Installierens der MSU-Datei aktualisiert (Blockschleife mit_itmes * include). / items / c03e7cbce8608b1c55f1), jinja2 filter regex_replace usw.) Obwohl es keine vorherige Zeit gab, haben wir vor und nach dem Blook-Prozess und der KB-Installation eine KB-Installationsprüfung hinzugefügt. Was ist mit KB, das ohne Neustart nicht wiedergegeben wird? Ist Kommentieren Sie den Befehlsteil check nach der Installation aus (Zeilen 17 bis 20 von win_patch_child.yml) oder Verwenden Sie zur Überprüfung nach der Installation ein anderes Playbook oder wenden Sie sich an Serverspec usw.

Das Folgende ist gegenüber der vorherigen Zeit unverändert. Es ist eine schlammige Methode, die Rohmodule verwendet, aber es gibt nur wenige Fälle im Zusammenhang mit Windows, daher dient sie nur als Referenz. Eigentlich denke ich, dass es notwendig ist, den Dienst zu erhöhen oder zu senken, neu zu starten und die obere LB zu steuern, aber nur die Installation von KB wird einfach beschrieben. Außerdem verwende ich pkgmgr anstelle von DISM für die Installation.

1. Rauer Fluss

Auf der Ansible-Serverseite

  1. Erstellen Sie im Voraus ein Patch-Verzeichnis im Playbook-Ausführungsverzeichnis und laden Sie die Ziel-MSU-Datei darunter manuell / automatisch herunter.

win_patch.yml

  1. Erfassen Sie den Dateinamen dynamisch mit dem Befehl ls im Patch-Verzeichnis und speichern Sie ihn in der Ergebnisvariablen des Befehls ls des Playbooks.
  2. Ein Playbook ** win_patch_child.yml **, das dynamisch ( with_items) für die Dateien in der Ergebnisvariablen des Befehls ls schleift und die KB-Datei nur installiert, wenn die Erweiterung eine MSU-Datei ist. Rufen Sie (include) auf, verarbeiten Sie den erfassten MSU-Dateinamen dynamisch mit einem regulären Ausdruck von regex_replace und legen Sie ihn als Variable wie die KB-Nummer fest

Vom Ansible Server zum Windows-Ziel

win_patch_child.yml

  1. Erstellen Sie ein Verzeichnis, um die MSU-Datei zu kopieren
  2. Kopieren Sie die MSU-Datei
  3. Komprimieren und dekomprimieren Sie die MSU-Datei
  4. Stille Installation mit pkgmgr

2. Spielbuch usw.

win_patch.yml


---
- hosts: win
# Don't gather hosts facts for performance
  gather_facts: no
# Setting the task
  tasks:
   - name: "Get Win pacth name"
     shell: ls patch
     delegate_to: localhost
     register: command_result

   - name: "Install Win patch"
     include: win_patch_child.yml kb_msu={{ item }}
     with_items: "{{ command_result.stdout_lines }}"
     when: "'.msu' in item"
     vars:
       kb_src_dr:             "patch"
       kb_dest_dr:            "c:/work/"
       kb_src:                "{{ kb_src_dr }}/{{ kb_msu }}"
       kb_dest:               "{{ kb_dest_dr }}/{{ kb_msu }}"
       kb_xml:                "{{ kb_msu | regex_replace('.msu','.xml') }}"
       kb_no:                 "{{ kb_msu | regex_replace('^.*-KB(\\d*)-.*msu$','\\1') }}"
       check_command:         "wmic qfe | findstr {{ kb_no }}"
# When I use wusa/pkgmagr as follows vars.
       decompression_command: "wusa {{kb_dest}} /extract:{{ kb_dest_dr }}"
       install_command:       "pkgmgr /n:{{ kb_dest_dr }}{{ kb_xml }} /quiet /norestart"
       uninstall_command:     "wusa /uninstall /kb:{{ kb_no }} /quiet /norestart"
# When you use expand/Dism, you comment out a line of wusa/pkgmagr, and please use a variable as follows.
#       kb_cab:                "{{ kb_msu | regex_replace('.msu','.cab') }}"
#       decompression_command: "expand -f:{{kb_cab}} {{ kb_dest_dr }}{{ kb_msu }} {{ kb_dest_dr }}KB{{ kb_no }}"
#       install_command:       "Dism /Online /Add-Package /PackagePath:{{ kb_dest_dr }}KB{{ kb_no }} /quiet /norestart"
#       uninstall_command:     "wusa /uninstall /kb:{{ kb_no }} /quiet /norestart"

win_patch_child.yml


---
  - name: Check KB
    raw: "{{ check_command }}"
    register: command1_result
    failed_when: command1_result.rc not in [ 0 , 1 ]

  - block:
      - debug: msg="Block START ----------------------"
      - name: create directory
        win_file: path={{ kb_dest_dr  }} state=directory
      - name: copy the file
        win_copy: src={{ kb_src }} dest={{ kb_dest }} mode=0755
      - name: decompression the msu file
        raw: "{{ decompression_command }}"
      - name: install KB
        raw: "{{ install_command }}"
      - name: Check KB
        raw: "{{ check_command }}"
        register: command2_result
        failed_when: "'KB{{ kb_no }}' not in command2_result.stdout"
      - debug: msg="Block END ------------------------"
    when: "'KB{{ kb_no }}' not in command1_result.stdout"

    rescue:
      - debug: msg="Rescue START ---------------------"
      - debug: msg="install {{ kb_no }} is error"
      - name: uninstall KB
        raw: "{{ uninstall_command }}"
      - debug: msg="Rescue END -----------------------"

    always:
      - debug: msg="Always START ---------------------"
      - debug: msg="before '{{ check_command }}' {{ command1_result.stdout_lines }}"
        when: command1_result is defined
      - debug: msg="after  '{{ check_command }}' {{ command2_result.stdout_lines }}"
        when: command2_result is defined
      - debug: msg="Always END -----------------------"

  - debug: msg="Because KB{{ kb_no }} had been already installed, I skipped installation.
                This is result of the check command '{{ check_command }}'
                {{ command1_result.stdout_lines }}"
    when: "'KB{{ kb_no }}' in command1_result.stdout"

Inventardatei Hosts

[win]
win0[1:2]

[win:vars]
ansible_ssh_user=ansible
ansible_ssh_pass=ansibleansible
ansible_ssh_port=5985
ansible_connection=winrm

3. Andere

Unter Patch-Verzeichnis

patch/
- Windows8.1-KB3079904-x64.msu
- Windows8.1-KB3140735-x64.msu
- openssl-1.0.1e-48.el6_8.1.x86_64.rpm

ansible --version

# ansible --version
ansible 2.2.0 (devel 394430a61e) last updated 2016/06/28 13:25:07 (GMT +900)
  lib/ansible/modules/core: (detached HEAD 3c6f2c2db1) last updated 2016/06/28 13:25:30 (GMT +900)
  lib/ansible/modules/extras: (detached HEAD 1c36665545) last updated 2016/06/28 13:25:37 (GMT +900)
  config file = /etc/ansible/ansible.cfg
  configured module search path = Default w/o overrides

Recommended Posts

Installieren Sie das Sicherheitsupdate (KB) einzeln auf Windows Server mit Ansible Part 2 ~ Erfassen Sie mit dem Befehl ls dynamisch mehrere MSU-Dateien im Verzeichnis und installieren Sie sie in einer Schleife
Ersetzen Sie den Verzeichnisnamen und den Dateinamen im Verzeichnis zusammen mit einem Linux-Befehl.
So listen Sie Dateien im angegebenen Verzeichnis auf (Suche nach mehreren Bedingungen / Unterverzeichnissen)