Модуль Ansible Shell

AnsibleAnsibleBeginner

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом лабораторном занятии (lab) вы научитесь использовать модуль Ansible Shell для выполнения команд оболочки (shell commands) на удаленных хостах. Модуль Shell полезен, когда вам нужно выполнить команды оболочки, которые не охватываются существующими модулями Ansible, или когда вам требуется больше гибкости и контроля над выполнением.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL ansible(("Ansible")) -.-> ansible/ModuleOperationsGroup(["Module Operations"]) ansible(("Ansible")) -.-> ansible/PlaybookEssentialsGroup(["Playbook Essentials"]) ansible/ModuleOperationsGroup -.-> ansible/command("Execute Commands") ansible/ModuleOperationsGroup -.-> ansible/debug("Test Output") ansible/ModuleOperationsGroup -.-> ansible/shell("Execute Shell Commands") ansible/PlaybookEssentialsGroup -.-> ansible/playbook("Execute Playbook") subgraph Lab Skills ansible/command -.-> lab-289409{{"Модуль Ansible Shell"}} ansible/debug -.-> lab-289409{{"Модуль Ansible Shell"}} ansible/shell -.-> lab-289409{{"Модуль Ansible Shell"}} ansible/playbook -.-> lab-289409{{"Модуль Ansible Shell"}} end

Выполнение простой команды оболочки (shell command)

На этом шаге вы выполните простую команду оболочки на удаленном хосте с использованием модуля 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 на целевом хосте.

Передача переменных в команды оболочки (shell commands)

На этом шаге вы научитесь передавать переменные из вашего 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 commands)

На этом шаге вы будете выполнять более сложные команды оболочки с использованием модуля 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-скриптов!