shell#

Модуль ansible.builtin.shell позволяет выполнить на удаленном узле команду через оболочку (/bin/sh).

Особенности работы#

Особенности использования модуля ansible.builtin.shell:

  • Выполняемая команда может быть задана в свободной форме (free form), например:

    ---
    - name: Write log
      ansible.builtin.shell: /opt/check.sh >> /var/log/checking.log
    

    В этом случае параметры модуля следует указывать в блоке args, как показано в примерах использования.

  • Модуль ansible.builtin.shell почти идентичен модулю ansible.builtin.command, но запускает команду через оболочку.

  • Если можно обойтись без использования модуля ansible.builtin.shell, используйте модуль ansible.builtin.command, так как он безопаснее и более предсказуем.

  • Значения переменных экранируйте с помощью фильтра quote, чтобы предотвратить интерпретацию специальных символов оболочки (например, точки с запятой), тем самым не допустим выполнения нежелательных или вредоносных команд.

  • Если команда возвращает данные, отличные от UTF-8, их необходимо закодировать, чтобы избежать проблем с обработкой. Один из вариантов – закодировать вывод в формат base64.

  • Для перезагрузки систем используйте модули ansible.builtin.reboot или ansible.windows.win_reboot.

  • Для выполнения команд на узлах под управлением ОС Windows используйте модуль ansible.windows.win_shell.

Параметры#

Модуль принимает следующие параметры:

chdir#

Путь к каталогу, в который необходимо перейти перед выполнением команды.

cmd#

Команда для выполнения. Допускается использование опциональных аргументов, например:

ls -l | grep log
creates#

Путь к файлу. Если указанный файл существует, команда не будет выполнена.

executable#

Абсолютный путь к исполняемому файлу оболочки, используемой для выполнения команды.

removes#

Путь к файлу. Если указанный файл не существует, команда не будет выполнена.

stdin#

Строка для передачи значения в стандартный ввод (stdin).

stdin_add_newline#

Добавление новой строки к данным, поступающим из стандартного ввода (stdin).

Возможные значения:

  • false – не добавлять новую строку;

  • true – добавлять новую строку.

Значение по умолчанию: true.

Возвращаемые значения#

В этом списке указаны только возвращаемые значения, специфичные для модуля ansible.builtin.shell.

  • cmd – команда, выполняемая в рамках отдельной задачи.

    Условия: всегда.

  • delta – длительность выполнения команды.

    Условия: всегда.

  • end – время окончания выполнения команды.

    Условия: всегда.

  • msg – наличие изменений.

    Условия: всегда.

  • rc – код возврата команды. 0 означает успех.

    Условия: всегда.

  • start – время начала выполнения команды.

    Условия: всегда.

  • stderr – содержимое стандартного потока ошибок команды.

    Условия: всегда.

  • stderr_lines – содержимое стандартного потока ошибок команды, разделенное на строки.

    Условия: всегда.

  • stdout – содержимое стандартного вывода команды.

    Условия: всегда.

  • stdout_lines – содержимое стандартного вывода команды, разделенное на строки.

    Условия: всегда.

Атрибуты#

Атрибуты определяют функции Ansible, которые может использовать модуль.

Атрибут

Описание

check_mode

Модуль частично поддерживает режим проверки. Для проверки наличия изменений используются параметры creates и removes.

diff_mode

Модуль не поддерживает режим сравнения.

platform

Модуль поддерживает только POSIX-совместимые ОС.

raw

Модуль поддерживает передачу команды в свободном формате (без указания параметров модуля).

Примеры#

Для изучения возможностей модуля ознакомьтесь с приведенными ниже примерами.

Вывод результатов в файл на удаленном узле#

Следующий пример демонстрирует выполнение команды, передаваемой в свободной форме (free form), с выводом результатов в файл на удаленном узле:

---
# ...
  tasks:
    - name: Execute the command in remote shell; stdout goes to the specified file on the remote
      ansible.builtin.shell: somescript.sh >> /var/log/somelog.txt

Выполнение команды со сменой каталога#

Следующий пример демонстрирует выполнение команды в каталоге /opt/scripts:

---
# ...
  tasks:
    - name: Change the working directory to /opt/scripts before executing the command
      ansible.builtin.shell: ./somescript.sh >> somelog.txt
      args:
        chdir: /opt/scripts

Запуск команды при отсутствии файла#

Следующий пример демонстрирует пропуск задачи в случае существования указанного файла:

---
# ...
  tasks:
    - name: This command will change the working directory to /opt/scripts and will only run when /opt/scripts/somelog.txt doesn't exist
      ansible.builtin.shell: ./somescript.sh >> somelog.txt
      args:
        chdir: /opt/scripts
        creates: somelog.txt

Выполнение команды через cmd#

Следующий пример демонстрирует выполнение команды с передачей строки через параметр cmd:

---
# ...
  tasks:
    - name: Viewing log files in a directory
      ansible.builtin.shell:
        cmd: ls -lh | grep log
        chdir: /var/log

Использование переменной#

Следующий пример демонстрирует вывод содержимого файла, путь к которому хранится в переменной myfile:

---
# ...
  tasks:
    - name: Secure output of file contents
      ansible.builtin.shell: cat {{ myfile | quote }}

Использование с утилитой expect#

Следующий пример демонстрирует использование утилиты expect для автоматизации подключения к удаленному интерфейсу управления сервером (CIMC) и ожидания загрузки по сети PXE:

---
# ...
  tasks:
    - name: Run expect to wait for a successful PXE boot via out-of-band CIMC
      ansible.builtin.shell: |
        set timeout 300
        spawn "ssh admin@{{ cimc_host }}"

        expect "password:"
        send "{{ cimc_password }}\n"

        expect "\n{{ cimc_name }}"
        send "connect host\n"

        expect "pxeboot.n12"
        send "\n"

        exit 0
      args:
        executable: /usr/bin/expect
      delegate_to: localhost