From 0fe490c95e9305b4de03c2662ad79ef0b8f33664 Mon Sep 17 00:00:00 2001 From: Arseny <20096ninja@gmail.com> Date: Thu, 24 Sep 2026 23:36:10 +0300 Subject: [PATCH] =?UTF-8?q?[UPDATE]=20playbook=20=D0=B1=D0=B5=D0=B7=20?= =?UTF-8?q?=D0=BA=D0=BB=D0=BE=D0=BD=D0=B0=20=D0=B8=20=D1=81=D0=B1=D0=BE?= =?UTF-8?q?=D1=80=D0=BA=D0=B8,=20=D0=BA=D0=BE=D0=B4=20=D1=83=D0=B7=D0=BB?= =?UTF-8?q?=D0=B0=20=D0=BA=D0=BB=D0=B0=D0=B4=D1=91=D1=82=20deploy.yml,=20R?= =?UTF-8?q?EADME?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 74 ++++++++++++++++++++++++++++++---------------------- playbook.yml | 52 +++++------------------------------- run.sh | 9 ------- 3 files changed, 49 insertions(+), 86 deletions(-) delete mode 100755 run.sh diff --git a/README.md b/README.md index e8063fa..1a0372e 100644 --- a/README.md +++ b/README.md @@ -1,47 +1,59 @@ # fleet -Идемпотентный провижнинг парка приёмников пеленгации (Raspberry Pi + HackRF). -Один прогон приводит новую или старую малинку в рабочее состояние: обновление -системы, зависимости сборки, общий deploy-ключ до Gitea, клон и сборка -`hackrf-scanner`. - -Гоняется дома, пока узлы в сети с интернетом. После переноса в изолированную -сеть (коммутатор, статические IP) на карте уже есть всё; правки кода дальше -идут `rsync` + сборка на месте. Статические IP playbook не трогает. +Плейбуки ansible, которые приводят любую малинку парка (Raspberry Pi + +HackRF) в рабочее состояние и обслуживают её дальше: домашний Wi-Fi ради +интернета, пакеты, код `hackrf-scanner` со сборкой на месте, выключение. +Управление идёт по проводной сети 11.0.0.0/24 (`ansible_host` в инвентаре), +Wi-Fi нужен только на время установки пакетов и перед работой выключается, +потому что адаптер сидит в 2,4 ГГц рядом с приёмником. ## Требования -- на управляющей машине: `ansible` (Arch: `pacman -S ansible`), доступ по ssh - к узлам под `pi` по ключу; -- на узлах: Raspberry Pi OS (Debian 13), `pi` с sudo без пароля, интернет. +- управляющая машина: `ansible` с коллекциями `community.general` и + `ansible.posix`, `rsync`, `sshpass` (только для `bootstrap.yml`), + рядом лежит каталог `../hackrf-scanner` (переменная `scanner_src`); +- узлы: Raspberry Pi OS Lite (Debian 13, NetworkManager), пользователь `pi` + с sudo без пароля, статический адрес 11.0.0.x на eth0; на полном образе + с рабочим столом первый `full-upgrade` по Wi-Fi идёт больше часа; +- `vars/wifi.yml` (в `.gitignore`) по образцу `vars/wifi.yml.example`. -## Первый запуск +## Новый узел - scripts/gen-key.sh # пара keys/gitea_deploy (в .gitignore) - # добавить keys/gitea_deploy.pub как deploy key (read-only) - # в Gitea: IU9/hackrf-scanner - ansible-playbook playbook.yml # весь парк +```bash +nmap -sn 11.0.0.0/24 # какие узлы в сети +ansible-playbook bootstrap.yml -l node107 # ключ по паролю pi/raspberry +ansible-playbook wifi-on.yml # Wi-Fi и проверка интернета +ansible-playbook playbook.yml # пакеты, права, имя, паспорт +ansible-playbook wifi-off.yml # Wi-Fi выключен до следующего раза +ansible-playbook deploy.yml # код с этой машины, сборка на узле +``` -## Теги +Новый узел сначала вписывается в `inventory/hosts.yml`. Смена роутера: правка +`vars/wifi.yml` и `wifi-on.yml`, профиль на узлах обновится. - base apt upgrade, зависимости, pi в plugdev - hostname имя узла из инвентаря - key deploy-ключ, ssh config, known_hosts - repo clone/pull ветки scanner_branch (stash локальных правок) - build cmake configure + build +## Плейбуки - ansible-playbook playbook.yml -l node106 --tags repo,build +| Плейбук | Что делает | +|---|---| +| `bootstrap.yml` | ключ управляющей машины в `authorized_keys`, вход по паролю | +| `wifi-on.yml` | радио включено, профиль `fleet-wifi` с кредами из `vars/wifi.yml`, подключение, проверка DNS и HTTPS | +| `playbook.yml` | теги `base` (apt, зависимости, plugdev, udev для HackRF, fish), `hostname`, `key` (deploy-ключ Gitea), `env` (`~/node.env`, только засев) | +| `wifi-off.yml` | радио выключено, NetworkManager помнит это через перезагрузку | +| `deploy.yml` | `rsync` исходников без `.git` и `build`, ревизия в `~/hackrf-scanner/DEPLOYED`, `cmake` сборка, проверка бинарников | +| `poweroff.yml` | штатное выключение и ожидание, пока узел пропадёт из сети | + +Ограничение по узлам и тегам как обычно: `-l node106`, `--tags base`. ## Инвентарь -`inventory/hosts.yml`: адреса узлов в домашней сети (транзитные), а также -справочно -- статический IP для поля, серийник HackRF и координаты x, y (м). -Ветка репозитория -- переменная `scanner_branch`. +`inventory/hosts.yml`: адрес узла в проводной сети, `sdr_id`, серийник HackRF, +координаты x, y в метрах. Координаты и `server_ip` засеваются в `~/node.env` +один раз, полевые правки на узле плейбук не перетирает. ## Приёмка -1. Прогон без `failed`. -2. Второй прогон подряд -- `changed=0` на всех узлах. -3. На узле: `hackrf_info` видит устройство, `~/hackrf-scanner/build/` собран, - `git rev-parse --abbrev-ref HEAD` = `scanner_branch`, `hostname` = имя узла. -4. `ssh -T git@monitor.yss.su` с узла отвечает Gitea. +1. Все плейбуки без `failed`, второй прогон подряд `changed=0`. +2. После `wifi-on.yml` каждый узел печатает адрес в домашней сети и + "интернет есть", после `wifi-off.yml` у `wlan0` нет адреса. +3. На узле `~/hackrf-scanner/build/peleng` и `scan` собраны, `DEPLOYED` + совпадает с `git describe` на управляющей машине, `hostname` = имя узла. diff --git a/playbook.yml b/playbook.yml index 703a5c1..4be6f9a 100644 --- a/playbook.yml +++ b/playbook.yml @@ -1,3 +1,5 @@ +# Базовый провижнинг: пакеты, права на HackRF, имя узла, deploy-ключ, паспорт. +# Нужен интернет на узлах (wifi-on.yml). Код на узлы кладёт deploy.yml. - name: Провижнинг приёмников пеленгации hosts: all tasks: @@ -16,10 +18,10 @@ upgrade: full tags: [base] - - name: Зависимости сборки и утилиты HackRF + - name: Зависимости сборки, утилиты HackRF, python для node.py become: true ansible.builtin.apt: - name: [cmake, g++, pkg-config, git, rsync, libhackrf-dev, libusb-1.0-0-dev, libfftw3-dev, hackrf, fish] + name: [cmake, g++, pkg-config, git, rsync, libhackrf-dev, libusb-1.0-0-dev, libfftw3-dev, hackrf, python3, fish] state: present tags: [base] @@ -76,7 +78,7 @@ - name: Ключа нет run_once: true ansible.builtin.fail: - msg: "[!] нет keys/gitea_deploy -- запустите scripts/gen-key.sh" + msg: "[!] нет keys/gitea_deploy, запустите scripts/gen-key.sh" when: not deploy_key.stat.exists tags: [key] @@ -109,7 +111,7 @@ StrictHostKeyChecking accept-new tags: [key] - - name: ~/node.env для обёртки node.sh (только засев, полевые правки не трогаем) + - name: ~/node.env для node.py (только засев, полевые правки не трогаем) ansible.builtin.copy: dest: ~/node.env mode: "0644" @@ -120,45 +122,3 @@ Y={{ y }} SERVER={{ server_ip }} tags: [env] - - - name: Репозиторий уже клонирован? - ansible.builtin.stat: - path: ~/hackrf-scanner/.git - register: repo_dir - tags: [repo] - - - name: Локальные правки в репо (rsync-разработка)? - ansible.builtin.command: git status --porcelain - args: - chdir: ~/hackrf-scanner - register: dirty - changed_when: false - when: repo_dir.stat.exists - tags: [repo] - - - name: Stash локальных правок перед обновлением - ansible.builtin.command: git stash push -m fleet-provision - args: - chdir: ~/hackrf-scanner - when: repo_dir.stat.exists and dirty.stdout != "" - tags: [repo] - - - name: Репозиторий hackrf-scanner - ansible.builtin.git: - repo: "{{ scanner_repo }}" - dest: ~/hackrf-scanner - version: "{{ scanner_branch }}" - update: true - force: true - register: repo - tags: [repo] - - - name: Сборка - ansible.builtin.shell: | - cmake -B build -DCMAKE_BUILD_TYPE=RelWithDebInfo >/dev/null - cmake --build build -j4 - args: - chdir: ~/hackrf-scanner - register: build - changed_when: "'Building CXX' in build.stdout or 'Linking' in build.stdout" - tags: [build] diff --git a/run.sh b/run.sh deleted file mode 100755 index 5ba4d85..0000000 --- a/run.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh -# run.sh [аргументы ansible-playbook] примеры: -# ./run.sh весь парк, все теги -# ./run.sh --tags base -l node106 -# ./run.sh --check --diff сухой прогон -set -e -cd "$(dirname "$0")" -[ -f keys/gitea_deploy ] || { echo "[!] нет keys/gitea_deploy -- запустите scripts/gen-key.sh"; exit 1; } -exec ansible-playbook playbook.yml "$@"