Files
ansible/docs/2. Настройка Ansible и первый playbook.md
T
2026-05-04 08:51:24 +03:00

175 lines
6.5 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## Установка Ansible
Ansible работает через питон, по этому необходимо установить его:
```
apt update && apt upgrade -y
apt install python3 python3-pip python3-venv -y
```
Установка виртуального окружения:
```
python3 -m venv
source venv/bin/activate
```
И устанавливаем Ansible:
```
pip install ansible
ansible --version
```
<img src="assets/image_1777451283920.jpg" width="auto">
## Настройка Ansible
Готово.
Ansible используем ssh для подключения, лучше всего и безопаснее использовать ssh-ключ, создадим его:
```
ssh-keygen
```
<img src="assets/image_1777451977808.jpg" width="auto">
У меня ключ уже создан
Расположение:
```
/home/<user>/.ssh/id_ed25519.pub # публичный ключ
/home/<user>/.ssh/id_ed25519 # приватный ключ
```
Перекидываем публичный ssh-ключ на наш тестовый стенд:
```
ssh-copy-id -i ~/.ssh/ed25519.pub ansible@172.16.13.101
```
<img src="assets/image_1777454341479.jpg" width="auto">
Готово.
## Первые шаги
Мы можем сделать начальную структуру проекта Ansible через команду:
```
ansible-galaxy role init my-project
```
<img src="./assets/image_1777454975978.jpg" width="auto">
Коротко про каждую:
1. defaults - в main.yml хранятся дефолтные переменные с которыми запускается роль
2. vars - main.yml задаются переменные
3. tasks - сами задачи, плейбуки
4. handlers - это обработчики изменений, если ваша роль выполнялась, что-то изменила, потому что оно не соответствовало описанию плейбука, то будет вызван хендлер, если его описали
5. templates - шаблоны
6. files - хранение файлов, конфигов
7. tests - тесты, можно проверять работу плейбуков, не применяя к серверам, локально в среде
После подключения Ansible делает сбор фактов, узнает полную информацию о системе, какая ОС, архитектура, ip адреса и так далее.
## Подключение Ansible
Как Ansible понять, куда ему подключаться? Для этого существует инвентарный файл hosts.yml
<img src="./assets/image_1777458099510.jpg" width="auto">
Это файл, где Ansible хранит список управляемых машин, пример:
```
all:
hosts: # сервера
web:
ansible_host: 172.16.13.11
db:
ansible_host: 172.16.13.12
ansible_user: postres
git:
ansible_host: 172.16.13.12
ansible_user: gitea
children: # группа серверов
storage-service:
hosts:
db:
git:
vars:
ansible_ssh_private_key_file: ~/.ssh/id_25519
ansible_become_password: P@ssw0rd
```
Это один из возможных вариантов использования hosts.
Мой hosts, на котором буду показывать пример:
```
all:
 hosts:
   my-vm:
     ansible_host: 172.16.13.101
     ansible_user: ansible
 vars:
   ansible_ssh_private_key_file: ~/.ssh/id_ed25519
   ansible_become_password: P@ssw0rd
```
Так же мы будем писать playbook в yml формате, вот простой пример:
```
---
- name: Обновление пакетов
 hosts: all # все хосты из hosts.yml, можно
 become: true # получение root прав
 roles:
   - update-packages
```
Мы указали роль update-packages, значит нужно в папке roles ее сделать, вот какая структура должна получится:
<img src="./assets/image_1777459628010.jpg" width="auto">
В роле update-packages мы создаем tasks "main.yml":
```
---
- name: Обновить все пакеты через apt  
ansible.builtin.apt:
   upgrade: yes             # выполнит обновление всего
   update_cache: yes        # обновить кэш пакетов
```
Идет вызов модуля "ansible.buildin.<font color="#f79646">apt</font>" под названием <font color="#f79646">apt</font>, он принимает 2 параметра:
`upgrade` и `update_cache`
Всё хорошо, но при запуске playbook будет искать roles относительно папки с ним `/ansible/playbooks/roles/`, наше же расположение `/ansible/roles/`, чтобы Ansible знал, где искать мы сделаем ansible.cfg в корневой папке, в которой пропишем полный
```
[defaults]
roles_path = /home/chase/file-fg/ansible/roles
inventory   = inventory/hosts.yml
```
Теперь запустим наш playbook.yml:
<img src="./assets/image_1777543685692.jpg" width="auto">
<font color="#f79646">ok=2 </font>всё отлично
## Дополнение playbook
Добавим в наш playbook еще одну роль
<img src="./assets/image_1777872818078.jpg" width="auto">
Роль `nginx`, через нее мы будем устанавливать на сервер nginx пакет и копировать на него .html файл, вот структура роли nginx:
<img src="./assets/image_1777873462863.jpg" width="auto">
Файл `index.html`:
<img src="./assets/image_1777873545177.jpg" width="auto">
Файл `main.yml`:
<img src="./assets/image_1777873651918.jpg" width="auto">
Запускаем playbook и видим такую картину:
<img src="./assets/image_1777873776351.jpg" width="auto">
Проверим, что nginx установлен и скопировал ли он файл:
<img src="./assets/image_1777873837528.jpg" width="auto">
Отлично, всё работает.
## Документация
Все модули, их параметры, настройка инвентарного файла и много чего еще есть в [документации Ansible](https://docs.ansible.com/projects/ansible/latest/index.html)