[PYTHON] Installez la mise à jour de sécurité (Ko) individuellement sur Windows Server avec Ansible Partie 2 ~ Acquérez dynamiquement plusieurs fichiers MSU sous le répertoire avec la commande ls et installez-les en boucle

0. Introduction

Il s'agit d'un exemple de playbook Ansible qui installe la base de connaissances d'Ansible vers Windows2012ServerR2 à l'aide de fichiers MSU. Je pense que vous pouvez faire quelque chose de similaire avec Chef.

Ce message est une version mise à jour du précédent Post. Le fichier MSU sous le répertoire patch est acquis dynamiquement par la commande ls et mis à jour pour être installé en bouclant le fichier MSU (block loop with_itmes * include / items / c03e7cbce8608b1c55f1), filtre jinja2 regex_replace etc.) De plus, bien qu'il n'y en ait pas eu auparavant, nous avons ajouté une vérification d'installation de la base de connaissances avant et après le processus blook et l'installation de la base de connaissances. Dans le cas de KB qui n'est pas reflété sans redémarrage? Est Commentez la partie de la commande de vérification après l'installation (lignes 17 à 20 de win_patch_child.yml), ou Pour la vérification après l'installation, veuillez utiliser un autre playbook ou vérifier avec Serverspec etc.

Ce qui suit est inchangé par rapport à la fois précédente. C'est une méthode floue utilisant des modules bruts, mais il y a peu de cas liés à Windows, donc c'est juste pour référence. En fait, je pense qu'il est nécessaire d'augmenter ou de baisser le service, de redémarrer et de contrôler la LB supérieure, mais seule l'installation de KB est décrite simplement. En outre, j'utilise pkgmgr au lieu de DISM pour l'installation.

1. Écoulement brutal

Du côté du serveur Ansible

  1. Créez un répertoire de correctifs dans le répertoire d'exécution du playbook à l'avance et téléchargez manuellement / automatiquement le fichier msu cible sous celui-ci.

win_patch.yml

  1. Acquérez dynamiquement le nom de fichier sous le répertoire patch avec la commande ls et stockez-le dans la variable résultat de la commande ls du playbook.
  2. Playbook ** win_patch_child.yml ** qui effectue une boucle dynamique ( with_items) pour les fichiers qui existent dans la variable de résultat de la commande ls et installe le fichier KB uniquement lorsque l'extension est un fichier MSU. Appelez (ʻinclude), traitez dynamiquement le nom de fichier MSU acquis avec une expression régulière par regex_replace`, et définissez-le comme une variable telle que le numéro KB

Depuis Ansible Server vers Windows cible

win_patch_child.yml

  1. Créez un répertoire pour copier le fichier msu
  2. Copiez le fichier msu
  3. Compressez et décompressez le fichier msu
  4. Installation silencieuse avec pkgmgr

2. playbook etc.

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"

Fichier d'inventaire hosts

[win]
win0[1:2]

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

3. Autre

Sous le répertoire des correctifs

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

Installez la mise à jour de sécurité (Ko) individuellement sur Windows Server avec Ansible Partie 2 ~ Acquérez dynamiquement plusieurs fichiers MSU sous le répertoire avec la commande ls et installez-les en boucle
Remplacez le nom du répertoire et le nom du fichier dans le répertoire par une commande Linux.
Comment lister les fichiers dans le répertoire spécifié (plusieurs conditions / recherche de sous-répertoire)