Найти в Дзене
Вороний блог | Linux и IT

Пишем ansible playbook для начальной настройки Linux сервера

Исходный сайт представленного материала: r4ven.me Сегодня про автоматизацию начальной настройки Linux сервера посредством Ansible🎺. От установки locales, timezone, параметров SSH сервера… до создания и настройки окружения нового пользователя👨‍💻: Oh-My-Zsh, Neovim и Tmux. Будет интересно😉. Для примеров из статьи в качестве управляющего хоста использовалась система с Linux Mint 22. Ansible playbook разработан под Deb based дистрибутивы и протестирован на Debian 12 и Ubuntu 24. Дорогие читатели, прошу обратить ваше внимание на тот факт, что материалы на моём сайте носят рекомендательный характер. Все действия вы выполняете на свой страх и риск. Всегда делайте бэкапы важных файлов, перед настройкой виртуалок делайте снапшоты, а перед внесением изменений на продуктивных серверах всегда проверяйте их на тестовом стенде. Благодарю за понимание. Все просто — данный плейбук является автоматизацией моих прошлых статей: В каждой из статей довольно много подробностей и рутинных действий. Поэто
Оглавление
Пишем ansible playbook для начальной настройки Linux сервера
Пишем ansible playbook для начальной настройки Linux сервера

Исходный сайт представленного материала: 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
черт, а я тут ufw пользуюсь..😳
черт, а я тут ufw пользуюсь..😳

2) Настройка окружения пользователя:

  • Создание нового пользователя с указанием пароля, оболочки и списка групп
  • Добавление публичного SSH ключа авторизации в ~/.ssh
  • Установка пакетов пользователя (отдельный список)
  • Скачивание и применение конфигурации для Zsh, Neovim, Tmux

Если вам не нужно выполнять все перечисленные действия, то плейбук подразумевает выборочную конфигурацию с помощью указания флагов (см. ниже) или через теги задач.

Подготовка

Для запуска плейбука нам понадобятся:

  1. Целевые Linux сервер(ы) с Debian/Ubuntu на борту
  2. Возможностью удаленного подключения к этим серверам по SSH
  3. Установленный и настроенный 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

-3

При их отсутствии выполните установку:

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/

-4

Состав роли выглядит так:

ls -l --tree --sort=type ./roles/linux-base-config

-5
Понравился вывод команды 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 порт, чтобы не потерять доступ к серверу во время настройки.
-6
Понравился мой конфиг Neovim? Можете с легкостью создать аналогичный по статье: Neovim – Установка и настройка редактора кода с элементами IDE всего в несколько команд.
Понравился мой конфиг Neovim? Можете с легкостью создать аналогичный по статье: Neovim – Установка и настройка редактора кода с элементами IDE всего в несколько команд.

Пароли пользователей вы можете указать явно (ansible все равно сделает из них строку SHA-512 на сервере), но так делать не рекомендуется☝️. Безопаснее всего указать их в виде хэш строки. К слову, аналогичным образом в файле /etc/shadow хранятся пароли локальных пользователей Linux.

Пароль в виде строки SHA-512

Чтобы получить hash пароля в SHA-512 воспользуйтесь утилитой mkpasswd (из пакета whois) или openssl (из пакета openssl):

mkpasswd --method=sha-512

# или

openssl passwd -6

-8

Генерация публичного SSH ключа

Если у вас уже есть SSH ключи, просто скопируйте публичный и вставьте в соответствующую переменную: user_ssh_pubkey. Для генерации нового SSH ключа воспользуйтесь командой:

# генерация нового ключа
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519

# вывод публичного ключа
cat ~/.ssh/id_ed25519.pub

-9

Подробнее про 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

-10
Часть задач будет пропущена.

Все задачи в данной роли имеют теги. Чтобы выполнить пул по тегу(ам) используйте ключ -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. Команда универсальна.
-11

После установки шрифта, активируйте его в настройках вашего терминала🛠.

В Gnome-terminal это делается так:

-12

Послесловие

Вот так автоматизация сокращает количество ручной работы в десятки раз.

Спасибо, что читаете 😊. Еще раз напомню, что актуальные версии файлов из статьи доступны в моем репозитории на GitHub.

Обязательно подписывайтесь на наш телеграм канал: @r4ven_me, уведомления о новых материалах на сайте приходят туда в день публикации. А если появились вопросы – приглашаю в наш дружелюбный Вороний чат 🚶‍♀️🐧🚶🐧🚶‍♂️🐧.

Всех благ!

Оригинал статьи на сайте r4ven.me