В качестве предисловия хочу предупредить, что это моя первая статья. И написана она исключительно для экономии времени тех, кто будет топтаться по тем же граблям, что и я.
И хочу особо выделить тот момент, что метод не будет работать для счастливых обладателей Hass.io в качестве операционной системы. Нужен только образ Hass.io в Docker.
К тому же, я ещё не постиг дзена, как некоторые другие авторы сайта, поэтому уровень моей IT-подготовки далек от желаемого. Поэтому прошу снисходительно отнестись к экстравагантным методам реализации моего умного дома.
Недавно я решил добавить в свою пресную жизнь перчинки и перейти от Home assistant, установленого в качестве пакета в venv, к Hass.io, установленого в Docker. Благо материалов по этому поводу на сайте предостаточно.
Правда, после развертывания системы и восстановления файлов конфигурации от старой установки выяснилось, что Hass.io, хоть и подкупающе красочный,благодаря обилию плагинов, но ещё и очень параноидальный.
Он наотрез отказывался исполнять ssh запросы моих command_line сенсоров shell_command изнутри контейнера.
Опрос home-assistant и telegram комьюнити показал, что сетевая изоляция Hass.io - это один из аспектов сетевой безопасности, которые многие поддерживают (а может просто смирились). Немногие несогласные с этим поведением написали несколько статей по методам партизанской борьбы.
Одна из них более недоступна (но мне кажется, что это её копипаста).
Другая - напоминает записки на полях одного сумасшедшего ученого - другому (по крайней мере, для меня).
После вольного осмысления описанных в них методов, родилось рабочее решение, которое переживает перезапуск контейнера. Им я и спешу поделиться.
От монтирования чего-то в готовый контейнер мне, после нескольких попыток, пришлось отказаться (не получилось).
Поэтому метод заключается в проброске ключей, как описано в этой статье. Единственная особенность в том, что мы кидаем ключи не между машинами, а из нелюдимого докер-контейнера в дружелюбную среду host машины.
Ещё раз обращу внимание владельцев Hass.io как операционной системы, по ошибке дочитавших до этого места. Этот метод не для вас. У вас просто нету "дружелюбной среды". Вам некуда прокидывать ключи.
Алгоритм
- Узнаем ID необходимого нам контейнера с Home Assistant. Можно и через интерфейс Portainer, но он там какой-то слишком здоровый. Через run компактнее.
pi@raspberrypi:~ $ docker ps -a
- Подключаемся к нужному контейнеру и с этого момента все действия по генерации ключей совершаем из него (обратите внимание на вид строки ввода команд).
pi@raspberrypi:~ $ docker exec -it b4a144826c5a /bin/bash
- Создаем ключи аутентификации.
bash-5.0# ssh-keygen
И записываем их на локальную машину (где крутится Docker).
bash-5.0# ssh-copy-id -i ~/.ssh/id_rsa.pub UserName@RemoteServer
Где UserName - ваш пользователь на локальной машине, а RemoteServer - адрес машины в локальной сети.
В моем случае, это выглядит вот так.
bash-5.0# ssh-copy-id -i ~/.ssh/id_rsa.pub pi@192.168.2.10
- После этих действий у вас уже должна появится возможность ходить из докера на локальную машину без пароля.
bash-5.0# ssh pi@192.168.2.10 Linux raspberrypi 4.19.75-v7+ #1270 SMP Tue Sep 24 18:45:11 BST 2019 armv7l The programs included with the Debian GNU/Linux system are free software;the exact distribution terms for each program are described in theindividual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extentpermitted by applicable law.Last login: Thu Oct 3 15:23:00 2019 from 192.168.2.10 pi@raspberrypi:~ $
- Если все получилось - то с этого момента все ваши сенсоры и команды по ssh изнутри Hass.io будут нормально работать, после добавления к ним такой обвязки.
ssh UserName@RemoteServer 'команда'
В моем случае, вот так (определение степени загаженности торрент-диска на роутере).
Пример не самый удачный (можно ключ сразу на 192.168.1.1 кинуть), но самый короткий из моего арсенала.
- platform: command_line #Torrent disk full name: Torrent disk space scan_interval: 2400 command: ssh pi@192.168.2.10 'ssh pi@192.168.1.1 -p 222 df -h | grep /dev/sdb1 | cut -d G -f 4 | cut -c 3-4' unit_of_measurement: "%"
Буду рад, если удалось сэкономить кому-то время и нервы.
И конструктивной критике.
А что, --network host как-то плохо работает?
Разве --network=host не для того, чтобы стек сети контейнера в режим хоста перевести? Или я не правильно понял вопрос?
Это для того, чтобы контейнер использовал сеть хоста. Не будет внутренней подсети и той самой "изоляции"
А супервизор Хасса эту штуку не пофиксит после перезагрузки?
Если честно - не пробовал, поскольку, когда искал решение, такого метода мне под руку не попалось. Вот и ушел на темную сторону силы :)
Если под дружелюбной средой вы понимаете ssh на хост машину, то в hassio он есть.
Имеется ввиду не подключения по ssh, а возможность выполнения скриптов по ssh из Hass.io, а там затык из-за ввода пароля. А так да, ssh есть.