ubuntuusers.de

Linux / Ubuntu Patchmanagement

Status: Ungelöst | Ubuntu-Version: Server 22.04 (Jammy Jellyfish)
Antworten |

Nur-Ein-Blogger

Anmeldungsdatum:
4. April 2011

Beiträge: 146

Hallo zusammen,

ich bin derzeit mit der Betreuung eines Patchmanagementsystems für unsere Linux VMs betraut. Derzeit haben wir ca. 200 Linux VMs mit den Distributionen: Ubuntu, CentOs7/8, Almalinux, RockyLinux, Debian und Suse. Bisher haben wir Spacewalk verwendet, aber das ist Out of Life und der Nachfolger Unuyi wird von Cannonical weder gewollt noch unterstützt, aber da wir unsere Systeme auf Ubuntu Server fokussieren und umbauen, fällt das für mich weg.

Der Umbau dauert aber seine Zeit. Da Ubuntu Pro interessant klingt, wollte ich mal fragen, ob jemand Erfahrung damit hat und es empfehlen kann.

Ich habe gelesen, dass 500$ pro Jahr für eine Instanz mit unbegrenzten VMs möglich ist. Das ist doch zu verkraften, also sollte es nicht daran scheitern, dass es Geld kostet.

Allerdings habe ich nicht viel darüber gefunden, ob Landscape auch andere Distributionen unterstützt. Habt ihr eine Idee oder einen Tipp für mich?

Liebe Grüße

DJKUhpisse Team-Icon

Supporter, Wikiteam
Avatar von DJKUhpisse

Anmeldungsdatum:
18. Oktober 2016

Beiträge: 18220

Wohnort: in deinem Browser, hier auf dem Bildschirm

apt/dnf.

Das kann man automatisieren über unattended-upgrades.

Ggf. Paketinstallation per Ansible durchführen - auf massenhaft Rechnern mit einem Playbook.

Nur-Ein-Blogger

(Themenstarter)

Anmeldungsdatum:
4. April 2011

Beiträge: 146

Ich habe bereits ein Playbook und ein System für einige Aufgaben mit Ansible umgesetzt. SSH key Rotation, package listen und die VMs werden nach der Installation Grund konfiguriert.

Das Aktualisieren der Systeme und den Patchstatus bekomme ich nicht vernünftig umgesetzt, weil ich den Auftrag habe das sehr granular zu machen. Außerdem muss es durch weniger versierte anwendbar sein, die zwar auch aus der Technik kommen aber im Zweifelsfall nichts kaputt machen können.

Ansible wird ohne Galaxy verwendet - von 0 auf.

Eines der Probleme ist, dass es fachlich verantwortliche gibt die man bei Updates ins Boot holen muss und da wäre es toll, wenn man eine Übersicht der Systeme hätte und den Patchstatus und vorallem ob es kritische Updates gibt und ob danach alles noch läuft was vorher lief.

Daher hatte ich gehofft, dass mit Ubuntu Landscape auch andere Systeme mit abgebildet werden können.

Rundeck, Semaohore und AWX war bisher für mich immer zum scheitern verurteilt. The foreman fällt aus aufgrund der Anforderungen.

DJKUhpisse Team-Icon

Supporter, Wikiteam
Avatar von DJKUhpisse

Anmeldungsdatum:
18. Oktober 2016

Beiträge: 18220

Wohnort: in deinem Browser, hier auf dem Bildschirm

Was spricht dagegen, überall unattended-upgrades zu aktivieren? Oder halt jeden Tag Ansible laufen zu lassen?

Warum brauchst du einen konkreten Sustand der Systeme, statt einfach alles zu automatisieren und im Fehlerfall eine Mail an den Admin schicken zu lassen?

Nur-Ein-Blogger

(Themenstarter)

Anmeldungsdatum:
4. April 2011

Beiträge: 146

Die Ansible rolle ist aktuell diese:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
---
- name: Refresh apt cache
  apt:
    update_cache: yes
    cache_valid_time: 3600
  when: ansible_os_family == "Debian"
  register: apt_cache_updated

