Если вы попробуете обновить salt-миньоны с salt-мастера, в большинстве случаев salt-мастер, скорее всего, потеряет связь с миньонами.
При потерянной связи вам придется самим заходить на каждый хост и рестартовать сервис salt-minion вручную, чтобы заставить миньонов снова общаться с мастером.
Проблема вызвана тем, что сервис salt-minion часто сам не перезапускается после обновления.
Дельный Совет: А вы знали что с помощью стэйта file.managed можно скачивать файлы по HTTP/HTTPS даже с неизвестным source_hash
? Читать далее →
В этой статье я покажу как безопасно обновить salt-миньоны с salt-мастера без потери связи между ними.
Обновить Salt-Master
В первую очередь необходимо обновить salt-master.
Порядок обновления: В соответствии с документацией, в первую очередь всегда необходимо обновлять мастера, так как не гарантируется обратная совместимость для миньонов более новых версий чем их мастер.
Обновить salt-master на CentOS, RHEL и т.п.:
$ sudo yum update salt-master
Обновить salt-master на Debian, Ubuntu, Linux Mint и т.п.:
$ sudo apt-get update salt-master
Чтобы узнать версию salt-мастера, выполните:
$ salt-master --version
Обновить Salt-Minion
В данный момент не существует нормального способа обновления salt-миньонов с salt-мастера без потери связи между ними.Но вы можете создать salt-state, который будет отправлять специальную шелл-команду на salt-миньон и выполнять ее в фоне.
Эта шелл-команда будет обновлять и перезапускать сервис salt-minion с помощью локально вызова salt-call
.
После того, как сервис salt-minion будет перезапущен, связь с salt-мастером будет успешно восстановлена.
Дельный Совет: Каждый DevOps должен знать основы работы с Git. И вы можете освоить их прямо сейчас! Читать далее →
В то же время, данный salt-state предварительно проверяет наличие новой версии пакета salt-minion, чтобы избежать перезапуска сервиса salt-minion без надобности.
Создайте следующий salt-state на мастере и примените его к миньонам, чтобы безопасно обновить их:
Upgrade Salt-Minion: cmd.run: - name: | exec 0>&- # close stdin exec 1>&- # close stdout exec 2>&- # close stderr nohup /bin/sh -c 'salt-call --local pkg.install salt-minion && salt-call --local service.restart salt-minion' & - onlyif: "[[ $(salt-call --local pkg.upgrade_available salt-minion 2>&1) == *'True'* ]]"
Чтобы узнать текущую версию ваших salt-миньонов с salt-мастера, выполните:
$ sudo salt '*' test.version
Спасибо, за статью. Помогло.
Nice, thanks.
Не работает, состояние применяется, но не обновляет
Достаточно просто
«`
Upgrade Salt-Minion:
cmd.run:
— name: |
exec 0>&- # close stdin
exec 1>&- # close stdout
exec 2>&- # close stderr
nohup /bin/sh -c ‘salt-call —local pkg.install salt-minion only_upgrade=True && salt-call —local service.restart salt-minion’ &
«`
Will the same works for windows as well?
@kk12345 for sure not as the commands used are *nix commands.
My idea is to remotely schedule a job a few seconds in the future here.
I had to invert the `onlyif `bash conditional expression (`[[ $(salt-call —local…` to `![[ $(salt-call —local…`). When I ran the expression as written in Bash, it was returning 0 for success, but it appears that Salt was evaluating that return code 0 as False, making the `onlyif` statement False in turn. Negating the expression made it work like a charm.