1. Основные понятия
Ansible — инструмент для автоматизации настройки и управления удалёнными узлами (серверами, контейнерами и т. д.). Работает по SSH без агентов на целевых узлах.
Ключевые компоненты:
Inventory — файл со списком управляемых хостов.
Playbook — YAML‑файл с описанием задач для выполнения.
Task — отдельная операция (например, установка пакета).
Module — встроенный «исполнитель» задач (например,
apt,yum,copy).Role — набор плейбуков, переменных и файлов для решения типовой задачи.
Variable — переменная для параметризации плейбуков.
2. Установка и настройка
Установка (Ubuntu/Debian):
sudo apt update
sudo apt install software-properties-common
sudo add-apt-repository --yes --update ppa:ansible/ansible
sudo apt install ansible
Проверка версии:
ansible --version
3. Inventory (файл хостов)
Пример inventory.ini:
[webservers]
web1.example.com
web2.example.com ansible_user=deploy
[dbservers]
db1.example.com ansible_port=2222
[all:vars]
ansible_connection=ssh
ansible_user=root
Запуск команды на группе хостов:
ansible webservers -i inventory.ini -m ping
4. Playbook (основной синтаксис)
Структура YAML:
---
- name: My first playbook
hosts: webservers
become: yes # sudo
tasks:
- name: Ensure nginx is installed
apt:
name: nginx
state: present
- name: Start nginx
service:
name: nginx
state: started
Запуск плейбука:
ansible-playbook -i inventory.ini playbook.yml
5. Основные модули
apt/yum— управление пакетами:yaml- name: Install Apache apt: name: apache2 state: presentcopy— копирование файлов:yaml- name: Copy config file copy: src: /local/path/config.conf dest: /etc/app/config.conf owner: root group: root mode: '0644'file— управление файлами/директориями:yaml- name: Create directory file: path: /var/log/myapp state: directory mode: '0755'service— управление сервисами:yaml- name: Restart nginx service: name: nginx state: restartedshell/command— выполнение команд:yaml- name: Run custom script shell: /usr/local/bin/backup.sh args: chdir: /opt/backupgit— клонирование репозиториев:yaml- name: Clone repo git: repo: https://github.com/user/repo.git dest: /opt/app version: main
6. Переменные
Определение в плейбуке:
vars:
package_name: nginx
config_path: /etc/nginx/nginx.conf
Использование:
- name: Install package
apt:
name: "{{ package_name }}"
state: present
Внешние переменные (файл vars.yml):
---
nginx_version: 1.18
log_dir: /var/log/nginx
Подключение:
- name: Play with external vars
hosts: all
vars_files:
- vars.yml
tasks: ...
7. Условия и циклы
Условия (when):
- name: Install htop on Ubuntu
apt:
name: htop
state: present
when: ansible_os_family == "Debian"
Циклы (loop):
- name: Create users
user:
name: "{{ item }}"
state: present
loop:
- alice
- bob
- charlie
8. Роли (Roles)
Создание роли:
ansible-galaxy init myrole
Структура роли:
roles/myrole/
├── tasks/
│ └── main.yml
├── handlers/
│ └── main.yml
├── templates/
│ └── config.j2
└── defaults/
└── main.yml
Использование роли в плейбуке:
- name: Use myrole
hosts: all
roles:
- myrole
9. Шаблонизация (Jinja2)
Пример шаблона config.j2:
server {
listen {{ http_port }};
server_name {{ domain_name }};
root {{ web_root }};
}
Использование в задаче:
- name: Deploy config
template:
src: config.j2
dest: /etc/nginx/sites-available/default
10. Полезные команды
Проверка синтаксиса:
bashansible-playbook --syntax-check playbook.ymlПробный запуск (не выполняет действия):
bashansible-playbook --check playbook.ymlЗапуск отдельной задачи:
bashansible-playbook playbook.yml --stepОграничение по тегам:
bashansible-playbook playbook.yml --tags "installation,config"Просмотр фактов о хостах:
bashansible all -i inventory.ini -m setup
11. Лучшие практики
Используйте роли для модульности.
Храните секреты в Ansible Vault.
Пишите комментарии к задачам.
Тестируйте плейбуки с
--check.Используйте теги для выборочного выполнения задач.
Версионируйте плейбуки (Git).
Избегайте
shell/command, если есть модуль.
12. Ansible Vault (защита секретов)
Создание зашифрованного файла:
ansible-vault create secret.yml
Редактирование:
ansible-vault edit secret.yml
Запуск с паролем:
ansible-playbook playbook.yml --ask-vault-pass
Пример содержимого secret.yml:
db_password: supersecret123
api_key: abc123xyz