2

Обновление 2: ну что тут сказать, опять работает. Буквально единственное, что я сделал, это обменял мой старый и медленный жесткий диск на SSD, который у меня все еще лежал. Кроме этого, я следовал точно такой же процедуре установки (чистая установка Windows, тот же установочный носитель, те же версии программного обеспечения, то же самое программное обеспечение в целом). Понятия не имею, как это может повлиять на что-либо. Я никогда не думал, что это проблема тайм-аута, потому что, как я уже говорил, он работал на этой машине с этой настройкой. Возможно, обновление Windows изменило поведение сети. Я не знаю. В любом случае, у меня все еще лежит старый жесткий диск, поэтому, если у кого-нибудь есть интересные идеи о том, как это исправить, я мог бы попробовать. Однако теперь, когда у меня есть рабочий ноутбук, это больше не является моим главным приоритетом.

Обновление 1: я могу подтвердить, что это работает на моем другом компьютере разработчика, который значительно более мощный, но в остальном имеет те же настройки (версии программного обеспечения, конфигурации и т.д.). Это особенно странно, учитывая, что моя проблемная машина - чистая установка.

Цель:

Я использую Vagrant для настройки среды веб-разработки на своих машинах с Windows 10.

Vagrant (в Windows) используется для раскрутки виртуальных машин Virtualbox (также в Windows) для размещения Debian Linux. Я использую подсистему Windows для Linux (Debian Distro) для запуска Ansible, чтобы настроить эти виртуальные машины и мой производственный сервер (на котором работает удаленная машина - как вы уже догадались - Debian).

Эта проблема:

Ansible не будет подключаться к виртуальным машинам Virtualbox. Он просто зависает при первой попытке подключения без каких-либо ошибок. Я должен прервать его с помощью Ctrl+C.

Вот где это становится странным: я могу нормально подключаться к виртуальным машинам с помощью Putty из Windows и SSH из WSL, поэтому я знаю, что виртуальная машина доступна и SSH работает. Ansible также может нормально подключиться к моему удаленному серверу, поэтому сам Ansible тоже не сломан. Проблема возникает только между Ansible и локальными виртуальными машинами и только на этом компьютере.

Эта та же самая установка (то же самое git repo, те же самые файлы конфигурации, те же версии программного обеспечения) фактически отлично работает на моей другой машине, и некоторое время назад она также работала на этой машине. Так что я знаю, что это работает в теории. Я просто не могу на всю жизнь понять, что отличается между этими машинами или что я изменил, что привело к его поломке.

Я провел дни в поисках интернета и пробовал все, что мог найти или придумать. К настоящему времени я даже полностью переустановил Windows и всю среду разработки с ней, но, к счастью, ошибка остается. Я в отчаянии, потому что, как сейчас, эта машина непригодна для разработки.

Справочная информация:

Я запускаю Ansible так (например):

 ansible appserver -i environments/development --ask-vault-pass -k -e "ansible_user=vagrant" -m ping

после чего ansible запрашивает пароль SSH, пароль хранилища, и тогда ничего не происходит.

Когда я завершаю работу с помощью Ctrl+ CI, получаю следующую ошибку в /var/log/auth.log на виртуальной машине:

sshd[1343]: Connection closed by 192.168.33.1 port 51481 [preauth]

Этот IP-адрес является адресом только для сети хоста компьютера Virtualbox, как видно в диалоговом окне конфигурации сети Virtualbox, а не IP-адрес самой виртуальной машины. Sshd pid каждый раз отличается.

Когда я запускаю модуль ping в playbook, я сразу получаю три из этих строк (с разными портами в каждой строке) и еще одну из них после нажатия Ctrl+C.

Это мой ansible.cfg (в моем каталоге dir каталог в /etc не тронут):

[defaults]
force_handlers = True
hash_behaviour = merge

Инвентарь Ansible довольно не впечатляющий (только IP)

Когда я запускаю указанную выше команду ansible с -vvvv я получаю следующее:

