Утилита для удаленного обслуживания систем на базе ОС NixOS — nixops

Thank you for reading this post, don't forget to subscribe!

nixops - ути­ли­та для уда­лен­но­го обслу­жи­ва­ния систем на базе ОС NixOS. Так­же она под­дер­жи­ва­ет раз­вер­ты­ва­ние систем на VirtualBox VM, Amazon EC2, Google Compute Engine, Microsoft Azure, Hetzner physical machines, Digital Ocean, Libvirtd (Qemu), Datadog resources. Подроб­нее об этих воз­мож­но­стях мож­но про­чи­тать в мануа­ле — https://releases.nixos.org/nixops/nixops-1.7/manual/manual.html.

Давай­те попро­бу­ем под­клю­чить управ­ле­ние nixops к уже уста­нов­лен­ной уда­лен­ной систе­ме на базе ОС NixOS. Она может быть уста­нов­ле­на как на физи­че­ской машине, так и на вир­ту­аль­ной. Глав­ное, что­бы к ней был доступ по IP-адресу.

Создаем удаленную систему

Про­ве­рим теку­щую вер­сию nixops:

nixops --version
NixOps 1.7

Созда­дим новую вир­ту­аль­ную маши­ну и уста­но­вим на нее ОС NixOS (как это сде­лать, мож­но посмот­реть в ста­тье). Cге­не­ри­ру­ем хэш пароля:

mkpasswd -m sha-512
Password:
$6$zejLDpVGQfekr$no6c35WweI7j59W8diZ2pZwA2xadi5NxJNacLkBBoOmyt/4Lqt/pDX2pO3vUw157eb59XUZ71GZcMXQs2FqKL/

И ssh-ключ, кото­рый будем исполь­зо­вать в уда­лен­ной системе:

ssh-keygen -a 128 -t ed25519 -f ~/.ssh/id_ed25519

Опции:

  • -a 128 — ука­зы­ва­ет коли­че­ство исполь­зу­е­мых раун­дов для KDF (функ­ция полу­че­ния ключа).
  • -t ed25519 — гене­ри­ру­ет ключ на осно­ве схе­мы сиг­на­тур эллип­ти­че­ской кривой.
  • -f ~/.ssh/id_ed25519 — ука­зы­ва­ет, куда сохра­нять ключ.
cat ~/.ssh/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAII5rqPqf/eFAyAEPZhwX/Hg7sNLZj4LWEexxsnv6izMW rebrain@NixOS-example

На уда­лен­ной систе­ме исполь­зу­ем вот такую упро­щен­ную конфигурацию :

Важ­но пра­виль­но про­пи­сать openssh.authorizedKeys.keys, так как ина­че не смо­жем попасть в уда­лен­ную систе­му. Имей­те в виду, что в кон­фи­гу­ра­ции зна­че­ния hashedPassword и openssh.authorizedKeys.keys будут отличаться.

Теперь у нас гото­ва уда­лен­ная систе­ма, где мы можем поте­стить ути­ли­ту nixops.

Переходим к деплою

На основ­ной систе­ме под­го­тав­ли­ва­ем струк­ту­ру для деплоя:

mkdir -p ~/works/nixops/{config-defs,deploy/labs/vm01-test}
ln -s /etc/nixos/nix-config/core.nix ~/works/nixops/config-defs/core.nix
ln -s /etc/nixos/nix-config/generic ~/works/nixops/config-defs/generic

Где:

  • config-defs — здесь созда­ем сим­линк к базо­вой кон­фи­гу­ра­ции систе­мы, кото­рая будет исполь­зо­вать­ся на всех уда­лен­ных системах.
  • deploy — в этой пап­ке будет хра­нить­ся кон­фи­гу­ра­ция уда­лен­ных систем.

Для пер­вой уда­лен­ной систе­мы созда­ем сле­ду­ю­щие кон­фи­гу­ра­ци­он­ные файлы:

nano ~/works/nixops/deploy/labs.nix

В зна­че­нии deployment.targetHost = «192.168.0.221»; ука­зы­ва­ем IP-адрес нашей уда­лен­ной систе­мы. Как вы пони­ма­е­те, в вашем слу­чае он будет отличаться.
nano ~/works/nixops/deploy/labs/vm01-test/configuration.nix

Теперь копи­ру­ем из уда­лен­ной систе­мы содер­жи­мое hardware-configuration.nix. В вашем слу­чае зна­че­ния fileSystems.»/» и swapDevices будут отли­чать­ся, осталь­ные пара­мет­ры тоже могут отли­чать­ся в зави­си­мо­сти от того, где и как вы под­ня­ли уда­лен­ную систему.
nano ~/works/nixops/deploy/labs/vm01-test/hardware-configuration.nix

В фай­ле users.nix в раз­де­ле users.root.openssh.authorizedKeys.keys про­пи­сы­ва­ем наш ssh-ключ. В раз­де­ле users.rebrain.openssh.authorizedKeys.keys уже про­пи­сан ключ, кото­рый мы сге­не­ри­ро­ва­ли при пер­вом зна­ком­стве с NixOS.
nano ~/works/nixops/deploy/labs/vm01-test/users.nix

Созда­ем новый деплой:
nixops create -d labs ~/works/nixops/deploy/labs.nix
created deployment ‘00bb8030-dd68-11ea-bffc-525400c283bd’
00bb8030-dd68-11ea-bffc-525400c283bd

Про­смот­рим инфор­ма­цию о нашем деплое:

nixops info -d labs

Разворачиваем конфигурацию на удаленной системе

Теперь мож­но раз­вер­нуть нашу кон­фи­гу­ра­цию на уда­лен­ную систему:

nixops deploy -d labs

Если при гене­ра­ции ssh клю­ча ука­зы­ва­ли пароль, то nixops у нас eго затребует:

Запус­ка­ет­ся про­цесс сбор­ки и настрой­ки уда­лен­ной системы:


Спер­ва идет копи­ро­ва­ние паке­тов и кон­фи­гу­ра­ци­он­ных фай­лов на уда­лен­ную систе­му. Затем на их осно­ве соби­ра­ет­ся необ­хо­ди­мая нам кон­фи­гу­ра­ция систе­мы. В кон­це у нас выско­чит ошиб­ка, что не стар­то­ва­ла служ­ба apparmor, для ее акти­ва­ции нуж­на пере­за­груз­ка уда­лен­ной системы:
nixops reboot -d labs

Полу­чен­ную кон­фи­гу­ра­цию доба­вим в git-репозиторий:
git config --global user.email "rebrain@NixOS-example"
git config --global user.name "rebrain"
cd ~/works/nixops/deploy
git init && git add -A && git commit -m "first commit"

Теперь доба­вим основ­ные служ­бы — фаер­вол, fail2ban и мони­то­ринг netdata:

cp -r /etc/nixos/nix-config/servers/example/services ~/works/nixops/deploy/labs/vm01-test
nano ~/works/nixops/deploy/labs/vm01-test/configuration.nix

Про­смот­рим изменения:
git diff

Добав­ля­ем изме­не­ния в git:
git add -A
git commit -m "add default services"

Теперь при­ме­ня­ем изме­не­ния на уда­лен­ной системе:

nixops deploy -d labs

Служ­ба nftables выда­ет ошиб­ку, так как систе­ме тре­бу­ет­ся перезагрузка:
nixops reboot -d labs

Для обнов­ле­ния уда­лен­ной систе­мы надо зара­нее обно­вить на теку­щей систе­ме основ­ной канал и запу­стить обнов­ле­ние через nixops:

sudo nix-channel --update
unpacking channels…
nixops deploy -d labs

Удаляем все

Что­бы уда­лить наш деп­лой, нуж­но уда­лить из него спер­ва все уда­лен­ные системы:

nixops destroy -d labs
these derivations will be built:
/nix/store/py43280mq7bn7585yq9xwkvknnxblvpb-nixops-machines.drv
building '/nix/store/py43280mq7bn7585yq9xwkvknnxblvpb-nixops-machines.drv'
Time: 0h:00m:04s

А толь­ко потом уже сам деплой:

nixops delete -d labs