У меня есть несколько серверов на базе Ubuntu и Debian Linux.

Как мне обновить их все с помощью модуля apt от Ansible?

Как я могу использовать Ansible для системных обновлений и перезагрузить компьютер после обновления ядра?

Поддержание вашей системы в актуальном состоянии и применение всех исправлений безопасности является важной задачей для системных администраторов и разработчиков.

Можно использовать модуль apt Ansible для управления пакетами в дистрибутивах Linux на основе Debian / Ubuntu.

Этот модуль может использовать команду aptitude или apt-get на удаленном сервере для управления пакетами.

Точно так же было бы лучше, если бы вы использовали модуль перезагрузки Ansible, чтобы перезагрузить компьютер, дождаться его выключения, вернуться назад и ответить на команды.

В этом руководствее объясняется, как запустить apt / apt-get update, обновить все пакеты через Ansible и перезагрузить компьютер, если возникнет такая необходимость.

С Ansible обновляем все пакеты с помощью модуля apt

Обычно вы запускаете следующую команду для обновления кэша пакетов с помощью команды apt-get или apt:

sudo apt-get update

Чтобы обновить кеш репозиториев с помощью Ansible:

    - name: Update apt-get repo and cache
      apt: update_cache=yes force_apt_get=yes cache_valid_time=3600

Где,

  • update_cache = yes — запустить эквивалентную команду обновления apt-get на всех серверах
  • force_apt_get = yes — не используйте команду aptitude, вместо этого используйте команду apt-get для систем Debian / Ubuntu
  • cache_valid_time = 3600 — обновить кэш apt, если он старше, чем cache_valid_time. Эта опция устанавливается в секундах. В этом примере оно установлено на 3600 секунд.

Обновление всех пакетов с использованием Ansible

Синтаксис:

   - name: Upgrade all apt packages
      apt: upgrade=dist force_apt_get=yes

Где,

  • upgrade = dist — Выполните эквивалентную команду «apt-get upgrade» на всех серверах Ubuntu или Debian Linux. Другими словами, обновить все пакеты до последней версии.
  • force_apt_get = yes — использовать apt-get вместо aptitude.

Узнать, нужно ли нам перезагрузить серверы

Если файл /var/run/reboot-required существует, вам необходимо перезагрузить систему Debian или Ubuntu Linux.

Нам нужно зарегистрировать новую переменную, если файл /var/run/reboot-required существует в системе следующим образом:

    - name: Check if a reboot is needed for Debian and Ubuntu boxes
      register: reboot_required_file
      stat: path=/var/run/reboot-required get_md5=no

Где,

  • register: reboot_required_file — Ключевое слово «register» решает, в какую переменную сохранить результат, и мы собираемся использовать его следующим образом для перезагрузки блока.
  • stat: path = /var/run/reboot-required — определить, существует ли путь (/var/run/reboot-required)
  • get_md5 = no — алгоритм определения контрольной суммы файла. В этом примере я использую md5, но вы можете использовать sha1, sha224, sha256, sha384 и sha512.

Перезагрузка сервера при установке нового ядра

Вы можете использовать либо команду, либо модуль оболочки для перезагрузки сервера Linux при обновлении ядра следующим образом:

    - name: Reboot the Debian or Ubuntu server
      reboot:
        msg: "Reboot initiated by Ansible due to kernel updates"
        connect_timeout: 5
        reboot_timeout: 300
        pre_reboot_delay: 0
        post_reboot_delay: 30
        test_command: uptime
      when: reboot_required_file.stat.exists

Где,

  • test_command: uptime — выполнить команду uptime на перезагруженном сервере и ожидать успеха, чтобы определить, готов ли компьютер к дальнейшим задачам.
  • when: reboot_required_file.stat.exists — Сначала убедитесь, что файл с именем /var/run/reboot-required существует, используя переменную с именем reboot_required_file. Модуль перезагрузки будет работать только в том случае, если этот файл существует, и он принудительно применяется с помощью условия «Ansible»: «: reboot_required_file.stat.exists».

Использование Ansible для обновления системы и перезагрузки серверов Linux при необходимости

Теперь, когда вы знаете основную логику, давайте создадим новый файл хостов:

vi hosts

Добавьте следующее:
## set up ssh user name and path to python3 ##
[all:vars]
ansible_user='ubuntu'
ansible_become=yes
ansible_become_method=sudo
ansible_python_interpreter='/usr/bin/env python3'
 
##########################
## our aws server names
## aws-ls-www-1 may be mapped using /etc/hosts or ~/.ssh/config
## you can use ip address here too
###########################
[servers]
aws-ls-www-1
aws-ls-www-2
aws-ls-www-3
aws-ls-www-4

Образец плейбука

Создайте новый файл с именем update.yml следующим образом:

vi update.yml

Добавьте следующий код Ansible:

---
- hosts: servers
  become: true
  become_user: root
  tasks:
    - name: Update apt repo and cache on all Debian/Ubuntu boxes
      apt: update_cache=yes force_apt_get=yes cache_valid_time=3600

    - name: Upgrade all packages on servers
      apt: upgrade=dist force_apt_get=yes

    - name: Check if a reboot is needed on all servers
      register: reboot_required_file
      stat: path=/var/run/reboot-required get_md5=no

    - name: Reboot the box if kernel updated
      reboot:
        msg: "Reboot initiated by Ansible for kernel updates"
        connect_timeout: 5
        reboot_timeout: 300
        pre_reboot_delay: 0
        post_reboot_delay: 30
        test_command: uptime
      when: reboot_required_file.stat.exists
Убедитесь, что вы настроили ssh-ключи и запустите плейбук следующим образом:
ansible-playbook -i hosts update.yml
Поделитесь статьей:

One thought on “📜 Как с помощью Ansible обновить все пакеты в Ubuntu / Debian Linux

  1. ERROR! no action detected in task. This often indicates a misspelled module name, or incorrect module path.
    The error appears to have been in ‘/home/alex/tmp/system-update-2.yml’: line 16, column 7, but may
    be elsewhere in the file depending on the exact syntax problem.
    The offending line appears to be:
    — name: Reboot server if kernel updated
    ^ here

Добавить комментарий