
У меня есть Ansible playbook, который я использую для настройки новых Linux VM. Недавно я создавал новую VM с Ubuntu 22.04. Playbook напишет некоторые файлы конфигурации, связанные с сетью и прочим, а затем последний шаг процесса — использовать Ansibles ansible.builtin.package
для установки всех обновлений пакетов.
- name: "Install updates"
become: true
ansible.builtin.package:
upgrade: "dist"
register: res_pkg_updates
notify: "reboot system"
tags: [ never, updates ]
Моя виртуальная машина была создана из шаблона, который я сделал несколько месяцев назад, поэтому в ОС Ubuntu было несколько устаревших пакетов, что неудивительно. Проблема в том, что один из пакетов должен поддерживать или предоставлять сетевую функциональность. Поэтому, когда модули package
запускают виртуальную машину на пути установки обновлений, сетевой демон перезапускается, и виртуальная машина получает новый IP, который был настроен ранее в моем плейбуке. Это приводит к зависанию задачи Ansible, ожидая повторного подключения к машине, которая теперь имеет другой IP.
Я хочу знать, как настроить мою ansible.builtin.package
задачу для установки обновлений пакетов, нонетперезапустите все службы, особенно сетевые.
решение1
Отделите изменение IP-адреса от транзакции пакета и остальной части игры.
Сначала обновите пакеты и сделайте все остальное.
В качестве последнего шага в этой игре обновите IP-адрес для этого хоста, но пока не поднимайте интерфейс на новом IP. Возможно, изменив файл конфигурации. Запланируйте перезагрузку этого хоста немного в будущем, например, с помощью ansible.posix.at
модуля. И, наконец, обновите DNS, чтобы Ansible inventory знал об изменении IP. Конец игры. Позже хост перезагрузится сам, завершив обновление программного обеспечения и изменение IP.
Будущая игра может начаться с ansible.builtin.wait_for_connection
удобного способа повторить попытку, если она пока недоступна.
ansible.builtin.reboot
Модуль теоретически может перезагрузиться, дождаться возвращения хоста и продолжить. Но у него нет хорошего способа перезагрузить один IP-адрес и вернуться как другой.
решение2
Возможно, другой подход: я бы использовал статический ip для VM, вместо того, чтобы динамически назначать его. Не перезапуск сетевого демона может вызвать другие проблемы при запуске плейбука
Или вы можете сделать это
- name: Update package cache and install updates
ansible.builtin.package:
name: "*"
state: latest
update_cache: yes
force: no
become: yes
force: no запрещает менеджеру пакетов принудительно выполнять обновления или перезапускать службы