Модуль Ansible Script

AnsibleAnsibleBeginner

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

Введение

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL ansible(("Ansible")) -.-> ansible/ModuleOperationsGroup(["Module Operations"]) ansible/ModuleOperationsGroup -.-> ansible/debug("Test Output") ansible/ModuleOperationsGroup -.-> ansible/script("Run Scripts") ansible/ModuleOperationsGroup -.-> ansible/shell("Execute Shell Commands") subgraph Lab Skills ansible/debug -.-> lab-289411{{"Модуль Ansible Script"}} ansible/script -.-> lab-289411{{"Модуль Ansible Script"}} ansible/shell -.-> lab-289411{{"Модуль Ansible Script"}} end

Выполнить простой сценарий

В этом шаге вы выполните простой сценарий на удаленном узле с использованием модуля Ansible Script.

Сначала создайте новый файл playbook Ansible с именем /home/labex/project/script-module-playbook.yaml и откройте его в текстовом редакторе.
Добавьте следующее содержимое в файл playbook:

- hosts: localhost
  tasks:
    - name: Выполнить простой сценарий
      script: /home/labex/project/simple_script.sh
      register: script_output

    - name: Показать вывод сценария
      debug:
        var: script_output.stdout_lines
  • hosts: Это задает целевой узел, на котором будет выполняться playbook. В данном случае playbook будет выполняться на локальном узле, так как целевой узел - "localhost".
  • tasks: Это список задач для выполнения.
  • name: Это описательное имя для задачи, которое идентифицирует цель задачи.
  • script: Это фактическая команда, которую выполняет задача. Она instructs Ansible to run the script named "simple_script.sh" located in the "/home/labex/project/" directory on the target host.
  • register: Это регистрирует вывод сценария в переменной script_output для последующего использования в playbook.
  • debug: Это модуль Ansible, используемый для вывода отладочной информации.
  • var: Это параметр для модуля debug, который отображает стандартный вывод сценария из предыдущей задачи. script_output.stdout_lines содержит каждую строку вывода сценария.

Кратко говоря, основная цель этого playbook - запустить сценарий на локальном узле и показать стандартный вывод сценария после его выполнения. Зарегистрированная переменная script_output содержит вывод сценария, который затем выводится с использованием модуля Debug.

Затем создайте простой файл сценария с именем /home/labex/project/simple_script.sh с таким содержимым:

#!/bin/bash
echo "This is a simple script."

Убедитесь, что файл сценария является исполняемым (chmod +x simple_script.sh) и поместите файл сценария в директорию /home/labex/project/, указанную в playbook.

Наконец, запустите playbook с помощью следующей команды:

chmod +x simple_script.sh
ansible-playbook script-module-playbook.yaml

Обратите внимание на вывод сценария, отображаемый в выводе выполнения playbook.
Пример вывода:

...
PLAY [localhost] ***************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Execute a simple script] *************************************************
changed: [localhost]

TASK [Display script output] ***************************************************
ok: [localhost] => {
    "script_output.stdout_lines": [
        "This is a simple script."
    ]
}

PLAY RECAP *********************************************************************
localhost                  : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Здесь "This is a simple script." - это вывод сценария simple_script.sh.

Передача переменных в сценарии

В этом шаге вы научитесь передавать переменные из playbook Ansible в сценарии, выполняемые с использованием модуля Script.

Сначала измените существующий файл playbook, удалив все содержимое и добавив следующее содержимое в файл playbook:

- hosts: localhost
  tasks:
    - name: Выполнить сценарий с переменной
      script: /home/labex/project/var_script.sh "{{ message }}"
      register: variable_script_output

    - name: Показать вывод сценария с переменной
      debug:
        var: variable_script_output.stdout_lines
  • script: Это фактическая команда, которую задача будет выполнять. А {{ message }} - это переменная, которая передается в сценарий. Двойные фигурные скобки указывают, что это переменная Ansible, и ее значение будет динамически заменено во время выполнения.
  • register: Это регистрирует вывод сценария в переменную "variable_script_output" для последующего использования в playbook.
  • debug: Это модуль Ansible, используемый для вывода отладочной информации.
  • var: Этот параметр для модуля debug отображает стандартный вывод сценария из предыдущей задачи. variable_script_output.stdout_lines содержит каждую строку вывода сценария.

Кратко говоря, этот playbook выполняет сценарий на локальном узле, передавая переменную с именем "message" в сценарий. Вывод сценария регистрируется в переменной variable_script_output, а затем выводится с использованием модуля debug.

Затем создайте простой файл сценария с именем /home/labex/project/var_script.sh с таким содержимым:

#!/bin/bash
echo $1

Убедитесь, что файл сценария является исполняемым (chmod +x var_script.sh) и поместите файл сценария в директорию /home/labex/project/, указанную в playbook.

Наконец, при запуске playbook передайте переменную message в качестве дополнительной переменной с использованием опции -e.

chmod +x var_script.sh
ansible-playbook script-module-playbook.yaml -e "message=Hello,Ansible"

Обратите внимание на вывод сценария с указанным сообщением.
Пример вывода:

...
PLAY [localhost] ***************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Execute script with a variable] ******************************************
changed: [localhost]

TASK [Display variable script output] ******************************************
ok: [localhost] => {
    "variable_script_output.stdout_lines": [
        "Hello,Ansible"
    ]
}

PLAY RECAP *********************************************************************
localhost                  : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Здесь "Hello,Ansible" - это вывод сценария simple_script.sh.

Обработка ошибок сценария

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

Сначала измените существующий файл playbook, удалив все содержимое и добавив следующее содержимое в файл playbook:

- hosts: localhost
  tasks:
    - name: Выполнить неработающий сценарий
      script: /home/labex/project/failing_script.sh
      register: failing_script_output
      ignore_errors: yes

    - name: Обработать ошибку сценария
      debug:
        msg: "Сценарий не выполнен. Выполняется резервное действие."
      when: failing_script_output.failed
  • script: Это фактическая команда, которую задача будет выполнять.
  • register: Это регистрирует вывод сценария в переменную "failing_script_output" для последующего использования в playbook.
  • ignore_errors: Этот параметр установлен в yes, чтобы позволить Ansible продолжать выполнение последующих задач, даже если эта задача сценария завершилась с ошибкой. Ошибка будет записана в переменную failing_script_output.
  • debug: Это модуль Ansible, используемый для вывода отладочной информации.
  • msg: Этот параметр для модуля debug выводит сообщение, указывающее на то, что сценарий не выполнен. Эта задача будет выполняться только тогда, когда предыдущая задача (failing_script_output) завершилась с ошибкой.
  • when: Это условие гарантирует, что эта задача будет выполняться только тогда, когда сценарий в первой задаче завершится с ошибкой. Если сценарий выполнится успешно, эта задача будет пропущена.

Кратко говоря, этот playbook пытается выполнить сценарий, который может завершиться с ошибкой. Если сценарий завершается с ошибкой, playbook обрабатывает ошибку, выводя отладочное сообщение и выполняя резервное действие. Параметр ignore_errors: yes позволяет playbook продолжать работу, даже если сценарий завершается с ошибкой, а условие when: failing_script_output.failed гарантирует, что задача обработки будет выполнена только при необходимости.

Затем создайте файл неработающего сценария с именем /home/labex/project/failing_script.sh с таким содержимым:

#!/bin/bash
exit 1

Убедитесь, что файл сценария является исполняемым (chmod +x failing_script.sh) и поместите файл сценария в директорию /home/labex/project/, указанную в playbook.

Наконец, запустите playbook и обратите внимание, что неработающий сценарий выполняется, но игнорируется из-за ignore_errors: yes.

chmod +x failing_script.sh
ansible-playbook script-module-playbook.yaml

Playbook выведет отладочное сообщение, указывающее на ошибку и выполняющее резервное действие.
Пример вывода:

...
PLAY [localhost] ***************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Execute a failing script] ************************************************
fatal: [localhost]: FAILED! => {"changed": true, "msg": "non-zero return code", "rc": 1, "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
...ignoring

TASK [Handle script failure] ***************************************************
ok: [localhost] => {
    "msg": "Сценарий не выполнен. Выполняется резервное действие."
}

PLAY RECAP *********************************************************************
localhost                  : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=1

"msg": "Сценарий не выполнен. Выполняется резервное действие." указывает, что сценарий failing_script.sh не выполнен.

Резюме

Поздравляем! Вы успешно завершили лабораторную работу по модулю Ansible Script. Вы узнали, как использовать модуль Script для выполнения пользовательских сценариев на удаленных узлах, передавать переменные в сценарии и обрабатывать ошибки сценариев.

Модуль Script обеспечивает большую гибкость и возможности настройки в задачах автоматизации, позволяя вам использовать мощь пользовательских сценариев. Однако убедитесь, что написанные вами сценарии безопасны и надежны, и проверяйте любые входные данные, чтобы предотвратить уязвимости безопасности.

Теперь, когда вы хорошо понимаете модуль Script, вы можете включить его в свои playbook Ansible, чтобы автоматизировать различные задачи и достичь более сложных сценариев автоматизации. Удачи при написании сценариев с использованием Ansible!