Подготовка управляемых узлов: SSH, пользователь и sudo

Рейтинг: 72.2% · 10 голосов
Подробный курс по Ansible с прицелом на экзамен RHCE EX294: установка и инвентарь, плейбуки, переменные и факты, Vault, циклы и условия, шаблоны Jinja2, роли и коллекции, Execution Environments и ansible-navigator, управление системами (диски, LVM, cron, SELinux, firewalld). Примеры на RHEL/Fedora. Актуально на 2026.
Ответить
Аватара пользователя
Maksim_DevOps
Сообщения: 47
Зарегистрирован: 11 май 2026, 05:31

Подготовка управляемых узлов: SSH, пользователь и sudo

Сообщение Maksim_DevOps »

Оглавление курса (47)
  1. Что такое Ansible и зачем он нужен: автоматизация без агентов
  2. Сертификация RHCE и экзамен EX294: что внутри и как готовиться
  3. Архитектура Ansible: control node, узлы, модули и плагины
  4. Установка Ansible на control node: dnf, pip и версии ansible-core
  5. Подготовка управляемых узлов: SSH, пользователь и sudo (вы здесь)
  6. Инвентарь Ansible: hosts, группы и переменные
  7. Настройка Ansible: файл ansible.cfg и приоритеты конфигурации
  8. Host patterns и инструменты командной строки Ansible
  9. Ad hoc команды Ansible: быстрые задачи без плейбука
  10. Ansible playbook: что это такое и как устроен
  11. Структура плейбука: play, task, модули и переменные
  12. Запуск плейбуков: проверка, теги, ограничения и отладка
  13. Параллелизм и порядок выполнения: forks, serial, strategy
  14. Факты Ansible: сбор информации об узлах
  15. Переменные Ansible: типы, объявление и приоритет
  16. Регистрация результатов и специальные переменные
  17. Ansible Vault: шифрование паролей и секретов
  18. Организация инвентаря: group_vars, host_vars и вложенные группы
  19. Динамический инвентарь и инвентарные плагины
  20. Циклы в Ansible: loop, списки и словари
  21. Повтор задачи до условия: until, retries и delay
  22. Условия в Ansible: директива when и логика
  23. Jinja2 в Ansible: выражения, фильтры и подстановки
  24. Обработчики Ansible: handlers, notify и flush_handlers
  25. Обработка ошибок: failed_when, changed_when и ignore_errors
  26. Блоки в Ansible: block, rescue и always
  27. Управление файлами: модули file, copy, fetch и stat
  28. Архивы и сборка файлов: archive, unarchive, assemble
  29. Точечное редактирование файлов: lineinfile и blockinfile
  30. Шаблоны Jinja2: модуль template и динамические конфиги
  31. Jinja2 продвинуто: фильтры, циклы, макросы и lookup
  32. Модули Ansible: ansible-doc и поиск нужного модуля
  33. Разработка собственного модуля Ansible на Python
  34. Роли Ansible и Ansible Galaxy: переиспользование
  35. Разработка роли Ansible: создание с нуля
  36. Зависимости ролей и requirements.yml
  37. Коллекции Ansible: ansible.posix, community и своя коллекция
  38. Execution Environments: контейнеры для запуска Ansible
  39. Сборка Execution Environment с ansible-builder
  40. ansible-navigator: запуск плейбуков в Execution Environment
  41. Управление SSH-ключами через Ansible: authorized_key
  42. Управление дисками: filesystem, mount и parted
  43. LVM через Ansible: тома, группы и расширение
  44. Планировщик задач: cron и systemd timers через Ansible
  45. Безопасность: hardening SSH и репозитории dnf/yum
  46. SELinux через Ansible: булевы, контексты и порты
  47. Сквозной проект и подготовка к экзамену EX294
Зачем вообще "готовить" узлы

Ansible не ставит на управляемые машины никакого агента. Это его главная фишка и одновременно источник большинства проблем у новичков. Вместо демона он подключается к серверу по обычному SSH, копирует туда временный модуль на Python, выполняет его, забирает результат и стирает за собой. Из этого выводится весь список того, что должно быть на узле, чтобы плейбук вообще запустился.

Подготовка узлов ansible сводится к трём вещам. Первое - туда должен пускать SSH без интерактивного ввода пароля, то есть по ключу. Второе - на узле должен быть интерпретатор Python, потому что почти все модули написаны на нём. Третье - у тебя должна быть возможность поднять права до root, потому что устанавливать пакеты или править firewalld от обычного юзера не выйдет.

Звучит просто, но именно на этом этапе спотыкается половина людей, которые потом пишут "ansible ssh не работает" в поиске. Разберём по шагам, как сделать так, чтобы первый же ping прошёл с первого раза, а не на десятой попытке.

Изображение

Отдельный пользователь автоматизации и раздача SSH-ключей