- name: Upgrade apt packages
  apt:
    upgrade: safe
  when: ansible_os_family == "Debian" and apt_cache_updated.changed

- name: Refresh dnf cache and upgrade packages
  dnf:
    name: '*'
    state: latest
  when: ansible_os_family == "RedHat" and ansible_distribution in ['AlmaLinux', 'CentOS', 'Fedora']
  register: dnf_cache_updated
...

Halt einfach nur Updates. Mit Sequenzen könnte ich mehrere gleichzeitig ausführen aber soweit bin ich noch nicht.

Deswegen bin ich derzeit vorsichtig und Arbeite mit der Auswetung:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
---
- name: Sammeln aller Ansible Facts
  setup:
  register: all_facts

- name: Refresh apt cache
  apt:
    update_cache: yes
  when: ansible_os_family == 'Debian'

- name: Refresh apt cache
  apt:
    update_cache: yes
  when: ansible_os_family == 'RedHat' 

- name: Ausgabe der Betriebssystemfamilie
  debug: 
    msg: "Die Betriebssystemfamilie des Zielhosts ist {{ ansible_os_family }}."

- name: Generiere das Datum und die Uhrzeit
  set_fact:
    current_date_time: "{{ lookup('pipe', 'date +%Y-%m-%d-%H-%M-%S') }}"
    current_date: "{{ lookup('pipe', 'date +%Y/%m/%d') }}"
########################## Debian
- name: Ermittle die Anzahl der aktualisierbaren Pakete (Debian)
  shell: apt list --upgradable || echo 0 # shell statt command da wir mit shell die Pipe verwenden können || echo 0, wenn ausgabe leer
  register: upgradeable_packages
  become: yes
  when: ansible_os_family == 'Debian'
  changed_when: false

- name: Ermittle die Anzahl der Pakete mit kritischen Sicherheitsupdates (Debian)
  shell: apt -s dist-upgrade | grep -oP "[0-9]+(?= not upgraded)" || echo 0 # shell statt command da wir mit shell die Pipe verwenden können || echo 0, wenn ausgabe leer
  register: critical_security_updates
  when: ansible_os_family == 'Debian'
  changed_when: false

- name: Ermittle die Anzahl der Tage seit dem letzten Update (Debian)
  shell: expr $(date +%s) - $(stat -c %Y /var/cache/apt/pkgcache.bin) / 60 / 60 / 24 # shell statt command da wir mit shell expr $(date +%s) verwenden können
  register: days_since_last_update
  when: ansible_os_family == 'Debian'
  changed_when: false

- name: Ermitteln der installierten Pakete und ihrer Versionen (Debian)
  command: dpkg-query -W -f='${binary:Package}, ${Version}\n'
  register: packages_output
  when: ansible_os_family == 'Debian'

- name: Erstellen der CSV-Datei (Debian)
  copy:
    content: "{{ packages_output.stdout }}"
    dest: "/tmp/{{ inventory_hostname }}-{{ current_date_time }}.txt"
  when: ansible_os_family == 'Debian'

- name: Hinzufügen der Informationen über aktualisierbare Pakete, Sicherheitsupdates und Tage seit dem letzten Update in die CSV-Datei (Debian)
  lineinfile:
    path: "/tmp/{{ inventory_hostname }}-{{ current_date_time }}.txt"
    line: "Hostname: {{ ansible_hostname }}\n\nUpdates verfügbar: {{ upgradeable_packages.stdout }}\nDavon Kritisch: {{ critical_security_updates.stdout }}\n{{ days_since_last_update.stdout }} Tage seit dem letzten Update\n\n"
    insertbefore: BOF
  when: ansible_os_family == 'Debian'
########################## REDHAT
- name: Ermitteln der installierten Pakete und ihrer Versionen (RedHat)
  command: rpm -qa --qf '%{NAME}, %{VERSION}\n\n'
  register: packages_output
  when: ansible_os_family == 'RedHat' 