ansible 2.7.6
config file = /mnt/d/Source/main_server/ansible/ansible.cfg
configured module search path = [u'/home/my_user/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/dist-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.13 (default, Sep 26 2018, 18:42:22) [GCC 6.3.0 20170516]
Using /mnt/d/Source/main_server/ansible/ansible.cfg as config file
SSH password:
Vault password:
setting up inventory plugins
/mnt/d/Source/main_server/ansible/environments/development did not meet host_list requirements, check plugin documentation if this is unexpected
Parsed /mnt/d/Source/main_server/ansible/environments/development inventory source with ini plugin
Loading callback plugin minimal of type stdout, v2.0 from /usr/lib/python2.7/dist-packages/ansible/plugins/callback/minimal.pyc
META: ran handlers
Trying secret <ansible.parsing.vault.PromptVaultSecret object at 0x7f8a35652610> for vault_id=default 
<192.168.33.10> ESTABLISH SSH CONNECTION FOR USER: vagrant
<192.168.33.10> SSH: EXEC sshpass -d9 ssh -vvv -C -o ControlMaster=auto -o ControlPersist=60s -o User=vagrant -o ConnectTimeout=10 -o ControlPath=/home/sseeland/.ansible/cp/d986014952 192.168.33.10 '/bin/sh -c '"'"'echo ~vagrant && sleep 0'"'"''

А потом только тишина, пока я не нажму Ctrl+C.

Это мой бродячий файл:

Vagrant.configure("2") do |config|
    config.vm.box = "debian/stretch64"
    config.vm.boot_timeout = 120
    config.vm.synced_folder ".", "/vagrant", type: "virtualbox"

    config.vm.provider "virtualbox" do |v|
        v.customize [ "modifyvm", :id, "--nictype1", "virtio" ]
    end

    config.ssh.forward_agent = true

    config.vm.define "dev" do |dev|
        # Setting up private_network to have reliable ip and port from host
        dev.vm.network :private_network, ip: "192.168.33.10", nic_type: "virtio"

        # mount source code into machine
        dev.vm.synced_folder "../../svenseeland_site/", "/svenseeland_site/", type: "virtualbox"
    end

    config.vm.define "staging" do |staging|
        # Setting up private_network to have reliable ip and port from host
        staging.vm.network :private_network, ip: "192.168.33.11", nic_type: "virtio"
    end

    # set timezone
    config.vm.provision "shell", name: "set timezone", inline: <<-SHELL
        sudo rm /etc/localtime
        sudo ln -s /usr/share/zoneinfo/Europe/Berlin /etc/localtime
    SHELL

    # add vagrant user to SSH group
    config.vm.provision "shell", name: "add vagrant user to SSH group", inline: <<-SHELL
        usermod -a -G ssh vagrant
    SHELL

    # set root password
    config.vm.provision "shell", name: "set root password", inline: <<-SHELL
        echo -e "vagrant\nvagrant" | sudo passwd
    SHELL

    # enable passwordless root login to mirror the production server setup and open the door for Ansible
    config.vm.provision "shell", name: "enable keyless ssh login", inline: <<-SHELL
        sed -i 's/PasswordAuthentication no/PasswordAuthentication yes/g' /etc/ssh/sshd_config
        echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config
        service ssh restart
    SHELL
end

Некоторые из этих настроек, касающихся пользователей и паролей для SSH, должны подготовить его к управлению Ansible и соответствовать состоянию init моего производственного сервера, как оно предоставляется хостером.

Версии программного обеспечения:

  • Бродяга 2.2.3
  • Virtualbox 6.0.4
  • Ansible 2.7.6
  • Debian 9.7 (официальный бродячий ящик)
  • Windows 10 версия 1809, сборка 17763.253
  • WSL/Debian обновлен (apt-get dist-upgrade)

Дайте мне знать, если вам нужна дополнительная информация.

1 ответ1

0

Базовая настройка:

  • Настройте сеть только для хоста между хостом и гостевой ОС (подробности в этом ответе).
  • Правильно настройте пару ключей SSH и SSH из WSL в эту виртуальную машину с IP-адресом только для хоста.
  • Установите ansible в дистрибутив WSL, проверьте ansible --version если он установлен правильно.

Подробное объяснение всех основных шагов опущено, потому что OP выполнил 99% работы.

Процедура:

  • В дистрибутив WSL добавьте IP-адрес только для хоста в файл /etc/ansible/hosts . Или добавьте настройки виртуальной машины в файл инвентаря, как указано в этом ответе .
  • Чтобы использовать Ansible с паролем SSH, установите sshpass в WSL.
  • Запустите эту команду, чтобы проверить, работает ли Ansible и работает ли ansible all --user=usename --ask-pass --module-name=ping . См. Ansible Docs для получения дополнительной информации о параметрах команды.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .