Введение
В этом лабораторном занятии (lab) вы научитесь использовать модуль Ansible Shell для выполнения команд оболочки (shell commands) на удаленных хостах. Модуль Shell полезен, когда вам нужно выполнить команды оболочки, которые не охватываются существующими модулями Ansible, или когда вам требуется больше гибкости и контроля над выполнением.
Выполнение простой команды оболочки
На этом шаге вы выполните простую команду оболочки на удаленном хосте с использованием модуля Ansible Shell.
Сначала заполните файл /home/labex/project/simple_shell_command.yml.
Добавьте следующее содержимое в файл плейбука (playbook):
- name: Execute a Simple Shell Command
hosts: localhost
gather_facts: false
tasks:
- name: Execute ls -l command
shell: ls -l
register: command_output
- name: Display command output
debug:
var: command_output.stdout_lines
hosts: localhost: Целевой хост для выполнения этого Ansible-плейбука -localhost.gather_facts: false: Отключает сбор информации о хосте.shell: ls -l: Указывает команду для выполнения.
В общем, цель этого плейбука - выполнить команду ls -l на локальном хосте и отобразить вывод этой команды.
Затем отобразите вывод команды в Ansible-плейбуке.
ansible-playbook /home/labex/project/simple_shell_command.yml
Пример вывода:
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'
PLAY [Execute a Simple Shell Command] ******************************************
TASK [Execute ls -l command] ***************************************************
changed: [localhost]
TASK [Display command output] **************************************************
ok: [localhost] => {
"command_output.stdout_lines": [
"total 16",
"-rwxrwxrwx 1 labex root 285 Mar 8 13:33 complex_shell_commands.yml",
"-rwxrwxrwx 1 labex root 221 Mar 8 13:33 handle_command_failure.yml",
"-rwxrwxrwx 1 labex root 222 Mar 8 13:33 pass_variables.yml",
"-rwxrwxrwx 1 labex root 266 Mar 8 13:36 simple_shell_command.yml"
]
}
PLAY RECAP *********************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Здесь "command_output.stdout_lines":[...] - это вывод команды ls -l на целевом хосте.
Передача переменных в команды оболочки
На этом шаге вы научитесь передавать переменные из вашего Ansible-плейбука в команды оболочки, выполняемые с использованием модуля Shell.
Сначала заполните файл /home/labex/project/pass_variables.yml.
Добавьте следующее содержимое в файл плейбука:
- name: Pass Variables to Shell Commands
hosts: localhost
gather_facts: false
vars:
directory_path: /home/labex
tasks:
- name: Execute ls command with a variable
shell: ls "{{ directory_path }}"
register: variable_command_output
- name: Display variable command output
debug:
var: variable_command_output.stdout_lines
hosts: localhost: Целевой хост для выполнения этого Ansible-плейбука -localhost.vars: Определяет переменную с именемdirectory_pathсо значением/home/labex.shell: ls "{{ directory_path }}": Выполняет командуlsдля вывода содержимого директории, указанной в переменнойdirectory_path.
В общем, этот плейбук выполняет команду ls с переменной, представляющей путь к директории (/home/labex), на локальном хосте и отображает вывод этой команды.
Затем отобразите вывод команды в Ansible-плейбуке.
ansible-playbook /home/labex/project/pass_variables.yml
Пример вывода:
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'
PLAY [Pass Variables to Shell Commands] ****************************************
TASK [Execute ls command with a variable] **************************************
changed: [localhost]
TASK [Display variable command output] *****************************************
ok: [localhost] => {
"variable_command_output.stdout_lines": [
"Code",
"Desktop",
"golang",
"project"
]
}
PLAY RECAP *********************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Здесь "variable_command_output.stdout_lines": [...] - это вывод команды ls /home/labex на целевом хосте.
Обработка ошибок выполнения команды
На этом шаге вы научитесь обрабатывать ошибки при выполнении команд оболочки с использованием модуля Shell. Вы научитесь обрабатывать случаи, когда команда оболочки возвращает ненулевой статус выхода, что указывает на ошибку.
Сначала заполните файл /home/labex/project/handle_command_failure.yml.
Добавьте следующее содержимое в файл плейбука:
- name: Handle Command Failure
hosts: localhost
gather_facts: false
tasks:
- name: Execute a failing command
shell: failing-command
register: failing_command_output
ignore_errors: yes
- name: Handle command failure
debug:
msg: "The command failed. Performing fallback action."
when: failing_command_output.failed
hosts: localhost: Целевой хост для выполнения этого Ansible-плейбука -localhost.shell: failing-command: Эта строка использует модуль shell для выполнения командыfailing-command. Вывод этой команды будет захвачен и сохранен в переменнойfailing_command_output. Поскольку скриптfailing-commandне существует, эта команда обязательно завершится с ошибкой.ignore_errors: yes: Эта строка информирует Ansible игнорировать любые ошибки, возникающие при выполнении командыfailing-command. Это позволяет плейбуку продолжить выполнение, даже если команда завершилась с ошибкой.debug: Этот модуль использует модульdebugдля вывода сообщения "The command failed. Performing fallback action." Это сообщение выводится только в том случае, если условиеfailing_command_output.failedвыполняется, что означает, что предыдущая команда завершилась с ошибкой.
В общем, плейбук пытается выполнить команду, которая должна завершиться с ошибкой, игнорирует любые ошибки, возникающие при ее выполнении, и затем выводит сообщение, указывающее, что команда завершилась с ошибкой, и будет предпринято резервное действие на основе статуса ошибки команды.
Затем отобразите вывод команды в Ansible-плейбуке.
ansible-playbook /home/labex/project/handle_command_failure.yml
Пример вывода:
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'
PLAY [Handle Command Failure] **************************************************
TASK [Execute a failing command] ***********************************************
fatal: [localhost]: FAILED! => {"changed": true, "cmd": "failing-command", "delta": "0:00:00.009169", "end": "2024-03-08 13:46:22.701946", "msg": "non-zero return code", "rc": 127, "start": "2024-03-08 13:46:22.692777", "stderr": "/bin/sh: line 1: failing-command: command not found", "stderr_lines": ["/bin/sh: line 1: failing-command: command not found"], "stdout": "", "stdout_lines": []}
...ignoring
TASK [Handle command failure] **************************************************
ok: [localhost] => {
"msg": "The command failed. Performing fallback action."
}
PLAY RECAP *********************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=1
Присутствие "msg": "The command failed. Performing fallback action." указывает, что выполнение команды failing-command завершилось с ошибкой.
Выполнение сложных команд оболочки
На этом шаге вы будете выполнять более сложные команды оболочки с использованием модуля Shell. Вы узнаете, как использовать перенаправление команд, конвейеры (pipelines) и сложные структуры команд.
Сначала заполните файл /home/labex/project/complex_shell_commands.yml.
Добавьте следующее содержимое в файл плейбука:
- name: Execute Complex Shell Commands
hosts: localhost
gather_facts: false
tasks:
- name: Execute complex command
shell: ls -l /home/labex | grep 'project' > /home/labex/output.txt
register: complex_command_output
- name: Display complex command output
debug:
var: complex_command_output.stdout_lines
hosts: localhost: Целевой хост для выполнения этого Ansible-плейбука -localhost.shell: Перенаправляет вывод командыls -l /home/labexв файл/home/labex/output.txtи используетgrepдля фильтрации содержимого, связанного сproject.
В общем, этот плейбук выполняет сложную команду оболочки на локальном хосте, фильтрует и перенаправляет вывод в файл, а затем отображает вывод выполнения команды.
Затем выполните команду для запуска Ansible-плейбука.
ansible-playbook /home/labex/project/complex_shell_commands.yml
Пример вывода:
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'
PLAY [Execute Complex Shell Commands] ******************************************
TASK [Execute complex command] *************************************************
changed: [localhost]
TASK [Display complex command output] ******************************************
ok: [localhost] => {
"complex_command_output.stdout_lines": []
}
PLAY RECAP *********************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
В конце посмотрите на содержимое файла /home/labex/output.txt:
cat /home/labex/output.txt
Пример вывода:
drwxr-xr-x 1 labex labex 4096 Mar 8 13:49 project
Резюме
Поздравляем! Вы успешно завершили лабораторную работу по модулю Ansible Shell. Вы научились использовать модуль Shell для выполнения команд оболочки на удаленных хостах, передавать переменные в команды, обрабатывать ошибки при выполнении команд и выполнять сложные команды оболочки.
Модуль Shell предоставляет большую гибкость и контроль при выполнении команд оболочки в ваших Ansible-плейбуках. Однако будьте осторожны при его использовании, так как выполнение произвольных команд оболочки может иметь последствия для безопасности. Всегда убедитесь, что вы доверяете командам и очищаете любые входные данные, предоставленные пользователем.
Теперь, когда вы хорошо понимаете, как работает модуль Shell, вы можете использовать его для выполнения различных автоматических задач и эффективного управления своими удаленными хостами. Удачи в написании Ansible-скриптов!


