CentOS 7.1: первые серверы на systemd и XFS - составляем чеклист миграции
CentOS 7.1 (1503) - клон RHEL 7.1 с systemd, firewalld и XFS по умолчанию. Разворачиваем первые серверы на семёрке и фиксируем грабли в чеклист.
CentOS 7.1 (1503) выпущен как производственный клон RHEL 7.1 с systemd и XFS по умолчанию
CentOS 7.1 (сборка 1503) вышел в марте, и мы наконец взялись за первые рабочие серверы на семёрке. Не тестовые стенды, а реальные машины для клиентов на сопровождении. Впечатление одно: это другой дистрибутив. Не «чуть другой», а именно другой - с другой философией управления сервисами, другим файрволом и другой файловой системой по умолчанию.
Ниже - что именно поменялось, где мы споткнулись и как выглядит чеклист миграции, который составили чтобы не повторять одни и те же ошибки.
Что изменилось относительно шестёрки
Три главных отличия, которые бьют в лоб при первом деплое:
Systemd вместо SysVinit. Забудьте про service httpd restart и chkconfig httpd on. Теперь systemctl restart httpd и systemctl enable httpd. Само по себе несложно, но ломает всё что написано руками за годы: скрипты мониторинга, Ansible-плейбуки, runbook-ы в вики. Ansible 1.9 понимает systemd через модуль service - но только если явно указать use: systemctl, иначе может попытаться использовать старую логику.
Самое неожиданное: логи. tail -f /var/log/messages больше не даёт полной картины. Systemd забирает stdout/stderr сервисов в journald, и смотреть их нужно через journalctl -u httpd -f. Первые два часа мы честно гадали куда делись логи Apache - пока не осознали.
Firewalld вместо iptables. CentOS 7 приходит с firewalld поверх iptables. Концепция зон вместо цепочек - надо переучиваться. iptables -L работает, но показывает правила firewalld, переведённые в iptables - и это вносит путаницу. Мы пока поступаем прагматично: на первых серверах отключаем firewalld, ставим iptables-services и пишем правила по-старому. Технически это шаг назад, но зато не смешиваем два подхода в голове одновременно.
XFS по умолчанию. Анкадер-разметка при установке теперь создаёт XFS вместо ext4. Для большинства задач разницы нет, но есть одна вещь которую нужно знать: XFS не умеет уменьшать файловую систему. Ext4 - умеет (с оговорками), XFS - нет от слова совсем. Если ошибся с разметкой диска - придётся создавать новую FS и копировать данные. Это не плохо и не хорошо, просто нужно держать в голове при планировании разметки.
Где споткнулись
Ansible-плейбуки. Наш базовый провизионинг через Ansible написан с расчётом на CentOS 6 и systemd в части условий через when: ansible_os_family. Выяснилось что этого недостаточно: даже внутри CentOS 6 и 7 логика управления сервисами разная. Пришлось добавить проверку на ansible_distribution_major_version и разделить таски для шестёрки и семёрки. Часа три потеряли на отладку.
SELinux. В шестёрке мы периодически честно его отключали на ряде серверов - некоторые приложения настраивать под SELinux было нецелесообразно. В семёрке решили держать его включённым. Это правильно, но требует понимания контекстов. restorecon -Rv /var/www стал новым другом. Особенно порадовал нестандартный порт для nginx: semanage port -a -t http_port_t -p tcp 8080 - не ошибка, а норма жизни.
Hostname. В шестёрке правишь /etc/sysconfig/network. В семёрке - hostnamectl set-hostname. Мелочь, но если не знаешь - тратишь время.
Чеклист миграции
Что мы теперь проверяем при деплое нового сервера на CentOS 7:
- Управление сервисами - все
service/chkconfigв скриптах заменить наsystemctl. - Логи - настроить
journaldи при необходимости пробросить в rsyslog для совместимости с Zabbix и привычными log-файлами. - Файрвол - определиться с подходом: firewalld или iptables-services. Не смешивать.
- SELinux - оставить включённым, заранее проверить контексты для нестандартных путей и портов.
- Разметка диска - решить про XFS/ext4 до установки, учитывая что XFS не сжимается.
- Hostname -
hostnamectl set-hostname, не трогать/etc/sysconfig/network. - NetworkManager - на серверах мы его отключаем и работаем с ifcfg-файлами напрямую. NetworkManager удобен на десктопе, на сервере добавляет неопределённость.
- Ansible - проверить что все таски корректно ветвятся по
ansible_distribution_major_version.
Что думаем
Переход болезненный ровно настолько, насколько ты привязан к старым привычкам. Systemd на самом деле удобнее: зависимости между сервисами описываются явно, journald дает структурированный лог, systemctl status показывает последние строки лога прямо в выводе - не нужно лазить в файл отдельно.
Firewalld - пока не распробовали. Держим iptables, смотрим на firewalld в тестовой среде.
Главный вывод: не пытайтесь перенести привычки шестёрки один в один. CentOS 7 требует потратить день на то чтобы понять как он думает - тогда работать становится проще. Если пытаться его сломать под старые паттерны - будет только больнее.
Чеклист будем дополнять по мере того как набиваем новые шишки.