Управление инвентарём

TL;DR: Inventory в YAML → group_vars/ для переменных → SSH-ключи через ssh-copy-id. ansible-inventory --graph — визуализация. ansible all -m ping — проверка.

Создание inventory

Структура файлов

inventory/
├── hosts.yml                    # основной файл инвентаря
├── group_vars/
│   ├── all.yml                  # переменные для ВСЕХ хостов
│   ├── webservers.yml           # переменные для группы
│   └── db.yml
└── host_vars/
    └── web-01.yml               # переменные для конкретного хоста

Пример hosts.yml

all:
  vars:
    ansible_user: ubuntu
    ansible_ssh_private_key_file: ~/.ssh/id_ed25519
    ansible_python_interpreter: /usr/bin/python3
 
  children:
    webservers:
      hosts:
        web-01:
          ansible_host: 192.168.1.10
        web-02:
          ansible_host: 192.168.1.11
          ansible_port: 2222
 
    databases:
      hosts:
        db-primary:
          ansible_host: 10.0.0.5
 
    local:
      hosts:
        localhost:
          ansible_connection: local
 
    # Группа групп
    production:
      children:
        webservers:
        databases:

Переменные группы (group_vars/webservers.yml)

---
http_port: 80
app_version: "2.1.0"
nginx_worker_processes: auto

Настройка SSH

1. Генерация ключа (на Control Node)

ssh-keygen -t ed25519 -C "ansible-control"
# Enter для всех вопросов (без passphrase для автоматизации)

2. Копирование ключа на серверы

# Один сервер
ssh-copy-id -i ~/.ssh/id_ed25519.pub ubuntu@192.168.1.10
 
# Все серверы из inventory (быстрый скрипт)
for host in 192.168.1.10 192.168.1.11 10.0.0.5; do
  ssh-copy-id -i ~/.ssh/id_ed25519.pub ubuntu@$host
done

3. Проверка (пароль не должен запрашиваться)

ssh ubuntu@192.168.1.10

SSH Troubleshooting

ПроблемаРешение
Permission denied (publickey)Проверить: ключ добавлен в ~/.ssh/authorized_keys? Права 700 на .ssh/, 600 на authorized_keys
Host key verification failedhost_key_checking = False в ansible.cfg или ssh-keyscan host >> known_hosts
Нужен пароль sudoansible-playbook site.yml -K или ansible_become_pass в vault

Параметры подключения

ПеременнаяОписаниеПо умолчанию
ansible_hostIP или доменимя хоста
ansible_portSSH-порт22
ansible_userSSH-пользовательтекущий
ansible_ssh_private_key_fileПуть к ключу~/.ssh/id_rsa
ansible_connectionТип: ssh, local, docker, winrmssh
ansible_becomeИспользовать sudofalse
ansible_become_methodМетод: sudo, su, doassudo
ansible_python_interpreterПуть к Pythonauto

Проверка инвентаря

# Граф групп и хостов
ansible-inventory -i inventory/hosts.yml --graph
 
# Все переменные хоста (с учётом group_vars + host_vars)
ansible-inventory -i inventory/hosts.yml --host web-01
 
# Ping всех хостов
ansible all -m ping
 
# Ping конкретной группы
ansible webservers -m ping
 
# Список хостов (без подключения)
ansible all --list-hosts

Типичные ошибки

ОшибкаСимптомРешение
Переменные внутри hosts.ymlНечитаемый файл при 20+ хостахВынести в group_vars/ и host_vars/
Один inventory для dev и prodСлучайный деплой на prodРазделить: inventory/dev/hosts.yml, inventory/prod/hosts.yml
SSH-ключ с passphraseansible all -m ping зависаетИспользовать ssh-agent: eval $(ssh-agent) && ssh-add
ansible_python_interpreter не указанMODULE FAILURE: /usr/bin/python not foundУказать /usr/bin/python3 в group_vars/all.yml