20 KiB
Quick start
- Устанавливаем ansible на машину (Ansible Master)
# Для Ubuntu
sudo apt update
sudo apt install software-properties-common
sudo add-apt-repository --yes --update ppa:ansible/ansible
sudo apt install ansible
- Создаём инветарный файл в котором описываются хосты (сервера), которыми будет управлять ansible
[web_servers]
archers ansible_host=176.119.89.45 ansible_user=archer ansible_private_key=/home/ilyamak04/.ssh/archers
Про инвентарный файл (что можно делать?)
- Разбивать сервера на группы
[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] — это группа серверов, которая представляет собой логическую коллекцию хостов
- Создавать групповые переменные
[web_servers:vars]
ansible_user=ubuntu
ansible_port=22
Это задаст пользователя и порт по умолчанию для всех серверов в группе web_servers
- Параметры подключения: Можно управлять параметрами подключения для отдельных серверов или групп:
ansible_user
: имя пользователя для SSHansible_port
: порт для SSH-подключенияansible_host
: IP-адрес или имя хостаansible_ssh_private_key_file
: путь к файлу с приватным ключом для SSHansible_become
: определяет, нужно ли использовать привилегированные права (sudo) для выполнения задач
- Группы групп
[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 ищет конфигурационный файл в нескольких местах, в следующем порядке при запуске:
- В текущем каталоге — если существует файл ansible.cfg в директории, из которой запускается Ansible.
- В домашней директории пользователя — файл ~/.ansible.cfg.
- В системной директории — обычно /etc/ansible/ansible.cfg.
Ansible будет использовать первый найденный конфигурационный файл. Это позволяет иметь разные конфигурации для разных проектов.
Файл ansible.cfg лучше хранить в проекте, инфраструктуру когорого менеджерит ansible, а вот инвентарный файл hosts.ini можно хранить где угодно на Ansible-Master хосте, главное в .cfg задать путь к hosts.ini
Основные секции ansible.cfg
- [defaults] - Это основная секция для установки параметров по умолчанию
[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)
[privilege_escalation]
become = True # Включение использования sudo (become)
become_method = sudo # Метод получения привилегий (по умолчанию sudo)
become_user = root # Пользователь, от имени которого выполняются команды
become_ask_pass = False # Отключение запроса пароля при использовании sudo
- [ssh_connection] - Эта секция отвечает за параметры подключения через SSH.
[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] - Настройка логирования
[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
должна находиться в директории с инвентарным файлом.
├── 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 применяет переменные в следующем порядке:
-
Переменные, определённые внутри задач в плейбуке (самый высокий приоритет).
-
Переменные, указанные для конкретных хостов (host_vars).
-
Переменные из группы хостов (group_vars).
-
Переменные для всех хостов (например, файл group_vars/all.yml).
-
Значения по умолчанию.
-
-
Наследование переменных: Переменные, определённые в файле для всех хостов (например,
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
означает, что команды будут выполняться на всех хостах из инвентаря. -
Также можно указывать конкретные группы или отдельные хосты.
-
- hosts: web_servers # Выполнить задачи на всех хостах группы 'web_servers'
- Tasks (задачи) - Каждая задача в плейбуке представляет собой отдельное действие (например, установка пакета, редактирование файла, запуск сервиса). Задачи выполняются по порядку, сверху вниз.
tasks:
- name: Установить Apache
ansible.builtin.apt:
name: apache2
state: present
- Vars (переменные) - Можно использовать переменные для хранения данных, таких как имена пользователей, порты, пути к файлам и так далее.
- 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 (обработчики) - это специальные задачи, которые выполняются только в случае, если их вызвали. Их часто используют для таких задач, как перезагрузка сервиса после изменения конфигурационного файла.
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
.
tasks:
- name: Установить Apache
ansible.builtin.apt:
name: apache2
state: present
become: true # Повышение привилегий до sudo
- Loops (циклы) - Ansible поддерживает выполнение задач в цикле
tasks:
- name: Установить список пакетов
ansible.builtin.apt:
name: "{{ item }}"
state: present
loop:
- apache2
- mysql-server
- php
- Conditions (условия) - Ansible позволяет выполнять задачи только при выполнении определённых условий с помощью
when
.
tasks:
- name: Установить Apache только на Ubuntu
ansible.builtin.apt:
name: apache2
state: present
when: ansible_facts['os_family'] == "Debian"