Введение
Ansible – это мощный инструмент автоматизации, который помогает управлять и настраивать серверы без ручного вмешательства. Однако многие задачи Ansible требуют повышенных привилегий для корректного выполнения. При запуске команд, требующих прав администратора, Ansible использует механизм sudo, который может запрашивать пароль.
В этой лабораторной работе вы узнаете, как правильно настроить параметры пароля sudo в плейбуках Ansible, поймете распространенные проблемы, связанные с sudo, и реализуете лучшие практики для обеспечения бесперебойной работы вашей автоматизации с необходимыми разрешениями.
Установка Ansible и создание базового плейбука
На этом первом шаге мы установим Ansible и создадим простой плейбук, требующий привилегий sudo. Это поможет нам понять основные требования для запуска задач 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 (main, Ubuntu, linux/x86_64)
jinja version = 3.0.3
libyaml = True
Создание базового плейбука Ansible
Теперь давайте создадим простой плейбук Ansible, требующий привилегий sudo. Этот плейбук установит пакет htop в локальной системе.
Создайте новую директорию для вашего проекта Ansible:
mkdir -p ~/project/ansible-sudo-lab
cd ~/project/ansible-sudo-lab
Далее создайте файл инвентаризации, который определяет хосты, которыми будет управлять Ansible. Для этой лабораторной работы мы будем использовать localhost:
echo "localhost ansible_connection=local" > inventory
Теперь создайте базовый плейбук, требующий привилегий sudo. Откройте редактор VSCode и создайте новый файл с именем basic_playbook.yml:
- Нажмите "File" в меню WebIDE
- Выберите "New File"
- Скопируйте и вставьте следующее содержимое:
---
- name: Basic sudo operation
hosts: localhost
become: true ## This enables sudo
tasks:
- name: Install htop
apt:
name: htop
state: present
update_cache: yes
- Сохраните файл как
~/project/ansible-sudo-lab/basic_playbook.yml
Этот плейбук содержит директиву become: true, которая указывает Ansible использовать sudo для выполнения задач. Сама задача пытается установить пакет htop с помощью модуля apt.
Запуск плейбука
Теперь давайте запустим наш плейбук и посмотрим, что произойдет:
cd ~/project/ansible-sudo-lab
ansible-playbook -i inventory basic_playbook.yml
Поскольку пользователь labex имеет доступ sudo без пароля, плейбук должен успешно запуститься без запроса пароля. Вы должны увидеть вывод, аналогичный этому:
PLAY [Basic sudo operation] ******************************************
TASK [Gathering Facts] **********************************************
ok: [localhost]
TASK [Install htop] ************************************************
ok: [localhost]
PLAY RECAP *********************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Плейбук успешно запустился, потому что наш текущий пользователь (labex) уже настроен с доступом sudo без пароля. На следующих шагах мы рассмотрим, как обрабатывать сценарии, когда требуется пароль sudo.
Понимание конфигурации пароля Sudo в Ansible
На предыдущем шаге мы создали базовый плейбук, который использовал привилегии sudo без запроса пароля. Однако во многих реальных сценариях вам потребуется предоставить пароль sudo для выполнения привилегированных команд. Давайте рассмотрим, как обрабатывать пароли sudo в Ansible.
Как Ansible обрабатывает пароли Sudo
Когда Ansible необходимо запустить команду с повышенными привилегиями в удаленной системе, он использует функциональность become. По умолчанию Ansible использует команду sudo для повышения привилегий, но вы можете настроить его на использование других методов, таких как su, pbrun или pfexec.
Если пользователю, запускающему Ansible, требуется пароль для использования sudo, Ansible должен знать этот пароль. Существует несколько способов предоставить пароль sudo Ansible:
- Параметр командной строки:
-Kили--ask-become-pass - Переменная плейбука:
become_password - Файл конфигурации:
ansible.cfg - Ansible Vault: для безопасного хранения паролей
Создание тестового пользователя с требованием пароля Sudo
Чтобы продемонстрировать, как обрабатывать пароли sudo, давайте создадим тестового пользователя, которому требуется пароль для операций sudo:
sudo adduser ansible_test
При появлении запроса введите пароль ansible123 и завершите процесс создания пользователя.
Далее давайте предоставим этому пользователю привилегии sudo, но потребуем пароль:
echo "ansible_test ALL=(ALL) ALL" | sudo tee /etc/sudoers.d/ansible_test
Эта конфигурация позволяет пользователю ansible_test использовать sudo, но будет требовать пароль пользователя каждый раз.
Создание плейбука с обработкой пароля Sudo
Теперь давайте создадим плейбук, который демонстрирует, как обрабатывать пароли sudo. Создайте новый файл с именем sudo_password_playbook.yml в WebIDE:
---
- name: Playbook with sudo password handling
hosts: localhost
become: true
## We'll provide the become_password when running the playbook
tasks:
- name: Get current user
command: whoami
register: current_user
become: false ## This task doesn't need sudo
- name: Print current user
debug:
msg: "Current user is {{ current_user.stdout }}"
become: false ## This task doesn't need sudo
- name: Run a command with sudo
command: apt update
register: sudo_output
- name: Print sudo command result
debug:
msg: "Command ran with sudo: {{ sudo_output.rc == 0 }}"
Сохраните этот файл как ~/project/ansible-sudo-lab/sudo_password_playbook.yml
Запуск плейбука с вводом пароля
Когда вы хотите запустить плейбук от имени пользователя, которому требуется пароль sudo, вы можете использовать опцию -K (или --ask-become-pass), чтобы запросить пароль:
ansible-playbook -i inventory sudo_password_playbook.yml -K
Поскольку мы запускаем от имени пользователя labex, у которого есть sudo без пароля, вам на самом деле не будет предложено ввести пароль. Однако в производственной среде, где sudo без пароля не настроен, Ansible предложит вам ввести пароль sudo.
Чтобы смоделировать этот сценарий с нашим тестовым пользователем, вы можете выполнить следующую команду (хотя она не будет полностью работать в этой лабораторной среде из-за отсутствия настройки SSH):
ansible-playbook -i inventory sudo_password_playbook.yml -u ansible_test -K
При запросе пароля BECOME вы введете ansible123.
Указание пароля Sudo в переменной Ansible
Вместо интерактивного ввода пароля вы можете предоставить пароль sudo в качестве переменной при запуске плейбука:
ansible-playbook -i inventory sudo_password_playbook.yml -e "ansible_become_password=ansible123"
Этот подход полезен для автоматизированных скриптов, где интерактивный ввод невозможен. Однако он раскрывает пароль в истории командной строки, что является риском для безопасности. В производственной среде следует использовать Ansible Vault для безопасного хранения конфиденциальной информации.
Использование Ansible Vault для безопасного управления паролями
На предыдущем шаге мы рассмотрели различные способы предоставления паролей sudo плейбукам Ansible. Однако хранение паролей в файлах в виде обычного текста или передача их в командной строке небезопасны. На этом шаге мы узнаем, как использовать Ansible Vault для безопасного управления конфиденциальной информацией, такой как пароли sudo.
Что такое Ansible Vault?
Ansible Vault — это функция, которая позволяет шифровать конфиденциальные данные, такие как пароли, ключи API или сертификаты. Зашифрованные файлы можно безопасно хранить в системах управления версиями, не раскрывая конфиденциальную информацию. Ansible может автоматически расшифровывать эти файлы во время выполнения плейбука.
Создание зашифрованного файла Vault
Давайте создадим зашифрованный файл для хранения нашего пароля sudo:
cd ~/project/ansible-sudo-lab
ansible-vault create vault.yml
Вам будет предложено создать новый пароль для хранилища. Введите vaultpassword123 и подтвердите его.
После установки пароля хранилища откроется редактор. Введите следующее содержимое в редакторе:
---
vault_sudo_password: ansible123
Сохраните файл и выйдите из редактора.
Теперь, если вы попытаетесь просмотреть содержимое файла хранилища, вы увидите, что он зашифрован:
cat vault.yml
Вы должны увидеть вывод, аналогичный следующему:
$ANSIBLE_VAULT;1.1;AES256
32623438613466396238613731623338376461653866353031313632316237613561393639613131
3562626166616332386265373761653835356134613561380a363761333362323238663136633439
32343032333832313562353261333530666639643239303436643363393630643639316232303564
3962356162356361370a313038333432353162333462323035323262396233333039326535356662
31363539613432656362326565613232336535393232653939323466323131393362
Использование переменных Vault в плейбуке
Теперь давайте создадим плейбук, который использует зашифрованный пароль sudo. Создайте новый файл с именем secure_sudo_playbook.yml:
---
- name: Playbook with secure sudo password
hosts: localhost
become: true
become_password: "{{ vault_sudo_password }}"
vars_files:
- vault.yml
tasks:
- name: Get sudo user
command: whoami
register: sudo_user
- name: Print sudo user
debug:
msg: "Running as {{ sudo_user.stdout }}"
- name: Check sudo access
command: apt update
register: apt_result
failed_when: false
- name: Print result
debug:
msg: "Sudo access successful: {{ apt_result.rc == 0 }}"
Сохраните этот файл как ~/project/ansible-sudo-lab/secure_sudo_playbook.yml
Запуск плейбука с Vault
При запуске плейбука, который включает зашифрованный файл хранилища, вам необходимо предоставить пароль хранилища. Есть несколько способов сделать это:
- Использование опции
--ask-vault-pass:
ansible-playbook -i inventory secure_sudo_playbook.yml --ask-vault-pass
При появлении запроса введите пароль хранилища: vaultpassword123
- Использование файла пароля хранилища:
Сначала создайте файл, содержащий пароль хранилища:
echo "vaultpassword123" > vault_password_file
chmod 600 vault_password_file
Затем запустите плейбук с файлом пароля:
ansible-playbook -i inventory secure_sudo_playbook.yml --vault-password-file vault_password_file
Вы должны увидеть вывод, аналогичный следующему:
PLAY [Playbook with secure sudo password] ***************************
TASK [Gathering Facts] **********************************************
ok: [localhost]
TASK [Get sudo user] ***********************************************
changed: [localhost]
TASK [Print sudo user] *********************************************
ok: [localhost] => {
"msg": "Running as root"
}
TASK [Check sudo access] *******************************************
changed: [localhost]
TASK [Print result] ************************************************
ok: [localhost] => {
"msg": "Sudo access successful: True"
}
PLAY RECAP *********************************************************
localhost : ok=5 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Рекомендации по управлению паролями Sudo
Вот некоторые рекомендации, которым следует следовать при управлении паролями sudo в Ansible:
- Всегда используйте Ansible Vault для шифрования конфиденциальной информации
- Никогда не храните пароли хранилища в системе управления версиями
- Используйте безопасный метод для распространения паролей хранилища (например, менеджер паролей)
- Рассмотрите возможность использования идентификатора хранилища для разных сред (разработка, промежуточная среда, производство)
- Регулярно меняйте пароли хранилища
В производственной среде вы также можете рассмотреть возможность использования такого инструмента, как HashiCorp Vault или AWS Secrets Manager, для еще более безопасного управления секретами.
Устранение неполадок, связанных с распространенными проблемами с паролем Sudo
Даже при правильной настройке вы можете столкнуться с проблемами с паролями sudo в Ansible. На этом шаге мы рассмотрим распространенные проблемы и их решения.
Распространенные проблемы с паролем Sudo
Вот некоторые распространенные проблемы, с которыми вы можете столкнуться при использовании sudo с Ansible:
- Отсутствует пароль sudo: Ansible не может найти пароль
sudoдля выполнения привилегированных команд. - Неверный пароль sudo: Предоставленный пароль
sudoневерен. - Проблемы с конфигурацией Sudo: Целевой пользователь не имеет правильных разрешений
sudo. - Sudo требует TTY: Некоторые системы требуют выделения TTY для команд
sudo.
Давайте рассмотрим каждую из этих проблем и их решения.
Создание проблемной среды для тестирования
Чтобы лучше понять эти проблемы, давайте создадим сценарий, в котором sudo требует TTY. Отредактируйте файл sudoers для нашего тестового пользователя:
sudo cp /etc/sudoers.d/ansible_test /etc/sudoers.d/ansible_test.bak
echo 'Defaults:ansible_test requiretty' | sudo tee -a /etc/sudoers.d/ansible_test
Эта конфигурация заставляет sudo требовать TTY, когда пользователь ansible_test запускает команды sudo, что может вызвать проблемы с Ansible.
Создание плейбука для устранения неполадок
Создайте новый плейбук с именем troubleshoot_sudo.yml, который включает в себя некоторые распространенные методы устранения неполадок sudo:
---
- name: Troubleshoot sudo issues
hosts: localhost
become: true
become_method: sudo
## We'll provide the become_password when running the playbook
tasks:
- name: Check sudo version
command: sudo --version
register: sudo_version
become: false
- name: Print sudo version
debug:
msg: "{{ sudo_version.stdout_lines[0] }}"
become: false
- name: Check sudo configuration
command: sudo -l
register: sudo_config
become: false
failed_when: false
- name: Print sudo configuration
debug:
msg: "{{ sudo_config.stdout_lines }}"
become: false
when: sudo_config.rc == 0
- name: Test sudo command with pty
command: apt update
register: sudo_test
failed_when: false
vars:
ansible_become_flags: "-H"
- name: Print sudo test result
debug:
msg: "Sudo command {{ 'succeeded' if sudo_test.rc == 0 else 'failed' }}"
Сохраните этот файл как ~/project/ansible-sudo-lab/troubleshoot_sudo.yml
Запуск плейбука для устранения неполадок
Запустите плейбук для устранения неполадок:
ansible-playbook -i inventory troubleshoot_sudo.yml -K
Поскольку мы запускаем от имени пользователя labex, у которого есть sudo без пароля, плейбук должен выполниться успешно.
Общие решения проблем с паролем Sudo
Вот решения распространенных проблем с паролем sudo:
1. Отсутствует пароль sudo
Если Ansible завершается с сообщением, например «Отсутствует пароль sudo», вы можете:
- Использовать опцию
-K, чтобы запросить парольsudo - Установить переменную
ansible_become_passwordв вашем инвентаре или плейбуке - Использовать Ansible Vault для безопасного хранения и предоставления пароля
sudo
2. Неверный пароль sudo
Если пароль sudo неверен:
- Дважды проверьте пароль, который вы предоставляете
- Убедитесь, что срок действия пароля пользователя не истек и он не был изменен
- Проверьте, не изменилась ли конфигурация
sudoв целевой системе
3. Проблемы с конфигурацией Sudo
Если у пользователя нет правильных разрешений sudo:
- Проверьте файл sudoers в целевой системе
- Убедитесь, что пользователь находится в правильных группах
- Используйте
sudo -l, чтобы проверить привилегииsudoпользователя
4. Sudo требует TTY
Если sudo требует TTY:
- Добавьте
ansible_become_flags: "-H"в ваш плейбук или инвентарь - Измените файл sudoers, чтобы удалить опцию
requiretty - Используйте опцию
pty: trueв ваших задачах
Восстановление исходной конфигурации Sudo
Давайте восстановим исходную конфигурацию sudo для нашего тестового пользователя:
sudo cp /etc/sudoers.d/ansible_test.bak /etc/sudoers.d/ansible_test
sudo rm /etc/sudoers.d/ansible_test.bak
Это удаляет опцию requiretty, которую мы добавили ранее.
Резюме
В этой лабораторной работе вы узнали, как обрабатывать пароли sudo в плейбуках Ansible, что является распространенной проблемой для многих администраторов и инженеров DevOps. Вот краткое изложение того, что вы сделали:
- Вы установили Ansible и создали базовый плейбук, который использует привилегии
sudo - Вы изучили различные методы предоставления паролей
sudoплейбукам Ansible - Вы использовали Ansible Vault для безопасного хранения и управления конфиденциальной информацией
- Вы изучили распространенные проблемы с паролями
sudoи узнали, как их устранять
Эти навыки помогут вам создавать более безопасные и надежные плейбуки Ansible, которые могут обрабатывать различные конфигурации sudo в разных средах.
Основные выводы из этой лабораторной работы:
- Всегда используйте безопасные методы, такие как Ansible Vault, для хранения конфиденциальной информации
- Понимайте различные способы предоставления паролей
sudoв Ansible - Знайте, как устранять распространенные проблемы с паролями
sudo - Следуйте рекомендациям по управлению паролями
sudoв Ansible
Обладая этими навыками, вы теперь можете уверенно использовать Ansible для задач, требующих повышенных привилегий, обеспечивая бесперебойную и безопасную работу вашей автоматизации.


