Исходный сайт представленного материала: r4ven.me
Приветствую!
Сегодня про автоматизацию начальной настройки Linux сервера посредством Ansible🎺. От установки locales, timezone, параметров SSH сервера… до создания и настройки окружения нового пользователя👨💻: Oh-My-Zsh, Neovim и Tmux. Будет интересно😉.
Для примеров из статьи в качестве управляющего хоста использовалась система с Linux Mint 22. Ansible playbook разработан под Deb based дистрибутивы и протестирован на Debian 12 и Ubuntu 24.
Дорогие читатели, прошу обратить ваше внимание на тот факт, что материалы на моём сайте носят рекомендательный характер. Все действия вы выполняете на свой страх и риск. Всегда делайте бэкапы важных файлов, перед настройкой виртуалок делайте снапшоты, а перед внесением изменений на продуктивных серверах всегда проверяйте их на тестовом стенде. Благодарю за понимание.
Все просто — данный плейбук является автоматизацией моих прошлых статей:
В каждой из статей довольно много подробностей и рутинных действий. Поэтому идея автоматизировать процесс родилась сама собой. В этой заметке я расскажу про мою Ansible role, которая сводит количество выполняемых действий из статей выше — к одной команде. Если конечно соблюдены необходимые условия😉.
Коротко перечислю, что делает playbook:
1) Конфигурация сервера:
- Замена пароля root пользователя
- Установка временнОй зоны (timezone)
- Установка hostname
- Добавление хостов в файл hosts
- Настройка локализации
- Обновление и установка пакетов
- Конфигурация SWAP (если его нет) в файле
- Ограничение количества хранимых системных журналов journald
- Конфигурация SSH сервера
- Отключение использования IPv6 в системе и в фаерволе UFW
- Открытие заданного списка сетевых портов в UFW
2) Настройка окружения пользователя:
- Создание нового пользователя с указанием пароля, оболочки и списка групп
- Добавление публичного SSH ключа авторизации в ~/.ssh
- Установка пакетов пользователя (отдельный список)
- Скачивание и применение конфигурации для Zsh, Neovim, Tmux
Если вам не нужно выполнять все перечисленные действия, то плейбук подразумевает выборочную конфигурацию с помощью указания флагов (см. ниже) или через теги задач.
Подготовка
Для запуска плейбука нам понадобятся:
- Целевые Linux сервер(ы) с Debian/Ubuntu на борту
- Возможностью удаленного подключения к этим серверам по SSH
- Установленный и настроенный Ansible на управляющей машине-клиенте
Если у вас еще нет такого набора, то возможно найдете полезными эти мои материалы:
Последнюю статью крайне рекомендую, если вы новичок в Ansible👆.
Если же вам лень читать длинные полотна и вы просто хотите поскорее приступить к автоматизации, то необходимый минимум, это: файлы ansible.cfg и inventory.yml.
Открываем терминал и выполняем:
# устанавливаем ansible
sudo apt update && sudo apt install -y ansible
# создаем директории Ansible
mkdir -p ~/ansible/{playbooks,roles}
# создаем конфиг файл
nvim ~/ansible/ansible.cfg
[defaults]
home = ~/ansible/
inventory = ~/ansible/inventory.yml
playbook_dir = ~/ansible/playbooks/
roles_path = ~/ansible/roles/
host_key_checking = False
# создаем файл инвентаризации
nvim ~/ansible/inventory.yml
all:
hosts:
debian12:
ansible_host: 192.168.122.136
ansible_port: 22
ansible_user: root
ansible_ssh_private_key_file: ~/.ssh/id_rsa
# ansible_password: "Pa$$w0rD"
ubuntu24:
ansible_host: 192.168.122.11
ansible_port: 22
ansible_user: root
ansible_ssh_private_key_file: ~/.ssh/id_rsa
# ansible_become_password: "Pa$$w0rD"
Подставьте свои значения в файл инвентаризации.
Если же у вас все готово, то проверяем наличие модулей сообщества:
ansible-galaxy collection list community.general
При их отсутствии выполните установку:
ansible-galaxy collection install community.general
С подготовкой наконец-то закончили🤯.
Скачивание и разбор роли Ansible
Далее мы скачаем файлы проекта из моего репозитория на GitHub (понадобится утилита git) и скопируем нужную роль в рабочую директорию ansible, в моем случае это ~/ansible:
~ — это alias домашней директории пользователя.
# установка git
sudo apt install -y git
# клонирование репозитория во временную папку
git clone https://github.com/r4ven-me/ansible /tmp/ansible
# копирование роли в рабочую папку
cp -r /tmp/ansible/roles/linux-base-config ~/ansible/roles/
# очистка
rm -rf /tmp/ansible
# переход в рабочую папку
cd ~/ansible/
Состав роли выглядит так:
ls -l --tree --sort=type ./roles/linux-base-config
Понравился вывод команды ls? Можете с легкостью настроить такое у себя по статье: bat, exa – подсветка синтаксиса стандартного вывода в терминале Linux (cat, less, tail и ls).
Ниже приведены спойлеры для каждого файла роли, под которыми указано его содержимое на момент написания статьи с комментариями на русском языке👇.
Если вы не хотите особо вникать во все файлы, то изучите только defaults/main.yml, содержащий переменные, которые необходимо отредактировать в соответствии с вашими предпочтениями.
- defaults/main.yml — файл с переменными по умолчанию
- handlers/main.yml — файл задач-обработчиков
- meta/main.yml — метаданные о роли
- tasks/main.yml — основной файл задач
- tasks/server_config.yml — файл задач по настройке сервера
- tasks/user_config.yml — файл задач по настройке пользователя
- tests/test.yml — файл тестовых задач
- tests/inventory.yml — файл инвентаризации для тестов
- vars/main.yml — файл с переменными
- README.md — файл ридми
server_base_config.yml — файл инициализирующего плейбука
Указание своих значений переменных
Перед запуском роли Ansible необходимо указать свои значения для обязательных переменных✍️.
Сделать это можно в двух местах: в ./default/main.yml и ./vars/main.yml. Первый, понятно по названию, содержит переменные по умолчанию, а второй переопределяет значения переменных из первого. Я рекомендую вам оставить ./default/main.yml в качестве шаблона, а свои значения задать в ./vars/main.yml.
Тут следует учитывать иерархию переопределения переменных. Смотрите комментарий под постом.
Открываем его на редактирование:
nvim ./roles/linux-base-config/vars/main.yml
Вы можете раскоментировать и изменить любые значения, я укажи лишь обязательные.
Флаги (true, false):
- server_config — если true, выполняет пул задач для конфигурации сервера;
- server_reboot — если true, перезапускает сервер после завершения всех задач;
- user_config — если true, выполняет пул задач по настройке окружения пользователя.
Должен быть установлен хотя бы один флаг в true.
Переменные:
- user_name — имя нового пользователя
- user_password — пароль пользователя в виде хэш строки SHA-512 (как получить см. ниже)
- user_ssh_pubkey — публичный SSH ключ (как получить см. ниже)
- server_root_password — пароль пользователя root, также SHA-512
- server_ssh_port — новый порт сервера SSH
- server_ufw_ports — список tcp портов фаервола UFW, которые нужно открыть
В списке портов UFW обязательно укажите текущий SSH порт, чтобы не потерять доступ к серверу во время настройки.
Пароли пользователей вы можете указать явно (ansible все равно сделает из них строку SHA-512 на сервере), но так делать не рекомендуется☝️. Безопаснее всего указать их в виде хэш строки. К слову, аналогичным образом в файле /etc/shadow хранятся пароли локальных пользователей Linux.
Пароль в виде строки SHA-512
Чтобы получить hash пароля в SHA-512 воспользуйтесь утилитой mkpasswd (из пакета whois) или openssl (из пакета openssl):
mkpasswd --method=sha-512
# или
openssl passwd -6
Генерация публичного SSH ключа
Если у вас уже есть SSH ключи, просто скопируйте публичный и вставьте в соответствующую переменную: user_ssh_pubkey. Для генерации нового SSH ключа воспользуйтесь командой:
# генерация нового ключа
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519
# вывод публичного ключа
cat ~/.ssh/id_ed25519.pub
Подробнее про SSH ключи я рассказывал в прошлых статьях тут и тут.
Пример запуска playbook на двух хостах
В моей инвентаризацие Ansible есть два хоста с именами debian12 и ubuntu24. На их примере я и покажу, как запустить Playbook. Чтобы удостовериться в корректности написанных задач ansible, всегда рекомендуется прогонять плейбуки в режиме dry run🏃. Только учтите, что не все модули Ansible его поддерживают, например предусмотреть результат кастомных shell невозможно🤷♂️.
Запуск в режиме dry run
Вот команда запуска плейбука в режиме проверки (--check) для отдельных хостов из файла inventory (ключ -l или --limit + хосты через запятую):
ansible-playbook ./roles/linux-base-config/linux_base_config.yml \
--limit debian12,ubuntu24 --check
Часть задач будет пропущена.
Все задачи в данной роли имеют теги. Чтобы выполнить пул по тегу(ам) используйте ключ -t или --tags:
ansible-playbook ./roles/linux-base-config/linux_base_config.yml \
--limit debian12,ubuntu24 --check --tags sshd
С помощью тегов можно также исключать задачи: --skip-tags tag1,tag2.
Чтобы просмотреть список доступных тегов роли выполните:
ansible-playbook ./roles/linux-base-config/linux_base_config.yml --list-tags
Рабочий запуск
ВНИМАНИЕ❗️ Данный playbook меняет номер порта демона sshd и отключает парольный доступ к серверу по SSH. Крайне рекомендуется запускать необкатанные плейбуки в тестовых средах. Все действия вы выполняете на свой страх и риск. Я вас предупредил)
Теперь запускаем плейбук, который внесет реальные изменения на хосты:
ansible-playbook ./roles/linux-base-config/linux_base_config.yml \
--limit debian12,ubuntu24
Готово👌. Если какие-то из задач завершились ошибкой😢, изучите вывод, при необходимости поправьте файлы роли и запустите плейбук заново (или обратитесь в наш чат за помощью). Помните, что ansible работает по принципу идемпотентности, т.е. приводит систему к состоянию. Чаще всего, если задача выполнилась успешно, то при следующем запуске она отработает без внесения изменений.
В конце своей работы (при наличии соответствующего флага) ansible отправит команду перезапуска системы (reboot) на удаленные хосты и удалит из списка открытых в фаерволе портов 22-й. В случае успеха плейбук должен положительно завершиться задачей «Wait for online».
После отработки проверяем подключение к хостам уже под другими реквизитами.
Если необходимо просто выполнить настройку окружения пользователя, например root, сделать это можно так:
ansible-playbook ./roles/linux-base-config/linux_base_config.yml \
--limit debian12,ubuntu24 -t dots -e 'user_name=root' -e 'user_home=/root'
Дополнительно: установка powerline шрифта для GUI сеанса
Если вы выполняли настройку окружения пользователя, то для корректной отрисовки иконок в вашем терминале во время графической сессии — необходимо использовать специальный мноноширный иконочный powerline шрифт🤯, например, из проекта Nerd fonts.
Мои читатели знают, что я предпочитаю шрифт Hack☝️. Вот простой пример, как его можно установить:
Обратите вниманием, что для выполнения команд потребуются права sudo. Либо установите шрифты только для текущего пользователя в директории ~/.local/share/fonts.
# создаем директорию шрифта
sudo mkdir /usr/share/fonts/Hack
# скачиваем архив со шрифтами
curl -fsSLO \
$(curl -s https://api.github.com/repos/ryanoasis/nerd-fonts/releases/latest \
| grep browser_download_url \
| grep 'Hack.zip' \
| cut -d '"' -f 4)
# распаковываем архив, коприруем шрифты в систем
sudo unzip ./Hack.zip -d /usr/share/fonts/Hack/ && rm -f ./Hack.zip
В команде curl используется механизм подстановки командной строки. Т.е. основной команде на скачивание: curl -fsSLO передается аргумент, который является результатом выполнения другой команды внутри конструкции $(command), выполняющейся предварительно. В итоге основная команда получит прямой URL на zip файл последнего релиза шрифта Hack из GitHub. Команда универсальна.
После установки шрифта, активируйте его в настройках вашего терминала🛠.
В Gnome-terminal это делается так:
Послесловие
Вот так автоматизация сокращает количество ручной работы в десятки раз.
Спасибо, что читаете 😊. Еще раз напомню, что актуальные версии файлов из статьи доступны в моем репозитории на GitHub.
Обязательно подписывайтесь на наш телеграм канал: @r4ven_me, уведомления о новых материалах на сайте приходят туда в день публикации. А если появились вопросы – приглашаю в наш дружелюбный Вороний чат 🚶♀️🐧🚶🐧🚶♂️🐧.
Всех благ!