Установка Ansible и подключение к управляемым хостам

PythonBeginner
Практиковаться сейчас

Введение

Вы готовите управляющий узел Ansible для управления двумя серверами Linux. Прежде чем писать автоматизацию, вам нужна предсказуемая установка и подтверждение того, что управляющий узел может выполнять модули Python на обоих целевых узлах.

В этой лабораторной работе вы создадите виртуальное окружение проекта, установите Ansible Core из локального кэша пакетов, активируете его в терминале и проверите два настоящих SSH-соединения с помощью предоставленного инвентаря. Достаточно базовых навыков работы с командной строкой; опыт работы с Ansible не требуется.

Создайте изолированное окружение управляющего узла

На этом шаге вы создадите окружение Python для собственной установки Ansible.

Ansible работает на управляющем узле и подключается к управляемым узлам по SSH. Ваш терминал LabEx — это управляющий узел Ubuntu. Два подготовленных контейнера Linux, web1 и web2, выступают отдельными управляемыми узлами: у них разные адреса, имена хостов и файловые системы, но общее ядро виртуальной машины. Команды Docker и изменения настроек входа на платформу не понадобятся.

Виртуальное окружение Python отделяет пакеты проекта от операционной системы и общих инструментов курса. В образе уже есть общая команда Ansible для инфраструктуры, но ваша задача — установить отдельную копию в /home/labex/project/.venv.

Откройте терминал. Выберите каталог проекта командой cd; дальнейшие относительные пути отсчитываются от него:

cd /home/labex/project

Команда pwd выводит текущий рабочий каталог:

pwd

Она должна вывести /home/labex/project. Работайте в этом каталоге на протяжении всей лабораторной работы.

Команда ansible-python выбирает подготовленный Python курса. Параметр --version показывает его версию:

ansible-python --version

Ожидаемый результат — Python 3.12.15. Системный Python управляющего узла остаётся отдельным; не заменяйте его.

Параметр -m venv запускает модуль виртуальных окружений Python. Последний аргумент .venv задаёт имя создаваемого каталога внутри проекта. Точка в начале скрывает его из обычного списка каталогов:

ansible-python -m venv .venv

Обычно команда завершается без вывода. Она создаёт окружение и pip — установщик пакетов Python; сам Ansible пока не установлен.

Запустите Python нового окружения по относительному пути. Так вы убедитесь, что изолированный интерпретатор можно использовать без предварительной активации:

.venv/bin/python --version

Он также должен вывести Python 3.12.15. Обе команды Python используют один выпуск Python, но пакеты, установленные в .venv, принадлежат этому проекту.

Установите и активируйте Ansible без доступа к сети

На этом шаге вы установите закреплённый выпуск Ansible Core в .venv и настроите терминал на его использование.

Ansible Core предоставляет команду ansible и встроенные модули, используемые в этом курсе. Подготовленные wheel-файлы — это локальные пакеты Python, поэтому установка не зависит от загрузок из интернета. Файл требований задаёт совместимые закреплённые версии.

Следующая команда запускает pip через Python проекта. Подкоманда install устанавливает пакеты, --no-index отключает сетевые индексы пакетов, --find-links выбирает локальный каталог wheel-файлов, а -r читает файл требований:

.venv/bin/python -m pip install --no-index --find-links /opt/labex/ansible-course/wheels -r /opt/labex/ansible-course/requirements.txt

В выводе перечислены пакеты, обработанные из локального кэша; в конце появляется Successfully installed ..., включая ansible-core-2.21.5. При повторной установке вместо этого может появиться Requirement already satisfied.

Активация помещает каталог команд окружения в начало пути поиска текущей оболочки. Команда source выполняет сценарий активации в текущем терминале, поэтому изменение действует и для последующих команд:

source .venv/bin/activate

Теперь приглашение может начинаться с (.venv). Терминал использует zsh; команда rehash обновляет кэш расположений команд после установки новых исполняемых файлов:

rehash

Команда command -v показывает, какой исполняемый файл выбирается по имени команды:

command -v ansible

Ожидаемый результат — /home/labex/project/.venv/bin/ansible. Общий путь, например /usr/local/bin/ansible, не подтверждает активацию установки проекта. Если вы откроете новый терминал, вернитесь в проект, снова активируйте окружение и выполните rehash.

Теперь проверьте версию запускаемого Ansible:

ansible --version

Найдите в выводе следующие поля:

ansible [core 2.21.5]
  config file = /home/labex/project/ansible.cfg
  ...
  ansible python module location = /home/labex/project/.venv/lib/python3.12/site-packages/ansible
  executable location = /home/labex/project/.venv/bin/ansible
  python version = 3.12.15 ...
  ...

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

Наконец, команда pip check проверяет совместимость зависимостей установленных пакетов:

.venv/bin/python -m pip check

Ожидаемый результат — No broken requirements found. Теперь у вас есть рабочий управляющий узел без изменения системных пакетов и общих инструментов.

Подключитесь к обоим управляемым узлам

На этом шаге вы изучите подготовленный инвентарь и выполните проверку соединения с использованием Python на обоих целевых узлах SSH.

Инвентарь сообщает Ansible, какими хостами он может управлять. Команда cat выводит содержимое файла; прочитайте предоставленный инвентарь проекта:

cat inventory.ini

Он имеет следующую структуру:

web1 ansible_host=...
web2 ansible_host=...

[all:vars]
ansible_user=automation
ansible_ssh_private_key_file=/home/labex/.local/share/ansible-course/id_ed25519
ansible_python_interpreter=/usr/bin/python3

Вместо ... указаны настоящие адреса; используйте существующие значения. web1 и web2 — имена в инвентаре, а ansible_host задаёт адрес назначения SSH для каждого узла. Секция [all:vars] применяет следующие за ней параметры соединения к обоим хостам. automation — обычная учётная запись внутри управляемых узлов, а не ваша учётная запись labex на управляющем узле. Лабораторная работа предоставляет новый учебный ключ и доверенные ключи хостов; генерировать ключи и менять настройки SSH не требуется.

Путь Python целевого узла /usr/bin/python3 относится к каждому управляемому узлу. Это не Python проекта на управляющем узле: большинству модулей Ansible нужен Python как на целевом, так и на управляющем узле.

Предоставленный ansible.cfg выбирает этот инвентарь при запуске команд из проекта. Шаблон all выбирает все хосты инвентаря; --list-hosts позволяет предварительно просмотреть выбор без запуска модуля:

ansible all --list-hosts

Ожидаются ровно эти два имени хостов; порядок может отличаться:

  hosts (2):
    web1
    web2

Параметр -m выбирает модуль — единицу работы Ansible. ansible.builtin.ping — полное имя встроенного модуля ping. Он подключается по SSH и запускает Python на каждом целевом узле; это не сетевой ICMP ping:

ansible all -m ansible.builtin.ping

Оба хоста должны вернуть результаты со следующими неизменными полями; порядок результатов может отличаться:

web1 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
web2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

Ответ pong подтверждает успешную аутентификацию SSH и выполнение Python на этом хосте. changed: false означает, что проверка соединения не запрашивала изменения конфигурации. Успеха на одном хосте недостаточно: найдите оба имени. UNREACHABLE означает сбой соединения; FAILED — сбой задачи. Пустой список хостов тоже не подтверждает возможность подключения.

Если команда завершается ошибкой, сначала убедитесь, что вы всё ещё находитесь в каталоге проекта, что command -v ansible выбирает .venv/bin/ansible и что предоставленный инвентарь по-прежнему содержит оба исходных адреса назначения. Не меняйте настройки входа, SSH и sudo платформы.

Резюме

Вы создали изолированное окружение управляющего узла, установили пакеты Ansible Core с закреплёнными версиями из локального кэша, активировали команды проекта и проверили их пути и зависимости. Вы изучили предоставленный инвентарь и получили ответ Python pong от каждого отдельного узла, управляемого по SSH. Теперь вы умеете различать Python управляющего узла, Python целевого узла и имена в инвентаре и готовы изучать конфигурацию проекта.