2026-06-01 23:45:18 +03:00
|
|
|
|
# Ansible Home VM Project Scripts
|
|
|
|
|
|
|
|
|
|
|
|
Этот файл описывает playbook-и внутри проекта `ansibleHostsHomeVM`.
|
|
|
|
|
|
|
|
|
|
|
|
## Структура проекта
|
|
|
|
|
|
|
|
|
|
|
|
```text
|
|
|
|
|
|
ansible.cfg
|
|
|
|
|
|
inventory.ini
|
2026-06-06 17:30:00 +03:00
|
|
|
|
playbooks/
|
|
|
|
|
|
facts.yml
|
|
|
|
|
|
add-ssh-key.yml
|
|
|
|
|
|
bootstrap-new-client.yml
|
|
|
|
|
|
generate-ssh-config.yml
|
|
|
|
|
|
shell-setup.yml
|
|
|
|
|
|
files/
|
|
|
|
|
|
config.fish
|
2026-06-01 23:45:18 +03:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## ansible.cfg
|
|
|
|
|
|
|
|
|
|
|
|
Локальный конфиг Ansible для этого проекта.
|
|
|
|
|
|
|
|
|
|
|
|
```ini
|
|
|
|
|
|
[defaults]
|
|
|
|
|
|
inventory = inventory.ini
|
|
|
|
|
|
interpreter_python = auto_silent
|
|
|
|
|
|
host_key_checking = True
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
Смысл:
|
|
|
|
|
|
|
|
|
|
|
|
- `inventory = inventory.ini` — не нужно каждый раз писать `-i inventory.ini`.
|
|
|
|
|
|
- `interpreter_python = auto_silent` — Ansible сам ищет Python на VM и не шумит предупреждениями.
|
|
|
|
|
|
- `host_key_checking = True` — SSH host key checking включён. Это безопаснее: если fingerprint сервера изменился, Ansible не подключится молча.
|
|
|
|
|
|
|
|
|
|
|
|
## inventory.ini
|
|
|
|
|
|
|
|
|
|
|
|
Список управляемых VM.
|
|
|
|
|
|
|
|
|
|
|
|
Пример:
|
|
|
|
|
|
|
|
|
|
|
|
```ini
|
|
|
|
|
|
[proxmox_vms]
|
|
|
|
|
|
nginx ansible_host=192.168.8.170 ansible_user=vrubel
|
|
|
|
|
|
docker-prod ansible_host=192.168.8.171 ansible_user=vrubel
|
|
|
|
|
|
fedoraXfce ansible_host=192.168.8.172 ansible_user=vrubel
|
|
|
|
|
|
hermes ansible_host=192.168.8.173 ansible_user=vrubel
|
|
|
|
|
|
docker-test ansible_host=192.168.8.174 ansible_user=vrubel
|
|
|
|
|
|
cicd ansible_host=192.168.8.175 ansible_user=vrubel
|
|
|
|
|
|
monitoring ansible_host=192.168.8.176 ansible_user=vrubel
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
Группа `proxmox_vms` используется в командах:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
ansible proxmox_vms -m ping
|
2026-06-06 17:30:00 +03:00
|
|
|
|
ansible-playbook playbooks/facts.yml
|
2026-06-01 23:45:18 +03:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## facts.yml
|
|
|
|
|
|
|
|
|
|
|
|
Диагностический playbook. Ничего не меняет на серверах.
|
|
|
|
|
|
|
|
|
|
|
|
Он собирает facts и показывает:
|
|
|
|
|
|
|
|
|
|
|
|
- имя хоста;
|
|
|
|
|
|
- семейство ОС;
|
|
|
|
|
|
- дистрибутив;
|
|
|
|
|
|
- версию ОС;
|
|
|
|
|
|
- пакетный менеджер;
|
|
|
|
|
|
- путь к Python.
|
|
|
|
|
|
|
|
|
|
|
|
Запуск:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
2026-06-06 17:30:00 +03:00
|
|
|
|
ansible-playbook playbooks/facts.yml
|
2026-06-01 23:45:18 +03:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
Используется для проверки, какие машины Ubuntu/Debian, какие Fedora/RedHat, и какой пакетный менеджер Ansible видит.
|
|
|
|
|
|
|
|
|
|
|
|
## add-ssh-key.yml
|
|
|
|
|
|
|
|
|
|
|
|
Playbook для добавления публичного SSH-ключа в `authorized_keys` пользователя `vrubel` на всех VM.
|
|
|
|
|
|
|
|
|
|
|
|
По умолчанию берёт ключ текущего пользователя:
|
|
|
|
|
|
|
|
|
|
|
|
```text
|
|
|
|
|
|
~/.ssh/id_ed25519.pub
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
Запуск, если доступ по ключу уже есть:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
2026-06-06 17:30:00 +03:00
|
|
|
|
ansible-playbook playbooks/add-ssh-key.yml
|
2026-06-01 23:45:18 +03:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
Если надо добавить не текущий ключ, а другой публичный ключ из файла:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
2026-06-06 17:30:00 +03:00
|
|
|
|
ansible-playbook playbooks/add-ssh-key.yml -e "key_file=$HOME/Downloads/new-client.pub"
|
2026-06-01 23:45:18 +03:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
Или, например:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
2026-06-06 17:30:00 +03:00
|
|
|
|
ansible-playbook playbooks/add-ssh-key.yml -e "key_file=$HOME/infra/ansible/keys/laptop.pub"
|
2026-06-01 23:45:18 +03:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
Важно: файл должен быть именно публичным ключом, то есть `.pub`. Приватный ключ `id_ed25519` в репозиторий не добавлять и никому не передавать.
|
|
|
|
|
|
|
|
|
|
|
|
Этот playbook полезен, когда управляющий комп уже имеет SSH-доступ к VM и нужно добавить новый ключ на все машины.
|
|
|
|
|
|
|
|
|
|
|
|
## bootstrap-new-client.yml
|
|
|
|
|
|
|
|
|
|
|
|
Playbook для первичной настройки нового клиента.
|
|
|
|
|
|
|
|
|
|
|
|
Он делает две вещи:
|
|
|
|
|
|
|
|
|
|
|
|
1. На локальном компьютере добавляет fingerprints VM в `~/.ssh/known_hosts`.
|
|
|
|
|
|
2. По SSH-паролю подключается к VM и добавляет публичный ключ текущего клиента в `authorized_keys`.
|
|
|
|
|
|
|
|
|
|
|
|
Запуск на новом компьютере:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
2026-06-06 17:30:00 +03:00
|
|
|
|
ansible-playbook playbooks/bootstrap-new-client.yml --ask-pass
|
2026-06-01 23:45:18 +03:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
Ansible спросит SSH-пароль пользователя `vrubel`.
|
|
|
|
|
|
|
|
|
|
|
|
После успешного выполнения нужно проверить доступ без пароля:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
ansible proxmox_vms -m ping
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
Если все VM отвечают `pong`, новый клиент готов.
|
|
|
|
|
|
|
|
|
|
|
|
Этот playbook заменяет ручной `ssh-copy-id` по всем VM.
|
|
|
|
|
|
|
|
|
|
|
|
## generate-ssh-config.yml
|
|
|
|
|
|
|
|
|
|
|
|
Playbook для генерации локального `~/.ssh/config` из `inventory.ini`.
|
|
|
|
|
|
|
|
|
|
|
|
Он добавляет блок вида:
|
|
|
|
|
|
|
|
|
|
|
|
```sshconfig
|
|
|
|
|
|
# BEGIN ANSIBLE MANAGED HOME VM HOSTS
|
|
|
|
|
|
Host nginxVM
|
|
|
|
|
|
HostName 192.168.8.170
|
|
|
|
|
|
User vrubel
|
|
|
|
|
|
IdentityFile ~/.ssh/id_ed25519
|
|
|
|
|
|
|
|
|
|
|
|
Host docker-prodVM
|
|
|
|
|
|
HostName 192.168.8.171
|
|
|
|
|
|
User vrubel
|
|
|
|
|
|
IdentityFile ~/.ssh/id_ed25519
|
|
|
|
|
|
# END ANSIBLE MANAGED HOME VM HOSTS
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
Сначала безопасная проверка:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
2026-06-06 17:30:00 +03:00
|
|
|
|
ansible-playbook playbooks/generate-ssh-config.yml --check --diff
|
2026-06-01 23:45:18 +03:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
Если diff выглядит нормально, применить:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
2026-06-06 17:30:00 +03:00
|
|
|
|
ansible-playbook playbooks/generate-ssh-config.yml
|
2026-06-01 23:45:18 +03:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
После этого можно заходить так:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
ssh nginxVM
|
|
|
|
|
|
ssh docker-prodVM
|
|
|
|
|
|
ssh hermesVM
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
Playbook управляет только блоком между маркерами `ANSIBLE MANAGED HOME VM HOSTS`. Остальные ручные записи в `~/.ssh/config` не трогает.
|
|
|
|
|
|
|
2026-06-06 17:30:00 +03:00
|
|
|
|
## shell-setup.yml
|
|
|
|
|
|
|
|
|
|
|
|
Playbook для установки fish, neovim и CLI-утилит (lsd, bat, grc, zoxide) с настройкой fish как shell по умолчанию.
|
|
|
|
|
|
|
|
|
|
|
|
Устанавливает пакеты через универсальный модуль `package` (работает и с apt, и с dnf). Для Debian создаёт симлинк `batcat -> bat`.
|
|
|
|
|
|
|
|
|
|
|
|
Копирует `files/config.fish` в `~/.config/fish/config.fish` и меняет shell пользователя на `/usr/bin/fish`.
|
|
|
|
|
|
|
|
|
|
|
|
Запуск:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
ansible-playbook playbooks/shell-setup.yml
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
После выполнения нужно перелогиниться для применения fish.
|
|
|
|
|
|
|
2026-06-01 23:45:18 +03:00
|
|
|
|
## Типовой сценарий для нового компьютера
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
sudo pacman -S ansible sshpass
|
|
|
|
|
|
git clone git@github.com:vrubelroman/ansibleHostsHomeVM.git
|
|
|
|
|
|
cd ansibleHostsHomeVM
|
2026-06-06 17:30:00 +03:00
|
|
|
|
ansible-playbook playbooks/bootstrap-new-client.yml --ask-pass
|
2026-06-01 23:45:18 +03:00
|
|
|
|
ansible proxmox_vms -m ping
|
2026-06-06 17:30:00 +03:00
|
|
|
|
ansible-playbook playbooks/generate-ssh-config.yml --check --diff
|
|
|
|
|
|
ansible-playbook playbooks/generate-ssh-config.yml
|
2026-06-01 23:45:18 +03:00
|
|
|
|
```
|