Заходить под root по SSH - плохая идея, и на экзамене, и в жизни. Правильный паттерн такой: на каждом узле живёт отдельный пользователь автоматизации (назовём его ansible), у него есть твой публичный ключ в authorized_keys, и он умеет делать sudo. Управляющая нода ходит на узлы под этим пользователем.

Сначала на управляющей машине генерируем пару ключей, если её ещё нет. Современный алгоритм - ed25519, он короче и быстрее RSA.

Код: Выделить всё

# на управляющем узле, под пользователем ansible
ssh-keygen -t ed25519 -C "ansible control node"
# просто Enter на все вопросы: путь по умолчанию ~/.ssh/id_ed25519,
# для лабы можно без passphrase
Дальше ключ нужно разложить по управляемым узлам. Руками это делает ssh-copy-id - он сам допишет твой публичный ключ в ~/.ssh/authorized_keys на удалённой машине и заодно выставит правильные права на каталог.

Код: Выделить всё

# первый раз - по паролю, чтобы закинуть ключ
ssh-copy-id ansible@node1.example.com
# проверяем беспарольный вход
ssh ansible@node1.example.com 'hostname; id'
Если второй командой ты зашёл без пароля и увидел имя хоста - база готова. Это и есть проверка беспарольного входа, без неё дальше идти бессмысленно.

Когда узлов много, раскладывать ключи руками неудобно. Тут уже сам Ansible помогает: модуль ansible.posix.authorized_key добавляет публичный ключ нужному пользователю идемпотентно. Запускать такой плейбук придётся либо по уже разложенному ключу, либо разово по паролю с флагом -k (--ask-pass).

Код: Выделить всё

---
- name: Раздать ключ автоматизации на узлы
  hosts: all
  become: true
  tasks:
    - name: Создать пользователя ansible
      ansible.builtin.user:
        name: ansible
        shell: /bin/bash
        state: present

    - name: Положить публичный ключ пользователю ansible
      ansible.posix.authorized_key:
        user: ansible
        key: "{{ lookup('file', '~/.ssh/id_ed25519.pub') }}"
        state: present
В реальном RHEL-семействе (RHEL, Fedora, AlmaLinux, RED OS) Python обычно уже стоит. Если узел голый, поставить интерпретатор можно через модуль ansible.builtin.raw, который не требует Python на той стороне. На Ubuntu или Debian пакет называется python3, ставится через apt - сама механика ключей и пользователя там ровно та же.

Privilege escalation: ansible become и sudo

Ходим мы под обычным пользователем ansible, а делать надо рутовые вещи. За это отвечает механизм повышения прав, который в Ansible называется become. Это ключевая тема, и без понимания ansible become на EX294 делать нечего - повышение прав там нужно почти в каждой задаче.

Три главных ключевых слова:
  • become: true - включить повышение прав для задачи, плея или всего плейбука.
  • become_user - до какого пользователя поднимаемся. По умолчанию root, но можно указать любого, например become_user: postgres.
  • become_method - каким способом. По умолчанию sudo, что нам и нужно на RHEL.
Включать become можно на любом уровне. Удобно задавать его на уровне плея, а в отдельных задачах при необходимости отключать через become: false.

Код: Выделить всё

---
- name: Установка веб-сервера
  hosts: webservers
  become: true            # весь плей идёт под root через sudo
  tasks:
    - name: Поставить пакет
      ansible.builtin.dnf:
        name: httpd
        state: present

    - name: Запустить и включить службу
      ansible.builtin.service:
        name: httpd
        state: started
        enabled: true

    - name: Открыть порт в firewalld
      ansible.posix.firewalld:
        service: http
        permanent: true
        immediate: true
        state: enabled
Теперь про sudo на самих узлах. Чтобы пользователь ansible мог поднимать права, ему нужно правило в sudoers. Есть два варианта.

Вариант NOPASSWD - пользователь делает sudo вообще без пароля. Удобно для автоматизации, типично для лаб и для экзамена. Кладём отдельный файл в /etc/sudoers.d/, а не правим основной sudoers.

Код: Выделить всё

# /etc/sudoers.d/ansible  (права 0440)
ansible ALL=(ALL) NOPASSWD: ALL
Вариант с паролем - sudo спрашивает пароль, и ты передаёшь его Ansible через флаг --ask-become-pass (короткий -K) при запуске, либо через переменную ansible_become_password в защищённом vault. Это безопаснее, но требует, чтобы пароль был доступен в момент запуска.

Код: Выделить всё

# запуск с запросом become-пароля
ansible-playbook site.yml -K
# а -k (маленькая) - это запрос SSH-пароля, не путай их
Запомни разницу: маленькая -k спрашивает пароль для SSH-подключения, большая -K спрашивает пароль для sudo. На экзамене путаница между ними стоит времени и нервов.

Проверка связи: ansible ping

