Введение
Ansible – это мощный инструмент автоматизации, упрощающий управление инфраструктурой и конфигурацией. Модуль script Ansible позволяет выполнять пользовательские скрипты в ваших плейбуках, расширяя функциональность Ansible за пределы его встроенных модулей. Однако пользователи часто сталкиваются с ошибкой "Permission denied" (Отказано в доступе) при использовании этого модуля, что может препятствовать автоматизации рабочих процессов.
Эта лабораторная работа проведет вас через понимание и решение проблем, связанных с разрешениями, в модуле script Ansible. Вы узнаете, как выявлять причины ошибок, связанных с разрешениями, и реализовывать различные решения для обеспечения успешного выполнения ваших скриптов Ansible.
Установка 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/будет содержать наши плейбуки Ansiblescripts/будет содержать наши 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 каждый файл имеет разрешения, которые определяют, кто может его читать, записывать или выполнять. Существует три типа разрешений:
- Read (r) (Чтение): Разрешает чтение содержимого файла
- Write (w) (Запись): Разрешает изменение файла
- Execute (x) (Выполнение): Разрешает выполнение файла как программы
Эти разрешения назначаются трем различным категориям пользователей:
- User (owner) (Пользователь (владелец)): Владелец файла
- Group (Группа): Пользователи, которые являются членами группы файла
- 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. Команда имеет несколько способов указания разрешений:
- Symbolic mode (Символьный режим): Использует буквы (r, w, x) для представления разрешений
- 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 в следующих ситуациях:
- Когда скрипту необходимо получить доступ к системным файлам или каталогам, требующим привилегий root
- Когда скрипту необходимо установить пакеты или изменить конфигурации системы
- Когда скрипту необходимо запускать команды, которые обычно требуют
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.
Основные выводы из этой лабораторной работы включают:
- Понимание важности разрешений на файлы в Linux и того, как они влияют на выполнение скриптов в Ansible
- Использование команды
chmodдля добавления разрешений на выполнение к файлам скриптов - Использование директивы
becomeAnsible для повышения привилегий при запуске скриптов, требующих доступа root - Внедрение лучших практик для предотвращения проблем с разрешениями, включая:
- Сделать скрипты исполняемыми перед их использованием
- Поддержание правильных режимов файлов в системе контроля версий
- Создание служебных скриптов для проверки и исправления разрешений
- Использование модуля file Ansible для установки разрешений
- Внедрение предварительных проверок для проверки вашей среды
Применяя эти методы, вы можете гарантировать, что ваши скрипты Ansible будут выполняться без ошибок разрешений, повышая надежность ваших рабочих процессов автоматизации.
Навыки, которые вы изучили в этой лабораторной работе, являются основополагающими для эффективной работы с Ansible и могут быть применены к широкому спектру сценариев автоматизации.


