Вики / Базовые команды
Ansible (управление конфигурацией)
Безагентная автоматизация по SSH — инвентарь, плейбуки, идемпотентность.
Ansible автоматизирует настройку серверов без агента — подключается по SSH и приводит хосты к описанному состоянию. Ключевое свойство — идемпотентность: повторный запуск ничего не меняет, если уже как надо.
ansible --version
ansible all -i inventory.ini -m ping # проверить связь со всеми хостами
inventory.ini — список хостов и групп:
[web]
web1 ansible_host=10.0.0.1
web2 ansible_host=10.0.0.2
[web:vars]
ansible_user=deploy
ansible web -i inventory.ini -m ping
ansible web -i inventory.ini -m apt -a "name=nginx state=present" --become
ansible all -i inventory.ini -m service -a "name=nginx state=restarted" --become
ansible all -i inventory.ini -a "uptime" # произвольная команда (модуль command)
ansible web -i inventory.ini -m setup # собрать факты о хосте
--become = через sudo (см. sudo). ansible.cfg задаёт дефолты (inventory,
remote_user, become), чтобы не повторять флаги.
# site.yml
- hosts: web
become: true
vars:
pkg: nginx
tasks:
- name: Установить {{ pkg }}
apt: { name: "{{ pkg }}", state: present, update_cache: true }
- name: Конфиг из шаблона
template: { src: nginx.conf.j2, dest: /etc/nginx/nginx.conf }
notify: reload nginx # триггерит handler при изменении
- name: Запустить и включить
service: { name: "{{ pkg }}", state: started, enabled: true }
handlers:
- name: reload nginx
service: { name: nginx, state: reloaded }
ansible-playbook -i inventory.ini site.yml
ansible-playbook -i inventory.ini site.yml --check --diff # dry-run + различия
ansible-playbook -i inventory.ini site.yml --limit web1 --tags config
ansible-galaxy init roles/myrole # каркас роли (tasks/handlers/templates/vars)
Переменные — group_vars/, host_vars/; секреты — ansible-vault (ansible-vault
encrypt secrets.yml, запуск с --ask-vault-pass).
UNREACHABLE / SSH-ошибки
Это SSH-проблема: ключ/доступ (ssh-keys), верный ansible_user,
host key. Проверь ssh deploy@host вручную; -vvv для подробностей.
sudo: a password is required
Нужен --become и доступный sudo. По паролю — --ask-become-pass (или NOPASSWD,
см. sudo).
Задача каждый раз «changed»
Используешь command/shell вместо идемпотентного модуля. Бери спец-модули (apt,
copy, template, lineinfile) — меняют только при необходимости. Для command —
creates=/changed_when:.
Хочу увидеть, что изменится
--check (dry-run) + --diff (различия в файлах/шаблонах).
Vault: ничего не расшифровать
Нужен пароль vault (--ask-vault-pass или --vault-password-file). Без него
зашифрованные переменные недоступны.
ansible all -i inv -m ping # связь
ansible web -i inv -m apt -a "name=nginx state=present" --become
ansible-playbook -i inv site.yml [--check --diff] [--limit host] [--tags t]
ansible-vault encrypt secrets.yml ; ansible-playbook ... --ask-vault-pass
# идемпотентность: спец-модули (apt/copy/template), не shell; --become для sudo
См. также
- Bash-скрипты (основы) — Базовые команды
- SSH-клиент (ssh, scp, туннели) — Сеть
- SSH-ключи и ssh-agent — Сеть