## Установка 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
```
## Настройка Ansible
Готово.
Ansible используем ssh для подключения, лучше всего и безопаснее использовать ssh-ключ, создадим его:
```
ssh-keygen
```
У меня ключ уже создан
Расположение:
```
/home//.ssh/id_ed25519.pub # публичный ключ
/home//.ssh/id_ed25519 # приватный ключ
```
Перекидываем публичный ssh-ключ на наш тестовый стенд:
```
ssh-copy-id -i ~/.ssh/ed25519.pub ansible@172.16.13.101
```
Готово.
## Первые шаги
Мы можем сделать начальную структуру проекта Ansible через команду:
```
ansible-galaxy role init my-project
```
Коротко про каждую:
1. defaults - в main.yml хранятся дефолтные переменные с которыми запускается роль
2. vars - main.yml задаются переменные
3. tasks - сами задачи, плейбуки
4. handlers - это обработчики изменений, если ваша роль выполнялась, что-то изменила, потому что оно не соответствовало описанию плейбука, то будет вызван хендлер, если его описали
5. templates - шаблоны
6. files - хранение файлов, конфигов
7. tests - тесты, можно проверять работу плейбуков, не применяя к серверам, локально в среде
После подключения Ansible делает сбор фактов, узнает полную информацию о системе, какая ОС, архитектура, ip адреса и так далее.
## Подключение Ansible
Как Ansible понять, куда ему подключаться? Для этого существует инвентарный файл hosts.yml
Это файл, где 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 ее сделать, вот какая структура должна получится:
В роле update-packages мы создаем tasks "main.yml":
```
---
- name: Обновить все пакеты через apt
ansible.builtin.apt:
upgrade: yes # выполнит обновление всего
update_cache: yes # обновить кэш пакетов
```
Идет вызов модуля "ansible.buildin.apt" под названием apt, он принимает 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:
ok=2 всё отлично
## Дополнение playbook
Добавим в наш playbook еще одну роль
Роль `nginx`, через нее мы будем устанавливать на сервер nginx пакет и копировать на него .html файл, вот структура роли nginx:
Файл `index.html`:
Файл `main.yml`:
Запускаем playbook и видим такую картину:
Проверим, что nginx установлен и скопировал ли он файл:
Отлично, всё работает.
## Документация
Все модули, их параметры, настройка инвентарного файла и много чего еще есть в [документации Ansible](https://docs.ansible.com/projects/ansible/latest/index.html)