Введение
В этой лабораторной работе вы научитесь устранять распространенные проблемы, возникающие при работе с Ansible на Red Hat Enterprise Linux. Вы получите практический опыт в выявлении и решении различных проблем, начиная от первоначальной настройки среды и заканчивая распространенными ошибками в плейбуках и проблемами с подключением к управляемым хостам. Упражнения охватывают исправление синтаксиса YAML, исправление ошибок шаблонизации Jinja2 и диагностику проблем на удаленных системах.
Вы начнете с подготовки среды RHEL и настройки Ansible для эффективного логирования. Затем вы погрузитесь в практические сценарии устранения неполадок, используя режим проверки (check mode) Ansible для диагностики проблем, связанных со службами, и исправления конфигураций брандмауэра для решения проблем с недоступностью хостов. К концу этой лабораторной работы вы будете обладать полным набором навыков для поддержания надежных рабочих процессов автоматизации Ansible.
Подготовка среды RHEL и настройка логирования Ansible
На этом этапе вы подготовите вашу среду Red Hat Enterprise Linux для автоматизации с помощью Ansible. Это включает установку необходимого программного обеспечения, создание выделенного каталога проекта и настройку базового конфигурационного файла для управления поведением Ansible и включения логирования. Правильная настройка — первый шаг к эффективной автоматизации и устранению неполадок.
Установка Ansible
Сначала вам нужно установить Ansible. Основной механизм автоматизации предоставляется пакетом
ansible-core. Используйте менеджер пакетовdnfсsudoдля его установки. Флаг-yавтоматически отвечает "yes" на любые запросы подтверждения.sudo dnf install -y ansible-coreВы увидите вывод, указывающий на установку пакета вместе с его зависимостями.
Last metadata expiration check: ... Dependencies resolved. ================================================================================ Package Architecture Version Repository Size ================================================================================ Installing: ansible-core x86_64 <version> <repo> 2.8 M ... Transaction Summary ================================================================================ Install XX Packages Total download size: XX M Installed size: XX M ... Complete!Создание каталога проекта
Хорошей практикой является организация ваших проектов Ansible в выделенных каталогах. Это позволяет аккуратно разделять ваши плейбуки, инвентарь и конфигурационные файлы. Давайте создадим каталог с именем
ansible_troubleshootingвнутри вашей домашней папки проекта и перейдем в него.mkdir -p ~/project/ansible_troubleshooting cd ~/project/ansible_troubleshootingС этого момента все команды в этой лабораторной работе будут выполняться из каталога
~/project/ansible_troubleshooting.Создание файла инвентаря Ansible
Инвентарь — это файл, который перечисляет хосты (или узлы), которыми будет управлять Ansible. Поскольку вы работаете на одной виртуальной машине LabEx, вы настроите Ansible для управления самой локальной машиной.
Создайте файл с именем
inventoryи добавьте в негоlocalhost. Частьansible_connection=localуказывает Ansible выполнять команды непосредственно на управляющем узле (вашей виртуальной машине) без использования SSH.echo "localhost ansible_connection=local" > inventoryВы можете проверить содержимое файла с помощью команды
cat:cat inventoryОжидаемый вывод:
localhost ansible_connection=localНастройка логирования Ansible
Файл
ansible.cfgпозволяет настраивать поведение Ansible для конкретного проекта. Когда он находится в каталоге проекта, его настройки переопределяют системные значения по умолчанию. Здесь вы создадите этот файл, чтобы указать расположение вашего инвентаря и включить логирование. Логирование имеет решающее значение для устранения неполадок, поскольку оно записывает подробную информацию о каждом запуске плейбука.Используйте редактор
nanoдля создания файлаansible.cfg.nano ansible.cfgТеперь скопируйте и вставьте следующее содержимое в редактор
nano. Эта конфигурация указывает Ansible использовать файлinventoryв текущем каталоге и записывать весь вывод логов в файл с именемansible.log.[defaults] inventory = /home/labex/project/ansible_troubleshooting/inventory log_path = /home/labex/project/ansible_troubleshooting/ansible.logЧтобы сохранить файл в
nano, нажмитеCtrl+X, затемYдля подтверждения и, наконец,Enterдля записи файла.Ваша среда теперь полностью подготовлена. У вас установлен Ansible и настроен каталог проекта с локальным инвентарем и включенным логированием, готовый к следующим шагам.
Исправление ошибок синтаксиса и отступов YAML в плейбуке
На этом этапе вы научитесь диагностировать и исправлять два наиболее распространенных типа ошибок в плейбуках Ansible: ошибки синтаксиса YAML и неправильные отступы. YAML, язык, используемый для написания плейбуков, очень строг в отношении своей структуры. Один неправильно расположенный пробел или специальный символ без кавычек может помешать выполнению плейбука. Вы будете использовать команду ansible-playbook --syntax-check — важный инструмент для проверки ваших плейбуков перед выполнением.
Создание плейбука с намеренными ошибками
Сначала вы создадите новый файл плейбука с именем
webserver.ymlв вашем каталоге проекта (~/project/ansible_troubleshooting). Этот файл содержит намеренные ошибки, которые вы будете исправлять.Используйте
nanoдля создания файла:nano webserver.ymlСкопируйте и вставьте следующее содержимое в редактор. Обратите внимание на две намеренные ошибки: строку без кавычек, содержащую двоеточие, и неправильный отступ для второй задачи.
--- - name: Configure Web Server hosts: localhost vars: ## ERROR 1: Unquoted colon in string package_comment: This is a package: httpd tasks: - name: Install httpd package ansible.builtin.dnf: name: httpd state: present ## ERROR 2: Incorrect indentation - name: Create a test index page ansible.builtin.copy: content: "<h1>Welcome to Ansible</h1>" dest: /var/www/html/index.htmlСохраните файл и выйдите из
nano, нажавCtrl+X, затемYиEnter.Выявление и исправление ошибки синтаксиса YAML (двоеточие без кавычек)
Теперь выполните проверку синтаксиса только что созданного плейбука. Эта команда проанализирует файл и сообщит о любых синтаксических проблемах, не выполняя фактически задачи.
ansible-playbook --syntax-check webserver.ymlОжидаемый вывод (Ошибка): Вы увидите ошибку, потому что значение для
package_commentсодержит двоеточие (:) , но не заключено в кавычки. YAML интерпретирует двоеточие как разделитель ключ-значение, что приводит к синтаксической ошибке.ERROR! We were unable to read either as JSON nor YAML, these are the errors we found: - Syntax Error while loading YAML. did not find expected ':' The error appears to be in '/home/labex/project/ansible_troubleshooting/webserver.yml': line 6, column 41, but may be elsewhere in the file depending on the exact syntax problem. The offending line appears to be: vars: package_comment: This is a package: httpd ^ hereРешение: Чтобы исправить это, вы должны заключить строку в двойные кавычки. Снова откройте файл с помощью
nano:nano webserver.ymlИзмените строку под
vars, добавив кавычки:## ... (остальная часть файла) vars: ## FIX: Add quotes around the string with a colon package_comment: "This is a package: httpd" ## ... (остальная часть файла)Сохраните и выйдите из редактора.
Выявление и исправление ошибки отступов YAML
После исправления первой ошибки выполните проверку синтаксиса еще раз.
ansible-playbook --syntax-check webserver.ymlОжидаемый вывод (Ошибка): На этот раз Ansible сообщит о другой ошибке, связанной со структурой плейбука.
ERROR! A malformed block was encountered. The error appears to be in '/home/labex/project/ansible_troubleshooting/webserver.yml': line 13, column 11, but may be elsewhere in the file depending on the exact syntax problem. The offending line appears to be: ## ERROR 2: Incorrect indentation - name: Create a test index page ^ hereЭта ошибка возникает потому, что YAML использует отступы для определения структуры. Все элементы списка (в данном случае, задачи, которые являются элементами списка, начинающимися с
-) должны иметь одинаковый уровень отступов. Вторая задача,Create a test index page, имеет слишком большой отступ.Решение: Откройте файл еще раз, чтобы исправить отступы.
nano webserver.ymlУдалите лишние пробелы перед второй задачей, чтобы ее дефис (
-) идеально совпадал с дефисом предыдущей задачи.## ... (остальная часть файла) tasks: - name: Install httpd package ansible.builtin.dnf: name: httpd state: present ## FIX: Correct the indentation to align with the previous task - name: Create a test index page ansible.builtin.copy: content: "<h1>Welcome to Ansible</h1>" dest: /var/www/html/index.htmlСохраните и выйдите из редактора.
Проверка исправленного плейбука
Наконец, выполните проверку синтаксиса в последний раз.
ansible-playbook --syntax-check webserver.ymlНа этот раз команда должна завершиться без ошибок, и вы увидите имя плейбука, подтверждающее, что синтаксис теперь правильный.
Ожидаемый вывод (Успех):
playbook: webserver.yml
Решение ошибок кавычек и путей к шаблонам Jinja2
На этом этапе вы устраните ошибки, связанные с Jinja2, мощным движком шаблонизации Ansible. Вы узнаете, почему выражения Jinja2 часто нуждаются в кавычках, и как устранять проблемы, когда плейбук не может найти указанный файл шаблона. Это распространенные ошибки времени выполнения, которые возникают после того, как плейбук уже прошел проверку синтаксиса.
Создание файла шаблона Jinja2
Сначала вам понадобится файл шаблона. В отличие от статического файла, шаблон может содержать переменные, которые Ansible заменит фактическими значениями во время выполнения плейбука. Вы создадите простой HTML-шаблон.
Используйте
nanoдля создания файла с именемindex.html.j2в вашем каталоге проекта (~/project/ansible_troubleshooting). Расширение.j2является распространенным соглашением для шаблонов Jinja2.nano index.html.j2Скопируйте и вставьте следующее содержимое HTML в редактор. Обратите внимание на заполнитель
{{ welcome_message }}, который является переменной Jinja2.<h1>{{ welcome_message }}</h1> <p>This page was deployed by Ansible.</p>Сохраните файл и выйдите из
nano(Ctrl+X,Y,Enter).Изменение плейбука для использования шаблона и внесение ошибок
Теперь измените ваш плейбук
webserver.yml, чтобы использовать модульansible.builtin.template. Вы также внесете две новые ошибки: переменную Jinja2 без кавычек и неправильный путь к шаблону.Откройте
webserver.ymlс помощьюnano:nano webserver.ymlЗамените все содержимое файла следующим. Директива
become: trueуказывает Ansible выполнять задачи с правами администратора (используяsudo), что необходимо для установки программного обеспечения и записи файлов в системные каталоги, такие как/var/www/html.--- - name: Configure Web Server hosts: localhost become: true vars: package_name: httpd welcome_message: "Welcome to Ansible with Jinja2" tasks: - name: Install httpd package ansible.builtin.dnf: ## ERROR 1: Unquoted Jinja2 variable name: { { package_name } } state: present - name: Create a test index page from template ansible.builtin.template: ## ERROR 2: Incorrect template source path src: index.j2 dest: /var/www/html/index.htmlСохраните и выйдите из редактора.
Выявление и исправление ошибки кавычек Jinja2
Несмотря на то, что это проблема Jinja2, она может проявляться как ошибка синтаксиса YAML. Запустите проверку синтаксиса, чтобы увидеть, как ее интерпретирует Ansible.
ansible-playbook --syntax-check webserver.ymlОжидаемый вывод (Ошибка): Вы получите ошибку синтаксиса, потому что значение YAML, начинающееся с
{{, рассматривается как специальная конструкция и должно быть заключено в кавычки, чтобы интерпретироваться как строка.ERROR! A malformed block was encountered. The error appears to be in '/home/labex/project/ansible_troubleshooting/webserver.yml': line 11, column 19, but may be elsewhere in the file depending on the exact syntax problem. The offending line appears to be: ## ERROR 1: Unquoted Jinja2 variable name: {{ package_name }} ^ hereРешение: Откройте
webserver.ymlи заключите переменную Jinja2 в двойные кавычки.nano webserver.ymlИзмените задачу
Install httpd package:## ... (остальная часть файла) tasks: - name: Install httpd package ansible.builtin.dnf: ## FIX: Quote the Jinja2 expression name: "{{ package_name }}" state: present ## ... (остальная часть файла)Сохраните и выйдите. Проверка синтаксиса теперь должна пройти успешно.
Выявление и исправление ошибки пути к шаблону
Теперь, когда синтаксис правильный, попробуйте запустить плейбук.
ansible-playbook webserver.ymlОжидаемый вывод (Ошибка): Плейбук завершится с ошибкой, но на этот раз это ошибка времени выполнения, а не синтаксическая. Сообщение об ошибке ясно указывает, что исходный файл
index.j2не найден.TASK [Create a test index page from template] ********************************** fatal: [localhost]: FAILED! => {"changed": false, "msg": "Could not find or access '/home/labex/project/ansible_troubleshooting/index.j2' on the Ansible Controller."}Это происходит потому, что параметр
srcв вашем плейбуке указывает наindex.j2, но файл, который вы создали, называетсяindex.html.j2.Решение: Откройте
webserver.ymlв последний раз и исправьте имя файла.nano webserver.ymlИзмените параметр
srcв задачеCreate a test index page from template:## ... (остальная часть файла) - name: Create a test index page from template ansible.builtin.template: ## FIX: Correct template source filename src: index.html.j2 dest: /var/www/html/index.html ## ... (остальная часть файла)Сохраните и выйдите из редактора.
Успешный запуск плейбука
Запустите плейбук снова. Теперь он должен успешно выполнить все задачи.
ansible-playbook webserver.ymlОжидаемый вывод (Успех):
PLAY [Configure Web Server] **************************************************** TASK [Gathering Facts] ********************************************************* ok: [localhost] TASK [Install httpd package] *************************************************** changed: [localhost] TASK [Create a test index page from template] ********************************** changed: [localhost] PLAY RECAP ********************************************************************* localhost : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Использование режима проверки (Check Mode) для устранения ошибок служб на управляемых узлах
На этом этапе вы научитесь использовать одну из самых мощных функций Ansible для устранения неполадок: режим проверки. Режим проверки (активируется с помощью флага --check) позволяет запускать плейбук, чтобы увидеть, какие изменения были бы внесены, фактически не изменяя ничего в системе. Это невероятно полезно для безопасного тестирования плейбуков и диагностики проблем, таких как неправильные имена служб, прежде чем они вызовут реальные проблемы.
Создание плейбука для управления службой
Теперь вы создадите новый плейбук,
service.yml, предназначенный для обеспечения работы веб-сервераhttpd. Однако вы намеренно используете неправильное имя службы, чтобы имитировать распространенную ошибку.Используйте
nanoдля создания файлаservice.ymlв вашем каталоге~/project/ansible_troubleshooting.nano service.ymlСкопируйте и вставьте следующее содержимое. Обратите внимание, что имя службы установлено на
apache2, что является распространенным именем для веб-сервера Apache в других дистрибутивах Linux, но неверно для RHEL.--- - name: Manage Web Server Service hosts: localhost become: true tasks: - name: Ensure web server service is started ansible.builtin.service: ## ERROR: Incorrect service name for RHEL name: apache2 state: started enabled: trueСохраните файл и выйдите из
nano(Ctrl+X,Y,Enter).Использование режима проверки для выявления ошибки службы
Вместо обычного запуска плейбука выполните его в режиме проверки. Это предотвратит внесение каких-либо изменений Ansible, но позволит проверить состояние системы и сообщить, что было бы сделано.
ansible-playbook --check service.ymlОжидаемый вывод (Ошибка): Плейбук завершится с ошибкой. Сообщение об ошибке ясно укажет, что служба с именем
apache2не найдена. Это немедленно сообщит вам, что параметрnameв вашем плейбуке неверен.TASK [Ensure web server service is started] ************************************ fatal: [localhost]: FAILED! => {"changed": false, "msg": "Could not find the requested service 'apache2': host"} PLAY RECAP ********************************************************************* localhost : ok=1 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0Поиск правильного имени службы
Чтобы исправить плейбук, вам нужно найти правильное имя службы для пакета
httpdв RHEL. Надежный способ сделать это — перечислить файлы, установленные пакетом, и найти файл юнита службы, который обычно находится в/usr/lib/systemd/system/.Используйте команду
rpmдля запроса пакетаhttpd:rpm -ql httpd | grep systemdОжидаемый вывод: Эта команда перечислит файлы, связанные с
systemd, включая файл службы./usr/lib/systemd/system/httpd.service /usr/lib/systemd/system/httpd@.service ...Вывод
httpd.serviceуказывает, что правильное имя службы —httpd.Исправление плейбука и повторный запуск в режиме проверки
Теперь, когда вы знаете правильное имя службы, отредактируйте файл
service.yml.nano service.ymlИзмените имя службы с
apache2наhttpd.## ... (остальная часть файла) - name: Ensure web server service is started ansible.builtin.service: ## FIX: Correct service name for RHEL name: httpd state: started enabled: trueСохраните и выйдите из редактора. Теперь снова запустите плейбук в режиме проверки.
ansible-playbook --check service.ymlОжидаемый вывод (Успех в режиме проверки): На этот раз плейбук должен сообщить статус
changed. В режиме проверкиchangedозначает «было бы внесено изменение, если бы это был реальный запуск». Это указывает на то, что логика вашего плейбука теперь правильна, и Ansible определил, что службуhttpdнеобходимо запустить.TASK [Ensure web server service is started] ************************************ changed: [localhost] PLAY RECAP ********************************************************************* localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0Примечание: В этой конкретной лабораторной среде на основе контейнеров полноценная система инициализации
systemdне запущена. Хотя режим проверки работает правильно, обычный запуск модуляansible.builtin.serviceвсе равно может столкнуться с проблемами. Главный урок здесь заключается в использовании режима проверки для проверки логики вашего плейбука в соответствии с конфигурацией системы.
Исправление конфигурации брандмауэра и проблем с недоступностью узла
На этом заключительном этапе вы устраните две критические проблемы времени выполнения: сбои, вызванные неправильными системными конфигурациями, такими как брандмауэр, и проблемы с подключением, возникающие из-за ошибок в вашем файле инвентаризации Ansible. Освоение этих аспектов поможет вам устранить наиболее распространенные препятствия в автоматизации.
Часть 1: Корректировка конфигурации брандмауэра
Распространенной задачей при настройке сервера является открытие портов в брандмауэре. Плейбук может легко завершиться с ошибкой, если он ссылается на службу брандмауэра, которая не существует в целевой системе.
Установка и подготовка
firewalldСначала убедитесь, что пакет
firewalldустановлен, поскольку он предоставляет службу управления брандмауэром в RHEL.sudo dnf install -y firewalldЗапустите службу
firewalld.sudo systemctl start firewalldВам также необходимо установить коллекцию
ansible.posix, которая содержит модульfirewalld, используемый в этом упражнении.ansible-galaxy collection install ansible.posixПримечание: Вы можете увидеть предупреждение о совместимости версий Ansible, но коллекция все равно будет работать корректно для этого упражнения.
Создание плейбука с ошибкой брандмауэра
Создайте новый плейбук с именем
firewall.yml, который пытается включить службуhttp. Однако вы намеренно используете неправильное имя службы,web, чтобы вызвать ошибку.nano firewall.ymlСкопируйте и вставьте следующее содержимое в редактор:
--- - name: Configure System Firewall hosts: localhost become: true tasks: - name: Allow web traffic through firewall ansible.posix.firewalld: ## ERROR: 'web' is not a standard firewalld service service: web permanent: true state: enabledСохраните и выйдите из
nano(Ctrl+X,Y,Enter).Запуск плейбука и диагностика сбоя
Выполните плейбук. Он завершится с ошибкой, поскольку
firewalldне распознает службу с именемweb.ansible-playbook firewall.ymlОжидаемый вывод (Ошибка): Сообщение об ошибке ясно указывает, что
webне является поддерживаемой службой, указывая вам непосредственно на проблему.TASK [Allow web traffic through firewall] ************************************** fatal: [localhost]: FAILED! => {"changed": false, "msg": "web is not a supported service. This is what I have."} PLAY RECAP ********************************************************************* localhost : ok=1 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0Поиск правильного имени службы брандмауэра
Чтобы найти список допустимых, предопределенных имен служб, вы можете использовать утилиту командной строки
firewall-cmd.firewall-cmd --get-servicesОжидаемый вывод: Вы увидите длинный список доступных служб. Просмотрите список, чтобы найти правильное для веб-трафика, которым является
http.RH-Satellite-6 ... ftp http https imaps ipp ipp-client ...Исправление плейбука и успешный запуск
Отредактируйте
firewall.ymlи замените неправильное имя службыwebна правильное —http.nano firewall.ymlИсправленная задача должна выглядеть следующим образом:
## ... (остальная часть файла) - name: Allow web traffic through firewall ansible.posix.firewalld: ## FIX: Use the correct firewalld service name service: http permanent: true state: enabledСохраните и выйдите. Теперь запустите плейбук снова. Он должен завершиться успешно.
ansible-playbook firewall.yml
Часть 2: Устранение проблем недоступности узла
Ошибка «недоступен» означает, что Ansible не может подключиться к узлу, указанному в вашем инвентаре. Это часто вызвано простой опечаткой в имени узла.
Имитация недоступного узла
Намеренно введите опечатку в ваш файл
inventoryи удалите настройку локального подключения. Это заставит Ansible попытаться установить фактическое сетевое соединение с неправильно написанным именем узла.nano inventoryИзмените
localhostнаlocalhossstи удалитеansible_connection=local.## ERROR: Intentional typo in hostname, no local connection localhossstСохраните и выйдите из редактора.
Изменение плейбука для использования узлов инвентаризации
Сначала вам нужно изменить плейбук
webserver.yml, чтобы использовать узлы инвентаризации вместо жестко заданногоlocalhost. Когда плейбук используетhosts: localhost, Ansible обрабатывает это как особый случай и полностью игнорирует файл инвентаризации.nano webserver.ymlИзмените строку
hostsсlocalhostнаall:--- - name: Configure Web Server hosts: all ## Changed from 'localhost' to use inventory hosts become: true ## ... rest of the playbook remains the sameСохраните и выйдите из редактора.
Запуск плейбука для вызова ошибки
Теперь попробуйте запустить измененный плейбук. Он завершится с ошибкой, потому что инвентарь содержит опечатку
localhossst.ansible-playbook webserver.ymlОжидаемый вывод (Ошибка): Ansible завершится с ошибкой и сообщит, что узел
UNREACHABLE. Сообщение об ошибке указывает, что имя узла не удалось разрешить.PLAY [Configure Web Server] **************************************************** TASK [Gathering Facts] ********************************************************** fatal: [localhossst]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: Could not resolve hostname localhossst: Name or service not known", "unreachable": true} PLAY RECAP ********************************************************************* localhossst : ok=0 changed=0 unreachable=1 failed=0 skipped=0 rescued=0 ignored=0Исправление файла инвентаризации
Статус
UNREACHABLE— это сигнал для проверки имен узлов и сетевого подключения. В данном случае исправление заключается в исправлении опечатки в файлеinventory.nano inventoryИзмените
localhossstобратно наlocalhost.## FIX: Corrected hostname localhost ansible_connection=localСохраните и выйдите. Повторный запуск
ansible-playbook webserver.ymlтеперь будет успешным.Необязательно: восстановление исходного плейбука
Если вы хотите восстановить плейбук для использования
hosts: localhostдля будущих упражнений, вы можете изменить его обратно:nano webserver.ymlИзмените строку
hostsобратно наlocalhost:--- - name: Configure Web Server hosts: localhost ## Restored to original become: true ## ... rest of the playbookСохраните и выйдите. Этот шаг демонстрирует разницу между использованием жестко заданного
localhost(который обходит инвентарь) и использованием узлов, определенных в инвентаре.
Резюме
В этой лаборатории вы подготовили среду Red Hat Enterprise Linux для Ansible, установив ansible-core и настроив журналирование, а затем приступили к устранению различных распространенных проблем. Вы научились диагностировать и устранять ошибки в плейбуках, такие как исправление неправильного синтаксиса YAML, отступов, кавычек Jinja2 и недопустимых путей к шаблонам. Эти навыки являются основополагающими для написания корректного и надежного кода автоматизации.
Кроме того, вы решали проблемы, связанные с управляемой средой узла. Вы использовали режим проверки Ansible для безопасного выполнения пробного запуска и выявления потенциальных сбоев служб на целевом узле без внесения фактических изменений. Лаборатория завершилась решением проблем с подключением, где вы исправили конфигурации брандмауэра для устранения недоступности узла, предоставив комплексный подход к отладке от управляющего узла до управляемого узла.


