linux-labs

Вики / Базовые команды

Ansible (управление конфигурацией)

Концепция Ansible 2.16 БазовоеSSHСлужбы

Безагентная автоматизация по 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) — меняют только при необходимости. Для commandcreates=/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

См. также