- name: Erstellen der CSV-Datei (RedHat)
  copy:
    content: "{{ packages_output.stdout }}"
    dest: "/tmp/{{ inventory_hostname }}-{{ current_date_time }}.txt"
  when: ansible_os_family == 'RedHat'
##########################
- name: Hinzufügen der Ansible Facts zur Datei (Debian)
  lineinfile:
    path: "/tmp/{{ inventory_hostname }}-{{ current_date_time }}.txt"
    line: "\n\nAnsible Facts: \n{{ all_facts.ansible_facts | to_nice_json }}"
    insertafter: EOF
  when: ansible_os_family == 'Debian'

- name: Hinzufügen der Ansible Facts zur Datei (RedHat)
  lineinfile:
    path: "/tmp/{{ inventory_hostname }}-{{ current_date_time }}.txt"
    line: "\n\nAnsible Facts: \n{{ all_facts.ansible_facts | to_nice_json }}"
    insertafter: EOF
  when: ansible_os_family == 'RedHat'

- name: Übertragen der CSV-Datei auf den Ansible-Steuerungsknoten
  fetch:
    src: "/tmp/{{ inventory_hostname }}-{{ current_date_time }}.txt"
    dest: "/home/rene/ansible_project/servers/{{ current_date }}/"
    flat: yes
...

Ziel ist halt auf dem Ansible Control Node eine Liste zu haben und diese auswerten. Dann handeln. Mit Updates ohne Aufsicht fühle ich mich nicht sicher 😀

Experementiere derzeit damit:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
- name: Patch Management für verschiedene Linux Systeme
  hosts: all
  become: yes
  tasks:

  # Check if the system is Debian or Ubuntu
  - name: Check ob System Debian oder Ubuntu ist
    set_fact:
      is_deb: "{{ ansible_os_family == 'Debian' }}"

  # Check if the system is RedHat, CentOS, AlmaLinux, or RockyLinux
  - name: Check ob System RedHat, CentOS, AlmaLinux oder RockyLinux ist
    set_fact:
      is_rh: "{{ ansible_os_family == 'RedHat' }}"

  # Check if the system is CentOS 7
  - name: Check ob System CentOS 7 ist
    set_fact:
      is_centos7: "{{ ansible_distribution == 'CentOS' and ansible_distribution_major_version == '7' }}"

  - name: Save the list of running services before the update
    command: systemctl list-units --type=service --state=running
    register: services_pre

  # Update the system
  - name: Update und Upgrade für Debian/Ubuntu Systeme
    apt:
      upgrade: safe
      update_cache: yes
      autoremove: yes
    when: is_deb

  - name: Update und Upgrade für RedHat/CentOS/AlmaLinux/RockyLinux Systeme
    yum:
      name: "*"
      state: latest
    when: is_rh or is_centos7

  # Check if a reboot is required
  - name: Check ob Neustart erforderlich ist
    command: needs-restarting -r
    register: reboot_required
    ignore_errors: true

  # Notify the user if a reboot is required
  - name: Benachrichtigung wenn Neustart erforderlich
    debug:
      msg: "Reboot required on {{ inventory_hostname }}"
    when: reboot_required.rc == 1

  - name: Save the list of running services after the update
    command: systemctl list-units --type=service --state=running
    register: services_post

  # Check if the services are still running after the update
  - name: Prüfen ob die gleichen Dienste laufen
    assert:
      that: "services_pre.stdout_lines == services_post.stdout_lines"
      fail_msg: "Not all services are running after update"
      success_msg: "All services are running after update"

Dabei ist mir halt wichtig, dass ich vorher prüfe welche Dienste laufen, das Speichere ich und nach dem update auch. Dann werden die Listen Verglichen und wenn es Abweichungen gibt, dann gibt es einen Alarm.

PS: Wer Teile der den Code gebrauchen kann ist herzlich eingeladen ihn zu verwenden ☺ Da ich kein Profi bin aber unter Vorbehalt jeder richtigkeit

Antworten |