Обо мне / Подготовка к assesment
Ansible - инструмент для автоматизации задач по управлению, настройке и обслуживанию серверов или сетевых устройств
Команды для работы с Ansible
| Команда |
Описание |
Краткие параметры |
Пример |
ansible |
Одноразовые ad‑hoc команды |
-i inventory, -m <module>, -a <args> |
ansible web -i hosts -m ping |
ansible-playbook |
Запуск playbook (yaml) |
-i, --limit, --check, --diff |
ansible-playbook -i hosts site.yml |
ansible-galaxy |
Работа с ролями/коллекциями |
install, init |
ansible-galaxy install geerlingguy.nginx |
ansible-vault |
Шифрование секретов |
create, encrypt, decrypt |
ansible-vault encrypt secrets.yml |
ansible-lint |
Статический анализ playbook |
— |
ansible-lint site.yml |
Структура каталога Ansible
| Корневой уровень |
Назначение |
Вложенный уровень |
inventories/ |
Файлы инвентаря / групповые переменные |
hosts, group_vars/, host_vars/ |
playbooks/ |
Основные playbook'и |
site.yml, deploy.yml |
roles/<role>/ |
Роли (tasks/handlers/files/templates) |
Стандартизированная структура: tasks/, handlers/, defaults/ |
group_vars/ |
Параметры групп хостов |
Перекрываются host_vars |
host_vars/ |
Переменные конкретного хоста |
Использовать для уникальных конфигураций |
library/ |
Локальные модули |
Для кастомных модулей |
collections/ |
Коллекции Ansible |
ansible-galaxy коллекции |
Примеры использования Ansible
| Сценарий |
Что делает |
Быстрая команда/фрагмент |
| Деплой приложения |
Копирует артефакт, обновляет systemd, перезапускает сервис |
ansible-playbook -i hosts deploy.yml |
| Установка пакета |
Модуль apt/yum управляет пакетами |
- name: install nginx\n apt: name=nginx state=present |
| Управление конфигом |
Шаблон Jinja2 → /etc/app/config |
template: src=config.j2 dest=/etc/app/config |
| Ротация логов / cron |
Создать cron job или конфиг |
cron: модуль или шаблон в /etc/cron.d/ |
| Секреты |
Шифрование с ansible-vault и использование в playbook |
ansible-vault encrypt secrets.yml и vars_files: |
Install and start Nginx
- name: Install and start Nginx on web servers
hosts: web
become: true
tasks:
- name: Update apt cache (Debian/Ubuntu)
apt:
update_cache: yes
when: ansible_os_family == "Debian"
- name: Ensure Nginx is installed
apt:
name: nginx
state: present
when: ansible_os_family == "Debian"
- name: Ensure Nginx service is enabled and running
service:
name: nginx
state: started
enabled: yes
Deploy simple app binary
- name: Deploy simple app binary and systemd service
hosts: app
become: true
vars:
app_name: myapp
deploy_dir: /opt/myapp
tasks:
- name: Create deploy directory
file:
path: "{{ deploy_dir }}"
state: directory
owner: root
group: root
mode: "0755"
- name: Copy application binary
copy:
src: files/myapp # локальный файл в ansible/files/
dest: "{{ deploy_dir }}/{{ app_name }}"
mode: "0755"
- name: Upload systemd unit from template
template:
src: templates/myapp.service.j2
dest: /etc/systemd/system/{{ app_name }}.service
mode: "0644"
- name: Reload systemd
command: systemctl daemon-reload
args:
warn: false
- name: Ensure app service is started and enabled
systemd:
name: "{{ app_name }}"
state: started
enabled: yes
Create simple cron job
- name: Create simple cron job on target hosts
hosts: utils
become: true
tasks:
- name: Ensure daily backup cron exists
cron:
name: "daily-db-backup"
user: root
minute: "30"
hour: "2"
job: "/usr/local/bin/db-backup.sh >> /var/log/db-backup.log 2>&1"