NixOps: как выполнить развертывание на существующей виртуальной машине NixOS?

У меня почти такая же проблема, как и в этом вопросе, но на нее так и не ответили:

nixops: как использовать локальный ключ ssh при развертывании на машине с существующими nixos (targetEnv отсутствует)?

Я не использую Terraform, хотя. Просто NixOS + NixOps. Пока что я:

  • Создал новую виртуальную машину на Vultr
  • Выполнил стандартную установку NixOS из текущего образа (20.09 до чего-то), установив пароль root
  • Включил ssh с аутентификацией по паролю root и сделал nixos-rebuild switch
  • Вручную сгенерировал пару ключей ssh ​​на моем ноутбуке
  • ssh вошел в виртуальную машину с паролем и добавил открытый ключ в /root/.ssh/authorized_keys

Теперь я могу подключиться к виртуальной машине по ssh вручную с новым ключом, как и ожидалось:

ssh -i .secrets/vultrtest1_rsa [email protected]

Прохладный. Затем я скопировал существующие файлы конфигурации NixOS на свой ноутбук и попытался подключить их к NixOps. Я попробовал минимальный test1.nix, а также добавил разделы deployment."none" и/или users.users.root.openssh ниже.

vultrtest1
├── configuration.nix
└── hardware-configuration.nix
test1.nix
# test1.nix
{
  network.description = "vultr test 1";
  network.enableRollback = true;

  vultrtest1 = { config, pkgs, ... } : {
    deployment.targetHost = "XXX.XXX.XXX.XXX";
    imports = [ ./vultrtest1/configuration.nix ];

    # deployment.targetEnv = "none"; # existing nixos vm

    # same result with or without this section:
    deployment."none" = {
      sshPrivateKey = builtins.readFile ./secrets/vultrtest1_rsa;
      sshPublicKey  = builtins.readFile ./secrets/vultrtest1_rsa.pub;
      sshPublicKeyDeployed = true;
    };

    # same result with or without this:
    users.users.root.openssh.authorizedKeys.keyFiles = [ ./secrets/vultrtest1_rsa.pub ];
  };

}

Во всех случаях, когда я пытаюсь создать и развернуть сеть, NixOps пытается сгенерировать другой ключ SSH, а затем не может войти с ним:

$ nixops create test1.nix -d test1
created deployment ‘b4ac25fa-c842-11ea-9a84-00163e5e6c00’
b4ac25fa-c842-11ea-9a84-00163e5e6c00

$ nixops list
+--------------------------------------+-------+------------------------+------------+------+
| UUID                                 | Name  | Description            | # Machines | Type |
+--------------------------------------+-------+------------------------+------------+------+
| b4ac25fa-c842-11ea-9a84-00163e5e6c00 | test1 | Unnamed NixOps network |          0 |      |
+--------------------------------------+-------+------------------------+------------+------+

$ nixops deploy -d test1                                                             
vultrtest1> generating new SSH keypair... done
[email protected]: Permission denied (publickey,keyboard-interactive).
vultrtest1> could not connect to ‘[email protected]’, retrying in 1 seconds...
[email protected]: Permission denied (publickey,keyboard-interactive).
vultrtest1> could not connect to ‘[email protected]’, retrying in 2 seconds...
[email protected]: Permission denied (publickey,keyboard-interactive).
vultrtest1> could not connect to ‘[email protected]’, retrying in 4 seconds...
[email protected]: Permission denied (publickey,keyboard-interactive).
vultrtest1> could not connect to ‘[email protected]’, retrying in 8 seconds...
[email protected]: Permission denied (publickey,keyboard-interactive).
Traceback (most recent call last):
  File "/nix/store/kybdy5m979h4kvswq2gx3la3rpw5cq5k-nixops-1.7/bin/..nixops-wrapped-wrapped", line 991, in <module>
    args.op()
  File "/nix/store/kybdy5m979h4kvswq2gx3la3rpw5cq5k-nixops-1.7/bin/..nixops-wrapped-wrapped", line 412, in op_deploy
    max_concurrent_activate=args.max_concurrent_activate)
  File "/nix/store/kybdy5m979h4kvswq2gx3la3rpw5cq5k-nixops-1.7/lib/python2.7/site-packages/nixops/deployment.py", line 1063, in deploy
    self.run_with_notify('deploy', lambda: self._deploy(**kwargs))
  File "/nix/store/kybdy5m979h4kvswq2gx3la3rpw5cq5k-nixops-1.7/lib/python2.7/site-packages/nixops/deployment.py", line 1052, in run_with_notify
    f()
  File "/nix/store/kybdy5m979h4kvswq2gx3la3rpw5cq5k-nixops-1.7/lib/python2.7/site-packages/nixops/deployment.py", line 1063, in <lambda>
    self.run_with_notify('deploy', lambda: self._deploy(**kwargs))
  File "/nix/store/kybdy5m979h4kvswq2gx3la3rpw5cq5k-nixops-1.7/lib/python2.7/site-packages/nixops/deployment.py", line 996, in _deploy
    nixops.parallel.run_tasks(nr_workers=-1, tasks=self.active_resources.itervalues(), worker_fun=worker)
  File "/nix/store/kybdy5m979h4kvswq2gx3la3rpw5cq5k-nixops-1.7/lib/python2.7/site-packages/nixops/parallel.py", line 44, in thread_fun
    result_queue.put((worker_fun(t), None, t.name))
  File "/nix/store/kybdy5m979h4kvswq2gx3la3rpw5cq5k-nixops-1.7/lib/python2.7/site-packages/nixops/deployment.py", line 979, in worker
    os_release = r.run_command("cat /etc/os-release", capture_stdout=True)
  File "/nix/store/kybdy5m979h4kvswq2gx3la3rpw5cq5k-nixops-1.7/lib/python2.7/site-packages/nixops/backends/__init__.py", line 337, in run_command
    return self.ssh.run_command(command, self.get_ssh_flags(), **kwargs)
  File "/nix/store/kybdy5m979h4kvswq2gx3la3rpw5cq5k-nixops-1.7/lib/python2.7/site-packages/nixops/ssh_util.py", line 280, in run_command
    master = self.get_master(flags, timeout, user)
  File "/nix/store/kybdy5m979h4kvswq2gx3la3rpw5cq5k-nixops-1.7/lib/python2.7/site-packages/nixops/ssh_util.py", line 200, in get_master
    compress=self._compress)
  File "/nix/store/kybdy5m979h4kvswq2gx3la3rpw5cq5k-nixops-1.7/lib/python2.7/site-packages/nixops/ssh_util.py", line 57, in __init__
    "‘{0}’".format(target)
