У меня есть несколько серверов на базе 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
ansible-playbook -i hosts update.yml
4 комментария
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
Спасибо большое!
Этот скриптик заработал сразу, только внес изменения согласно своему inventory файлу
Всегда рады помочь!
Спасибо
хотелось бы такой же для RHEL 7.8 ))