Когда ключи разложены и become настроен, надо убедиться, что всё живо. Для этого есть модуль ansible.builtin.ping. Это НЕ сетевой ICMP-пинг. Модуль подключается по SSH, запускает на узле минимальный Python-код и возвращает pong. То есть ansible ping проверяет сразу три вещи: что SSH пускает, что Python на месте и что модуль отрабатывает.

Код: Выделить всё

# ad-hoc проверка всех узлов из инвентаря
ansible all -m ansible.builtin.ping
Хороший ответ выглядит так:

Код: Выделить всё

node1.example.com | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3.9"
    },
    "ping": "pong"
}
Если видишь SUCCESS и pong на всех узлах - можно запускать плейбуки. Если нет, ошибка подскажет, где сломалось.

Типичные грабли

Host key checking. При первом подключении SSH спрашивает "точно доверяешь этому хосту?". В интерактиве ты жмёшь yes, а Ansible на этом молча зависает или падает с "Host key verification failed". Лечится либо предварительным сбором ключей через ssh-keyscan в known_hosts, либо отключением проверки в ansible.cfg:

Код: Выделить всё

# ansible.cfg
[defaults]
host_key_checking = False
Отключать проверку удобно в лабе, но в проде это снижает защиту от man-in-the-middle, помни про это.

Нет Python на узле. Симптом - ошибка вроде "/usr/bin/python: No such file or directory". Голый минимальный образ может приехать без интерпретатора. Решение - поставить python3 через модуль raw до основного плея, или указать путь явно через ansible_python_interpreter.

Права sudo. Ошибка "Missing sudo password" значит, что ты не дал NOPASSWD и не передал -K. Ошибка "sudo: a password is required" - то же самое с другой стороны. А если become просто не срабатывает, проверь, что файл в /etc/sudoers.d имеет права 0440 и проходит проверку visudo - битый файл sudoers игнорируется целиком.

Не тот пользователь. Ansible по умолчанию подключается под тем же юзером, под которым ты сидишь на управляющей ноде. Если на узлах пользователь называется иначе, задай его в инвентаре через ansible_user=ansible, иначе будешь долго думать, почему ключ "не подходит".

Мини-лаба

Подними две виртуалки с RHEL/Fedora (или AlmaLinux) и проделай руками весь цикл:
  • Сгенерируй ключ ed25519 на управляющей ноде через ssh-keygen.
  • Заведи пользователя ansible на обоих узлах и разложи ему ключ через ssh-copy-id.
  • Проверь беспарольный вход обычным ssh - без этого дальше не идём.
  • Положи правило NOPASSWD в /etc/sudoers.d/ansible с правами 0440.
  • Прогони ansible all -m ansible.builtin.ping и добейся pong на обоих узлах.
  • Напиши маленький плейбук с become: true, который ставит httpd и открывает порт в firewalld.
Контрольные вопросы
  • Чем флаг -k отличается от -K при запуске ansible-playbook?
  • Что именно проверяет модуль ansible.builtin.ping и почему это не ICMP?
  • Какие три ключевых слова отвечают за повышение прав и какие у них значения по умолчанию?
  • Почему правило для sudo лучше класть в /etc/sudoers.d/, а не в основной /etc/sudoers, и какие права должны быть у файла?
Итог

Управляемый узел готов, когда туда пускает SSH по ключу, на нём есть Python и пользователь автоматизации умеет делать sudo. Раздаёшь ключи через ssh-copy-id или ansible.posix.authorized_key, повышаешь права через become с become_user и become_method, проверяешь всё одной командой ansible ping. Это та самая база, на которой держится весь остальной курс и без которой на EX294 не сдвинуться с места.
👍4 ❤️2 🔥 😄 🤔1
Аватара пользователя
mbrowny
Сообщения: 1
Зарегистрирован: 17 май 2026, 13:50

Re: Подготовка управляемых узлов: SSH, пользователь и sudo

Сообщение mbrowny »

Спасибо, наконец дошло в чем разница между -k и -K, я их месяц путал и не понимал почему то SSH ругается, то sudo. Маленькая - подключение, большая - права, записал.
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
maxwolf9
Сообщения: 1
Зарегистрирован: 18 май 2026, 22:57

Re: Подготовка управляемых узлов: SSH, пользователь и sudo

Сообщение maxwolf9 »

А если на узле вообще нет python3 и ssh-copy-id уже прошел, то raw-модулем ставить интерпретатор надо ДО ping или ping все равно сначала прогонять? У меня на минимальном образе AlmaLinux как раз No such file or directory вылезло.
👍1 ❤️ 🔥 😄 🤔
Ответить
← Предыдущая глава
Установка Ansible на control node: dnf, pip и версии ansible-core
Следующая глава →
Инвентарь Ansible: hosts, группы и переменные

Все главы курса «Ansible: автоматизация и подготовка к RHCE (EX294)»

Поделиться темой: ✈ Telegram VK
  • Похожие темы

Вернуться в «Ansible: автоматизация и подготовка к RHCE (EX294)»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость