Как исправить ошибку 'Permission denied' в модуле script Ansible

AnsibleAnsibleBeginner
Практиковаться сейчас

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

Введение

Ansible – это мощный инструмент автоматизации, упрощающий управление инфраструктурой и конфигурацией. Модуль script Ansible позволяет выполнять пользовательские скрипты в ваших плейбуках, расширяя функциональность Ansible за пределы его встроенных модулей. Однако пользователи часто сталкиваются с ошибкой "Permission denied" (Отказано в доступе) при использовании этого модуля, что может препятствовать автоматизации рабочих процессов.

Эта лабораторная работа проведет вас через понимание и решение проблем, связанных с разрешениями, в модуле script Ansible. Вы узнаете, как выявлять причины ошибок, связанных с разрешениями, и реализовывать различные решения для обеспечения успешного выполнения ваших скриптов Ansible.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL ansible(("Ansible")) -.-> ansible/ModuleOperationsGroup(["Module Operations"]) ansible(("Ansible")) -.-> ansible/PlaybookEssentialsGroup(["Playbook Essentials"]) ansible/ModuleOperationsGroup -.-> ansible/apt("Package Manager") ansible/ModuleOperationsGroup -.-> ansible/command("Execute Commands") ansible/ModuleOperationsGroup -.-> ansible/debug("Test Output") ansible/ModuleOperationsGroup -.-> ansible/file("Manage Files/Directories") ansible/ModuleOperationsGroup -.-> ansible/script("Run Scripts") ansible/ModuleOperationsGroup -.-> ansible/shell("Execute Shell Commands") ansible/ModuleOperationsGroup -.-> ansible/stat("File Statistics") ansible/PlaybookEssentialsGroup -.-> ansible/playbook("Execute Playbook") subgraph Lab Skills ansible/apt -.-> lab-415726{{"Как исправить ошибку 'Permission denied' в модуле script Ansible"}} ansible/command -.-> lab-415726{{"Как исправить ошибку 'Permission denied' в модуле script Ansible"}} ansible/debug -.-> lab-415726{{"Как исправить ошибку 'Permission denied' в модуле script Ansible"}} ansible/file -.-> lab-415726{{"Как исправить ошибку 'Permission denied' в модуле script Ansible"}} ansible/script -.-> lab-415726{{"Как исправить ошибку 'Permission denied' в модуле script Ansible"}} ansible/shell -.-> lab-415726{{"Как исправить ошибку 'Permission denied' в модуле script Ansible"}} ansible/stat -.-> lab-415726{{"Как исправить ошибку 'Permission denied' в модуле script Ansible"}} ansible/playbook -.-> lab-415726{{"Как исправить ошибку 'Permission denied' в модуле script Ansible"}} end

Установка Ansible и настройка окружения

Прежде чем мы сможем изучить проблемы с разрешениями в скриптах Ansible, нам необходимо настроить наше окружение. Давайте установим Ansible и создадим базовую структуру для нашей тестовой среды.

Установка Ansible

Сначала обновим индекс пакетов и установим Ansible:

sudo apt update
sudo apt install -y ansible

После завершения установки убедитесь, что Ansible установлен правильно:

ansible --version

Вы должны увидеть вывод, аналогичный этому, показывающий версию Ansible и детали конфигурации:

ansible [core 2.12.x]
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/home/labex/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3/dist-packages/ansible
  ansible collection location = /home/labex/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/bin/ansible
  python version = 3.10.x (default, Mar 01 2023, 12:34:56) [GCC 11.2.0]
  jinja version = 3.0.3
  libyaml = True

Настройка структуры проекта

Теперь давайте создадим структуру каталогов проекта для нашего плейбука и скриптов Ansible:

mkdir -p ~/project/ansible-lab/{playbooks,scripts}
cd ~/project/ansible-lab

В этой структуре:

  • playbooks/ будет содержать наши плейбуки Ansible
  • scripts/ будет содержать наши shell-скрипты для выполнения Ansible

Создание простого скрипта

Давайте создадим простой shell-скрипт, который мы будем использовать с Ansible. Создайте файл с именем hello.sh в каталоге scripts:

cd ~/project/ansible-lab/scripts
touch hello.sh

Откройте файл hello.sh в редакторе и добавьте следующее содержимое:

#!/bin/bash
echo "Hello from $(hostname)!"
echo "Current time: $(date)"
echo "Current user: $(whoami)"

Этот скрипт выведет имя хоста, текущее время и пользователя, выполнившего скрипт.

Создание файла инвентаризации

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

cd ~/project/ansible-lab
touch inventory.ini

Откройте файл inventory.ini и добавьте следующее:

[local]
localhost ansible_connection=local

Этот файл инвентаризации сообщает Ansible выполнять команды на локальной машине.

Создание базового плейбука

Теперь давайте создадим базовый плейбук Ansible, который использует модуль script:

cd ~/project/ansible-lab/playbooks
touch run_script.yml

Откройте файл run_script.yml и добавьте следующее содержимое:

---
- name: Run a script
  hosts: local
  tasks:
    - name: Execute the hello script
      script: ../scripts/hello.sh

Этот плейбук попытается выполнить наш скрипт hello.sh на локальной машине.

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

Столкновение с ошибкой "Permission Denied" (Отказано в доступе)

Теперь, когда мы настроили наше окружение, давайте попробуем запустить наш плейбук Ansible и понять, что происходит, когда мы сталкиваемся с ошибкой "Permission denied" (Отказано в доступе).

Запуск плейбука

Давайте попробуем запустить наш плейбук:

cd ~/project/ansible-lab
ansible-playbook -i inventory.ini playbooks/run_script.yml

Вы, вероятно, столкнетесь с сообщением об ошибке, подобным этому:

TASK [Execute the hello script] *******************************
fatal: [localhost]: FAILED! => {"changed": false, "msg": "failed to execute the script: /bin/sh: 1: /home/labex/.ansible/tmp/ansible-tmp-1234567890.12-123456789012345/AnsiballZ_script.py: Permission denied"}

Это распространенная ошибка "Permission denied" (Отказано в доступе) при использовании модуля script Ansible. Ошибка возникает, потому что у нашего скрипта нет разрешения на выполнение, которое необходимо для его запуска.

Понимание разрешений файлов в Linux

В Linux каждый файл имеет разрешения, которые определяют, кто может его читать, записывать или выполнять. Существует три типа разрешений:

  1. Read (r) (Чтение): Разрешает чтение содержимого файла
  2. Write (w) (Запись): Разрешает изменение файла
  3. Execute (x) (Выполнение): Разрешает выполнение файла как программы

Эти разрешения назначаются трем различным категориям пользователей:

  1. User (owner) (Пользователь (владелец)): Владелец файла
  2. Group (Группа): Пользователи, которые являются членами группы файла
  3. Others (Другие): Все остальные пользователи

Вы можете просмотреть разрешения файла с помощью команды ls -l:

ls -l ~/project/ansible-lab/scripts/hello.sh

Вы можете увидеть вывод, подобный этому:

-rw-rw-r-- 1 labex labex 95 Jun 10 12:34 /home/labex/project/ansible-lab/scripts/hello.sh

В этом выводе первый набор символов (-rw-rw-r--) представляет разрешения файла:

  • Первый символ (-) указывает, что это обычный файл
  • Следующие три символа (rw-) - это разрешения владельца (чтение, запись, нет выполнения)
  • Следующие три (rw-) - это разрешения группы
  • Последние три (r--) - это разрешения для остальных

Обратите внимание, что разрешение на выполнение (x) отсутствует для всех категорий пользователей, поэтому мы получаем ошибку "Permission denied" (Отказано в доступе).

Проверка текущих разрешений

Давайте рассмотрим текущие разрешения нашего скрипта:

ls -l ~/project/ansible-lab/scripts/hello.sh

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

На следующем шаге мы узнаем, как исправить эту проблему с разрешениями и успешно запустить наш плейбук Ansible.

Исправление проблем с разрешениями с помощью chmod

Наиболее распространенный способ исправить ошибку "Permission denied" (Отказано в доступе) - это добавить разрешение на выполнение к файлу скрипта. Мы можем сделать это с помощью команды chmod.

Понимание команды chmod

Команда chmod используется для изменения разрешений файлов или каталогов в Linux. Команда имеет несколько способов указания разрешений:

  1. Symbolic mode (Символьный режим): Использует буквы (r, w, x) для представления разрешений
  2. Numeric mode (Числовой режим): Использует числа (4, 2, 1) для представления разрешений

Для наших целей мы будем использовать символьный режим, чтобы добавить разрешение на выполнение.

Добавление разрешения на выполнение к скрипту

Давайте добавим разрешение на выполнение к нашему скрипту:

chmod +x ~/project/ansible-lab/scripts/hello.sh

Опция +x добавляет разрешение на выполнение для всех категорий пользователей (пользователь, группа и другие).

Давайте убедимся, что разрешения были обновлены:

ls -l ~/project/ansible-lab/scripts/hello.sh

Теперь вы должны увидеть вывод, подобный этому:

-rwxrwxr-x 1 labex labex 95 Jun 10 12:34 /home/labex/project/ansible-lab/scripts/hello.sh

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

Повторный запуск плейбука

Теперь, когда мы добавили разрешение на выполнение к нашему скрипту, давайте снова запустим плейбук Ansible:

cd ~/project/ansible-lab
ansible-playbook -i inventory.ini playbooks/run_script.yml

На этот раз плейбук должен выполниться успешно:

PLAY [Run a script] ******************************************

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

TASK [Execute the hello script] *****************************
changed: [localhost]

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

Просмотр вывода скрипта

Давайте проверим вывод нашего скрипта. Ansible захватывает вывод скрипта и включает его в результаты задачи. Чтобы увидеть подробный вывод, давайте изменим наш плейбук, чтобы зарегистрировать и отобразить вывод:

cd ~/project/ansible-lab/playbooks

Отредактируйте файл run_script.yml, чтобы включить задачи register и debug:

---
- name: Run a script
  hosts: local
  tasks:
    - name: Execute the hello script
      script: ../scripts/hello.sh
      register: script_output

    - name: Display script output
      debug:
        var: script_output.stdout_lines

Теперь давайте снова запустим плейбук:

cd ~/project/ansible-lab
ansible-playbook -i inventory.ini playbooks/run_script.yml

Вы должны увидеть вывод, подобный этому:

PLAY [Run a script] ******************************************

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

TASK [Execute the hello script] *****************************
changed: [localhost]

TASK [Display script output] ********************************
ok: [localhost] => {
    "script_output.stdout_lines": [
        "Hello from localhost!",
        "Current time: Wed Jun 10 12:34:56 UTC 2023",
        "Current user: labex"
    ]
}

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

Теперь вы можете увидеть полный вывод нашего скрипта. Скрипт был запущен от имени пользователя labex, который является нашим текущим пользователем.

Добавив разрешение на выполнение с помощью chmod +x, мы успешно исправили ошибку "Permission denied" (Отказано в доступе) и теперь можем запускать наш скрипт через Ansible.

Использование Become для повышения привилегий

Иногда вам нужно запускать скрипты с повышенными привилегиями, например, выполнять команды, требующие доступа root. В этих случаях простого добавления разрешений на выполнение к скрипту может быть недостаточно. Ansible предоставляет директиву become для запуска задач с повышением привилегий.

Понимание директивы Become

Директива become в Ansible позволяет вам выполнять задачи от имени другого пользователя, обычно с повышенными привилегиями. Это похоже на использование sudo в командной строке.

Основные опции для директивы become включают:

  • become: yes: Включает повышение привилегий
  • become_user: <username>: Указывает, каким пользователем стать (по умолчанию root)
  • become_method: <method>: Указывает, как стать пользователем (по умолчанию sudo)

Создание скрипта, требующего привилегий root

Давайте создадим скрипт, который требует привилегий root для успешного выполнения:

cd ~/project/ansible-lab/scripts
touch system_info.sh

Добавьте следующее содержимое в файл system_info.sh:

#!/bin/bash
echo "System information - requires root privileges"
echo "Hostname: $(hostname)"
echo "Kernel version: $(uname -r)"
echo "Available disk space:"
df -h /
echo "User executing the script: $(whoami)"

Сделайте скрипт исполняемым:

chmod +x ~/project/ansible-lab/scripts/system_info.sh

Создание плейбука с Become

Теперь давайте создадим плейбук, который использует директиву become:

cd ~/project/ansible-lab/playbooks
touch root_script.yml

Добавьте следующее содержимое в файл root_script.yml:

---
- name: Run a script as root
  hosts: local
  tasks:
    - name: Execute the system info script
      script: ../scripts/system_info.sh
      become: yes
      register: script_output

    - name: Display script output
      debug:
        var: script_output.stdout_lines

Директива become: yes указывает Ansible запустить скрипт с повышенными привилегиями.

Запуск плейбука с Become

Давайте запустим наш новый плейбук:

cd ~/project/ansible-lab
ansible-playbook -i inventory.ini playbooks/root_script.yml

Плейбук должен выполниться успешно, и вы должны увидеть вывод, подобный этому:

PLAY [Run a script as root] *********************************

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

TASK [Execute the system info script] **********************
changed: [localhost]

TASK [Display script output] *******************************
ok: [localhost] => {
    "script_output.stdout_lines": [
        "System information - requires root privileges",
        "Hostname: localhost",
        "Kernel version: 5.15.0-1015-aws",
        "Available disk space:",
        "Filesystem      Size  Used Avail Use% Mounted on",
        "/dev/root        59G   17G   42G  29% /",
        "User executing the script: root"
    ]
}

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

Обратите внимание, что в выводе скрипта "User executing the script" теперь root, а не labex. Это показывает, что наш скрипт был запущен с повышенными привилегиями благодаря директиве become: yes.

Понимание, когда использовать Become

Вы должны использовать директиву become в следующих ситуациях:

  1. Когда скрипту необходимо получить доступ к системным файлам или каталогам, требующим привилегий root
  2. Когда скрипту необходимо установить пакеты или изменить конфигурации системы
  3. Когда скрипту необходимо запускать команды, которые обычно требуют sudo в командной строке

Используя директиву become надлежащим образом, вы можете убедиться, что ваши скрипты имеют необходимые разрешения для успешного выполнения, избегая ошибок "Permission denied" (Отказано в доступе).

Лучшие практики для избежания проблем с разрешениями

Теперь, когда мы понимаем, как исправить проблемы с разрешениями с помощью chmod и become, давайте рассмотрим некоторые лучшие практики, чтобы предотвратить возникновение проблем с разрешениями в первую очередь.

1. Всегда делайте скрипты исполняемыми перед их использованием

Перед использованием скрипта в Ansible всегда убедитесь, что у него есть разрешение на выполнение:

chmod +x path/to/script.sh

Хорошей практикой является выполнение этого действия в рамках процесса создания скрипта.

2. Используйте систему контроля версий с правильными режимами файлов

Если вы используете Git или другую систему контроля версий, убедитесь, что она сохраняет режимы файлов (разрешения). В Git вы можете настроить это с помощью:

git config core.fileMode true

Для существующих репозиториев вам может потребоваться обновить режимы файлов:

git update-index --chmod=+x path/to/script.sh

3. Создайте скрипт для проверки и исправления разрешений

Давайте создадим служебный скрипт, который проверяет и исправляет разрешения для всех скриптов в нашем проекте:

cd ~/project/ansible-lab
touch fix_permissions.sh

Добавьте следующее содержимое в файл fix_permissions.sh:

#!/bin/bash
echo "Fixing permissions for scripts in ansible-lab"

## Find all .sh files and make them executable
find ~/project/ansible-lab -name "*.sh" -type f -exec chmod +x {} \;

echo "Done. All script files now have execute permissions."

Сделайте скрипт исполняемым:

chmod +x ~/project/ansible-lab/fix_permissions.sh

Запустите скрипт, чтобы убедиться, что все скрипты в вашем проекте имеют разрешения на выполнение:

./fix_permissions.sh

4. Используйте модуль File Ansible для установки разрешений

Вы также можете использовать модуль file Ansible, чтобы убедиться, что файлы скриптов имеют правильные разрешения. Давайте создадим плейбук, который это делает:

cd ~/project/ansible-lab/playbooks
touch set_permissions.yml

Добавьте следующее содержимое в файл set_permissions.yml:

---
- name: Set correct permissions for scripts
  hosts: local
  tasks:
    - name: Find all script files
      find:
        paths: /home/labex/project/ansible-lab
        patterns: "*.sh"
        recurse: yes
      register: script_files

    - name: Make script files executable
      file:
        path: "{{ item.path }}"
        mode: "0755"
      loop: "{{ script_files.files }}"

Запустите этот плейбук, чтобы убедиться, что все скрипты имеют правильные разрешения:

cd ~/project/ansible-lab
ansible-playbook -i inventory.ini playbooks/set_permissions.yml

5. Создайте плейбук для предварительной проверки

Наконец, давайте создадим плейбук для предварительной проверки, который запускается перед вашими основными плейбуками, чтобы убедиться, что все настроено правильно:

cd ~/project/ansible-lab/playbooks
touch preflight_check.yml

Добавьте следующее содержимое в файл preflight_check.yml:

---
- name: Pre-flight checks
  hosts: local
  tasks:
    - name: Check if scripts are executable
      find:
        paths: /home/labex/project/ansible-lab
        patterns: "*.sh"
        recurse: yes
      register: script_files

    - name: Verify script permissions
      stat:
        path: "{{ item.path }}"
      register: stat_results
      loop: "{{ script_files.files }}"
      failed_when: not stat_results.stat.executable
      ignore_errors: yes

Этот плейбук проверяет, являются ли все файлы .sh исполняемыми, и сообщает о любых, которые не являются.

Давайте запустим предварительную проверку:

cd ~/project/ansible-lab
ansible-playbook -i inventory.ini playbooks/preflight_check.yml

Если все ваши скрипты имеют правильные разрешения, плейбук должен завершиться без ошибок. Если у каких-либо скриптов отсутствуют разрешения на выполнение, вы увидите уведомление.

Следуя этим лучшим практикам, вы можете избежать ошибок "Permission denied" (Отказано в доступе) в ваших скриптах Ansible и обеспечить бесперебойную работу вашей автоматизации.

Резюме

В этой лабораторной работе вы узнали, как выявлять и устранять ошибки "Permission denied" (Отказано в доступе) при использовании модуля script Ansible.

Основные выводы из этой лабораторной работы включают:

  1. Понимание важности разрешений на файлы в Linux и того, как они влияют на выполнение скриптов в Ansible
  2. Использование команды chmod для добавления разрешений на выполнение к файлам скриптов
  3. Использование директивы become Ansible для повышения привилегий при запуске скриптов, требующих доступа root
  4. Внедрение лучших практик для предотвращения проблем с разрешениями, включая:
    • Сделать скрипты исполняемыми перед их использованием
    • Поддержание правильных режимов файлов в системе контроля версий
    • Создание служебных скриптов для проверки и исправления разрешений
    • Использование модуля file Ansible для установки разрешений
    • Внедрение предварительных проверок для проверки вашей среды

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

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

OSZAR »