nixops.ssh_util.SSHConnectionFailed: unable to start SSH master connection to ‘[email protected]

Что мне не хватает? Возможно, я могу вручную добавить только что сгенерированный ключ NixOps?

Обновление: я использовал SQLiteBrowser для просмотра базы данных состояния NixOps и вставил сгенерированный открытый ключ в authorized_keys. Теперь я могу ssh ввести только что сгенерированный ключ вручную, но развертывание NixOps по-прежнему не удается.


person jefdaj    schedule 17.07.2020    source источник
comment
у вас есть файлы конфигурации? возможно, в github я посмотрю, смогу ли я воссоздать?   -  person The Unix Janitor    schedule 17.07.2020
comment
Конечно. Я только что нашел частичное решение, добавив ключ к ~/.ssh/config, так что не срочно. Вы все еще хотите их? Мне потребуется несколько минут, чтобы удалить файл .nixops (с закрытыми ключами) из истории битбакета и сделать его общедоступным.   -  person jefdaj    schedule 18.07.2020
comment
bitbucket.org/jefdaj/knlab-nixops РЕДАКТИРОВАТЬ: возможно, вам будет лучше с фиксацией до того, как я начал добавлять свой другой код в качестве подмодулей: bitbucket.org/jefdaj/knlab-nixops /фиксирует/   -  person jefdaj    schedule 18.07.2020
comment
Просто дружеское замечание НЕ запускать nixos-rebuild после nixops, иначе что-то сломается. Они сделали для меня, по крайней мере.   -  person Chris Stryczynski    schedule 18.07.2020


Ответы (2)


Решил это временно, не очень удовлетворительным образом:

  • просмотрел базу данных для открытого + закрытого ключа, сгенерированного NixOps
  • вручную добавил их в authorized_keys на виртуальной машине
  • так же добавил старый ключ в локальный ~/.ssh с записью в ~/.ssh/config

Не знаю, почему NixOps использует локальную конфигурацию ssh или как это предотвратить. Работающая запись выглядит так:

Host XXX.XXX.XXX.XXX
  HostName XXX.XXX.XXX.XXX
  Port 22
  User root
  IdentityFile ~/.ssh/vultrtest1_rsa

Подождем пару дней, а затем отметим это как решение, если кто-нибудь не сможет объяснить, как указать NixOps использовать локальный ключ из .secrets вместо ~/.ssh.

person jefdaj    schedule 17.07.2020

Глядя на источник в

https://github.com/NixOS/nixops/blob/master/nix/options.nix

есть опция deployment.provisionSSHKey

что говорит.

  deployment.provisionSSHKey = mkOption {
  type = types.bool;
  default = true;
  description = ''
    This option specifies whether to let NixOps provision SSH deployment keys.
    NixOps will by default generate an SSH key, store the private key in its state file,
    and add the public key to the remote host.
    Setting this option to <literal>false</literal> will disable this behaviour
    and rely on you to manage your own SSH keys by yourself and to ensure
    that <command>ssh</command> has access to any keys it requires.
  '';
};

Может быть, это может помочь? Как только я вернусь к своей машине Nixops, я попробую.

person The Unix Janitor    schedule 18.07.2020
comment
Это полезно, но еще не в релизной версии. - person Henri Menke; 16.08.2020