285 lines
20 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

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.

### Quick start
- Устанавливаем ansible на машину (Ansible Master)
```bash
# Для Ubuntu
sudo apt update
sudo apt install software-properties-common
sudo add-apt-repository --yes --update ppa:ansible/ansible
sudo apt install ansible
```
- Создаём инветарный файл в котором описываются хосты (сервера), которыми будет управлять ansible
```ini
[web_servers]
archers ansible_host=176.119.89.45 ansible_user=archer ansible_private_key=/home/ilyamak04/.ssh/archers
```
### Про инвентарный файл (что можно делать?)
- Разбивать сервера на группы
```ini
[dev_servers]
webserver1 ansible_host=192.168.1.10
webserver2 ansible_host=192.168.1.11
[prod_servers]
webserver3 ansible_host=192.168.1.12
webserver4 ansible_host=192.168.1.13
```
[dev_servers] — это группа серверов, которая представляет собой логическую коллекцию хостов
- Создавать групповые переменные
```ini
[web_servers:vars]
ansible_user=ubuntu
ansible_port=22
```
Это задаст пользователя и порт по умолчанию для всех серверов в группе web_servers
- Параметры подключения: Можно управлять параметрами подключения для отдельных серверов или групп:
- `ansible_user`: имя пользователя для SSH
- `ansible_port`: порт для SSH-подключения
- `ansible_host`: IP-адрес или имя хоста
- `ansible_ssh_private_key_file`: путь к файлу с приватным ключом для SSH
- `ansible_become`: определяет, нужно ли использовать привилегированные права (sudo) для выполнения задач
- Группы групп
```ini
[production:children]
web_servers
db_servers
```
- Команды:
`ansible-inventory -i hosts.ini --list` - отображает список хостов, распределение хостов по группам в json-овидном формате
`ansible-inventory -i hosts.ini --graph` - отображает список хостов, распределение хостов по группам в древовидном формате
> Ansible case sensetive!
> По умолчанию любой сервер входит в 2 группы: 1) all 2) ungrouped или пользовательская группа
### Про конфигурационный файл `ansible.cfg`
- Ansible ищет конфигурационный файл в нескольких местах, в следующем порядке при запуске:
1. В текущем каталоге — если существует файл ansible.cfg в директории, из которой запускается Ansible.
2. В домашней директории пользователя — файл ~/.ansible.cfg.
3. В системной директории — обычно /etc/ansible/ansible.cfg.
Ansible будет использовать первый найденный конфигурационный файл. Это позволяет иметь разные конфигурации для разных проектов.
Файл ansible.cfg лучше хранить в проекте, инфраструктуру когорого менеджерит ansible, а вот инвентарный файл hosts.ini можно хранить где угодно на Ansible-Master хосте, главное в .cfg задать путь к hosts.ini
### Основные секции `ansible.cfg`
- [defaults] - Это основная секция для установки параметров по умолчанию
```ini
[defaults]
inventory = ./hosts # Указывает путь к инвентарному файлу
remote_user = ubuntu # Пользователь для подключения по умолчанию
host_key_checking = False # Отключение проверки ключей SSH хоста
retry_files_enabled = False # Отключение создания файлов retry
timeout = 10 # Время ожидания для SSH-соединения
forks = 10 # Количество параллельных задач
retry_files_enabled = True
retry_files_save_path = ~/ansible-retries
```
Создание retry-файла: Если во время выполнения плейбука Ansible сталкивается с ошибкой на одном или нескольких серверах, он автоматически создаёт retry-файл. По умолчанию этот файл создаётся в директории, где был запущен плейбук, и имеет формат имя_плейбука.retry.
Повторный запуск плейбука: Можно использовать retry-файл, чтобы запустить плейбук только на тех серверах, которые указаны в файле. Для этого нужно указать имя retry-файла с опцией --limit.
`ansible-playbook site.yml --limit @site.retry
`
- [privilege_escalation] - Эта секция управляет параметрами для выполнения команд от имени суперпользователя (с помощью sudo)
```ini
[privilege_escalation]
become = True # Включение использования sudo (become)
become_method = sudo # Метод получения привилегий (по умолчанию sudo)
become_user = root # Пользователь, от имени которого выполняются команды
become_ask_pass = False # Отключение запроса пароля при использовании sudo
```
- [ssh_connection] - Эта секция отвечает за параметры подключения через SSH.
```ini
[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=60s
pipelining = True
control_path = %(directory)s/%%h-%%r
```
`ssh_args`: Дополнительные параметры для команды ssh. В данном примере включена поддержка многократного использования одного SSH-соединения (ControlMaster).
`pipelining`: Опция для ускорения выполнения команд за счёт уменьшения количества вызовов SSH.
`control_path`: Путь для хранения файлов управления соединением SSH.
- [log] - Настройка логирования
```ini
[log]
log_path = /var/log/ansible.log
```
### Ad-Hoc команды
`ansible [опции] <группа-хостов> -m <модуль> -a <аргументы>` - структура Ad-Hoc команд
- `ansible -i hosts.ini all -m setup` - модуль, который собирает детальную информацию о системе каждого хоста (например, информацию о процессоре, операционной системе, памяти, сетевых интерфейсах и т.д.). Эта информация затем может быть использована в плейбуках или для отладки.
- `ansible -i hosts.ini all -m ping` - проверка доступности хостов.
- `ansible -i hosts.ini all -m shell -a "rm -rf /"` - запускает команду в кавычках на хостах, выводит вывод команды со всех хостов в консоль.
- `ansible -i hosts.ini all -m command -a "rm -rf /"` - Команда(ы) не будут обрабатываться через shell, поэтому переменные типа $HOSTNAME и операции типа "*", "<", ">", "|", ";" и "&" не будут работать. Используйте модуль ansible.builtin.shell, если вам нужны эти функции. То есть command более секьюрная.
- `ansible -i hosts.ini all -m copy -a "src=filename.txt dest=/home mode=777" -b` - ну тут понятно что команда делает, флаг `-b` - это выполнить от суперпользователя
Про модуль `file` - С помощью этого модуля можно изменять права доступа, владельцев, группы, создавать или удалять файлы и директории, а также устанавливать символические ссылки.
Вот основные параметры, которые можно использовать с модулем file:
- `path`: путь к файлу или директории, с которыми нужно работать.
- `state`: определяет, что должно быть сделано с файлом или директорией. Возможные значения:
- `touch`: создать пустой файл, если он не существует, или обновить время доступа и модификации, если файл уже существует.
- `absent`: удалить файл или директорию.
- `directory`: создать директорию.
- `file`: создать файл.
- `link`: создать символическую ссылку.
- `hard`: создать жесткую ссылку.
- `owner`: владелец файла или директории.
- `group`: группа файла или директории.
- `mode`: права доступа к файлу или директории, указанные в виде числового значения (например, 0644).
- `recurse`: рекурсивно изменяет права, владельцев или группы для директорий и их содержимого (поддиректорий и файлов).
- `ansible -i hosts.ini all -m file -a "path=/home/privet.txt state=absent" -b` - удаляет файл
- `ansible -i hosts.ini all -m get_url -a "url=https://link/on/download/file dest=/home" -b` - скачивает файл из интернета
- `ansible -i hosts.ini all -m apt -a "name=nginx state=present" --become` - устанаваливает пакет на Ubuntu/Debian (-b и --become эквивалентны)
- `ansible -i hosts.ini all -m uri -a "url=https://www.content.ru return_content=yes"` - Модуль uri в Ansible используется для взаимодействия с веб-сервисами через HTTP или HTTPS. Этот модуль позволяет выполнять запросы к REST API, загружать данные, отправлять данные на удалённый сервер и проверять доступность веб-сервисов.
Модуль `service` в Ansible используется для управления системными сервисами на удалённых хостах. Он позволяет запускать, останавливать, перезапускать и изменять состояние сервисов, а также управлять их включением при загрузке системы.
- `name`: Название сервиса, который нужно управлять. Например, apache2, nginx, ssh, и т. д.
- `state`: Указывает желаемое состояние сервиса. Возможные значения:
- `started`: Запустить сервис.
- `stopped`: Остановить сервис.
- `restarted`: Перезапустить сервис.
- `reloaded`: Перезагрузить конфигурацию сервиса без остановки.
- `enabled`: Включить сервис при загрузке системы.
- `disabled`: Отключить сервис от автозагрузки.
- `enabled`: Указывает, должен ли сервис автоматически запускаться при загрузке системы. Значения могут быть true или false.
- `ansible -i hosts.ini all -m service -a "name=nginx state=started enabled=yes" -b`
> Все демоны могут считаться сервисами, но не все сервисы являются демонами
### group_vars
Директория `group_vars` должна находиться в директории с инвентарным файлом.
```css
├── ansible.cfg
├── inventory/
│ ├── hosts
├── group_vars/
│ ├── all.yml
│ ├── web_servers.yml
│ └── db_servers.yml
└── playbook.yml
```
Внутри директории group_vars могут находиться файлы с именами групп из инвентаря. Эти файлы содержат переменные, которые будут применяться ко всем хостам, принадлежащим к соответствующей группе.
- Файл web_servers.yml содержит переменные, которые будут применяться ко всем серверам группы web_servers.
- Файл all.yml содержит переменные для всех хостов, независимо от группы.
#### Основные моменты
- **Приоритеты**: Если переменные определены в нескольких местах, например, в файлах group_vars, host_vars или playbook, Ansible применяет переменные в следующем порядке:
1. Переменные, определённые внутри задач в плейбуке (самый высокий приоритет).
2. Переменные, указанные для конкретных хостов (host_vars).
3. Переменные из группы хостов (group_vars).
4. Переменные для всех хостов (например, файл group_vars/all.yml).
5. Значения по умолчанию.
- **Наследование переменных**: Переменные, определённые в файле для всех хостов (например, `group_vars/all.yml`), могут быть переопределены переменными, определёнными в группе конкретных хостов (например, `group_vars/web_servers.yml`).
- **Формат файлов**: Файлы в директории `group_vars` могут быть в формате YAML или INI, хотя YAML используется чаще.
### Флаги
- `-b` - от суперюзера
- `-k` - `--ask-pass`: ask for connection password
- `-K` - `--ask-become-pass`: ask for privilege escalation password
- `-v`, `-vv`, `-vvv`, `-vvvv` - подробный вывод для дебага
### Плейбуки
Ansible playbook — это файл в формате YAML, который описывает последовательность действий для настройки хостов (серверов). Playbooks позволяют автоматизировать задачи, такие как установка программ, управление конфигурациями, деплой приложений и многое другое. Они состоят из набора инструкций, называемых tasks (задачи), которые выполняются на удалённых хостах, указанных в инвентаре. (определение chat gpt, на мой взгляд неплохое)
- **Hosts (хосты)** - это часть плейбука, которая указывает, на каких серверах выполнять задачи
- `all` означает, что команды будут выполняться на всех хостах из инвентаря.
- Также можно указывать конкретные группы или отдельные хосты.
```yml
- hosts: web_servers # Выполнить задачи на всех хостах группы 'web_servers'
```
- **Tasks (задачи)** - Каждая задача в плейбуке представляет собой отдельное действие (например, установка пакета, редактирование файла, запуск сервиса). Задачи выполняются по порядку, сверху вниз.
```yml
tasks:
- name: Установить Apache
ansible.builtin.apt:
name: apache2
state: present
```
- **Vars (переменные)** - Можно использовать переменные для хранения данных, таких как имена пользователей, порты, пути к файлам и так далее.
```yml
- hosts: web_servers
become: true
vars:
http_port: 8080
document_root: /var/www/html
tasks:
- name: Установить Apache
ansible.builtin.apt:
name: apache2
state: present
- name: Настроить Apache на нужный порт
ansible.builtin.lineinfile:
path: /etc/apache2/ports.conf
regexp: '^Listen'
line: "Listen {{ http_port }}" # Использование переменной
- name: Создать директорию DocumentRoot
ansible.builtin.file:
path: "{{ document_root }}" # Использование переменной
state: directory
```
- **Handlers (обработчики)** - это специальные задачи, которые выполняются **только в случае, если их вызвали**. Их часто используют для таких задач, как перезагрузка сервиса после изменения конфигурационного файла.
```yml
tasks:
- name: Изменить конфигурацию Apache
ansible.builtin.template:
src: templates/apache.conf.j2
dest: /etc/apache2/apache2.conf
notify:
- Перезапустить Apache
handlers:
- name: Перезапустить Apache
ansible.builtin.service:
name: apache2
state: restarted
```
- **Become (повышение привилегий)** - Некоторые команды требуют прав администратора (sudo). Для этого используется `become`.
```yml
tasks:
- name: Установить Apache
ansible.builtin.apt:
name: apache2
state: present
become: true # Повышение привилегий до sudo
```
- **Loops (циклы)** - Ansible поддерживает выполнение задач в цикле
```yml
tasks:
- name: Установить список пакетов
ansible.builtin.apt:
name: "{{ item }}"
state: present
loop:
- apache2
- mysql-server
- php
```
- **Conditions (условия)** - Ansible позволяет выполнять задачи только при выполнении определённых условий с помощью `when`.
```yml
tasks:
- name: Установить Apache только на Ubuntu
ansible.builtin.apt:
name: apache2
state: present
when: ansible_facts['os_family'] == "Debian"
```