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.
win_patch.yml
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 festwin_patch_child.yml
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
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