{"record":{"id":"0dd434e7ba12ccd0","repo":"hashicorp/vagrant","slug":"the-provider-for-this-vagrant-managed-machine-is-r-0dd434","errorCode":null,"errorMessage":"The provider for this Vagrant-managed machine is reporting that it\nis not yet ready for SSH. Depending on your provider this can carry\ndifferent meanings. Make sure your machine is created and running and\ntry again. Additionally, check the output of `vagrant status` to verify\nthat the machine is in the state that you expect. If you continue to\nget this error message, please view the documentation for the provider\nyou're using.","messagePattern":"The provider for this Vagrant-managed machine is reporting that it\nis not yet ready for SSH\\. Depending on your provider this can carry\ndifferent meanings\\. Make sure your machine is created and running and\ntry again\\. Additionally, check the output of `vagrant status` to verify\nthat the machine is in the state that you expect\\. If you continue to\nget this error message, please view the documentation for the provider\nyou're using\\.","errorType":"exception","errorClass":"Vagrant::Errors::SSHNotReady","httpStatus":null,"severity":"error","filePath":"plugins/provisioners/shell/provisioner.rb","lineNumber":114,"sourceCode":"      # This is the provision method called if SSH is what is running\n      # on the remote end, which assumes a POSIX-style host.\n      def provision_ssh(args)\n        env = config.env.map { |k,v| \"#{k}=#{quote_and_escape(v.to_s)}\" }\n        env = env.join(\" \")\n\n        command =  \"chmod +x '#{upload_path}'\"\n        command << \" &&\"\n        command << \" #{env}\" if !env.empty?\n        command << \" #{upload_path}#{args}\"\n\n        with_script_file do |path|\n          # Upload the script to the machine\n          @machine.communicate.tap do |comm|\n            # Reset upload path permissions for the current ssh user\n            info = nil\n            retryable(on: Vagrant::Errors::SSHNotReady, tries: 3, sleep: 2) do\n              info = @machine.ssh_info\n              raise Vagrant::Errors::SSHNotReady if info.nil?\n            end\n\n            comm.upload(path.to_s, upload_path)\n            user = info[:username]\n            comm.sudo(\"chown -R #{user} #{upload_path}\",\n                      error_check: false)\n\n            if config.name\n              @machine.ui.detail(I18n.t(\"vagrant.provisioners.shell.running\",\n                                      script: \"script: #{config.name}\"))\n            elsif config.path\n              @machine.ui.detail(I18n.t(\"vagrant.provisioners.shell.running\",\n                                      script: path.to_s))\n            else\n              @machine.ui.detail(I18n.t(\"vagrant.provisioners.shell.running\",\n                                      script: \"inline script\"))\n            end\n","sourceCodeStart":96,"sourceCodeEnd":132,"githubUrl":"https://github.com/hashicorp/vagrant/blob/35f3160f4ad6edc3a9f3aa9570adfc1a4d73aaa5/plugins/provisioners/shell/provisioner.rb#L96-L132","documentation":"The shell provisioner (POSIX path) must upload the script to the guest before running it. It wraps machine.ssh_info in retryable(on: SSHNotReady, tries: 3, sleep: 2) and raises Vagrant::Errors::SSHNotReady when ssh_info is still nil after three attempts — meaning the provider cannot yet report how to reach the machine over SSH.","triggerScenarios":"vagrant provision / vagrant up running the shell provisioner while the machine is not created, suspended, halted, or still booting; a provider (cloud or custom plugin) that returns nil from ssh_info; broken config.ssh settings or a guest without a running sshd.","commonSituations":"Provisioning too soon after vagrant up; boxes missing guest additions or sshd; wrong ssh username/port/key config; cloud VMs still initializing; machine actually in 'poweroff'/'not_created' state.","solutions":["Run vagrant status and confirm the machine reports 'running', then retry","Verify vagrant ssh connects without prompts before provisioning","Fix guest-side SSH: install/start sshd, correct config.ssh.username / private_key_path","For provider plugins, update them so ssh_info is populated before the provision action runs"],"exampleFix":"# before\nvagrant provision web   # machine still booting -> SSHNotReady\n\n# after\nvagrant up web && vagrant ssh web -c 'exit' && vagrant provision web","handlingStrategy":"retry","validationCode":"# programmatic drivers: require a running machine with ssh_info\nreturn unless machine.state.id == :running && !machine.ssh_info.nil?","typeGuard":"def ssh_ready?(machine)\n  machine.state.id == :running && !machine.ssh_info.nil?\nend","tryCatchPattern":"retries = 5\nbegin\n  machine.provision\nrescue Vagrant::Errors::SSHNotReady\n  retries -= 1\n  raise if retries.zero?\n  sleep 4\n  retry\nend","preventionTips":["Only provision machines whose vagrant status is 'running'","Use vagrant up (which waits for SSH) instead of provisioning half-booted machines","Verify vagrant ssh is passwordless before scripting provisions","For cloud/custom providers, confirm the plugin populates ssh_info"],"tags":["ssh","shell-provisioner","boot","provider","retry"],"backgroundTag":"ssh-not-ready","analyzedSha":"35f3160f4ad6edc3a9f3aa9570adfc1a4d73aaa5","analyzedAt":"2026-08-21T13:34:32.514Z","schemaVersion":2},"datasetVersion":"2026-08-21T18:17:14.833Z"}