通过远程服务器上的Vagrant托管服务器运行PuPHPet

通过远程服务器上的Vagrant托管服务器运行PuPHPet,vagrant,puppet,remote-server,vagrantfile,puphpet,Vagrant,Puppet,Remote Server,Vagrantfile,Puphpet,因此,我构建了一个VM,它可以很好地作为本地VM使用。我现在的目标是在我的prod服务器上使用相同的东西,这样我就不必自己编写所有的puppet内容,更重要的是,为dev和prod设置一个puppet,这样它们的设置就完全相同了。为了使用Vagrant管理远程服务器,我使用了这个插件:(我没有发布他们的问题,因为“问题”在我的Vagrant文件中的某个地方 这是/曾经是我用于测试的流浪者文件。它工作完美,但没有所有的傀儡内容。 流浪者档案: # -*- mode: ruby -*- # vi:

因此,我构建了一个VM,它可以很好地作为本地VM使用。我现在的目标是在我的prod服务器上使用相同的东西,这样我就不必自己编写所有的puppet内容,更重要的是,为dev和prod设置一个puppet,这样它们的设置就完全相同了。为了使用Vagrant管理远程服务器,我使用了这个插件:(我没有发布他们的问题,因为“问题”在我的Vagrant文件中的某个地方

这是/曾经是我用于测试的流浪者文件。它工作完美,但没有所有的傀儡内容。
流浪者档案:

# -*- mode: ruby -*-
# vi: set ft=ruby :

# current dir
dir = File.dirname(File.expand_path(__FILE__))

Vagrant.configure("2") do |config|
    #
    # local machine
    #
    # vagrant up dev
    # vagrant ssh dev
    #
    config.vm.define "dev", primary: true do |dev_config|
        dev_config.vm.box = "puphpet/ubuntu1404-x64"
        dev_config.vm.network :private_network, ip: "192.168.300.51"
    end
    #
    # remote machine
    #
    # vagrant up prod --provider=managed
    # vagrant ssh prod
    #
    config.vm.define "prod", autostart:false do |prod_config|
        prod_config.vm.box = "tknerr/managed-server-dummy"
        prod_config.vm.provider :managed do |managed_config, override|
            managed_config.server = "xxx.xxx.xxx.xxx"
            override.ssh.username = "user.name"
            override.ssh.private_key_path = "#{dir}/puphpet/files/dot/ssh/id_rsa"
            override.ssh.port = "2222"
        end
    end
end
C:\VirtualMachines\VagrantBoxes\APP01>vagrant provision
==> dev: VM not created. Moving on...
==> prod: Warning! The ManagedServers provider doesn't support any of the Vagrant
==> prod: high-level network configurations (`config.vm.network`). They
==> prod: will be silently ignored.
==> prod: Warning! Folder sync disabled because the rsync binary is missing.
==> prod: Make sure rsync is installed and the binary can be found in the PATH.
==> prod: Running provisioner: shell...
    prod: Running: C:/Users/Pascal/AppData/Local/Temp/vagrant-shell20141004-5396
-157lmpt.sh
==> prod: sudo: no tty present and no askpass program specified
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

chmod +x /tmp/vagrant-shell && /tmp/vagrant-shell /vagrant/puphpet

Stdout from the command:

Stderr from the command:

sudo: no tty present and no askpass program specified
然后我尝试将木偶添加到我的Vagrant文件中,结果发现这个怪物仍然能够连接到我的prod服务器,但不幸的是,“Vagrant provision”命令没有成功运行

怪物流浪者文件

# -*- mode: ruby -*-
# vi: set ft=ruby :

# load yaml for configs
require 'yaml'
# current dir
dir = File.dirname(File.expand_path(__FILE__))
# load config
configValues = YAML.load_file("#{dir}/puphpet/config.yaml")
data         = configValues['vagrantfile-local']

Vagrant.require_version '>= 1.6.0'

Vagrant.configure("2") do |master_config|
    #
    # local machine
    #
    # vagrant up dev
    # vagrant ssh dev
    #
    master_config.vm.define "dev", primary: true do |config|
      config.vm.box     = "#{data['vm']['box']}"
      config.vm.box_url = "#{data['vm']['box_url']}"

      if data['vm']['hostname'].to_s.strip.length != 0
        config.vm.hostname = "#{data['vm']['hostname']}"
      end

      if data['vm']['network']['private_network'].to_s != ''
        config.vm.network 'private_network', ip: "#{data['vm']['network']['private_network']}"
      end

      data['vm']['network']['forwarded_port'].each do |i, port|
        if port['guest'] != '' && port['host'] != ''
          config.vm.network :forwarded_port, guest: port['guest'].to_i, host: port['host'].to_i
        end
      end

      if !data['vm']['post_up_message'].nil?
        config.vm.post_up_message = "#{data['vm']['post_up_message']}"
      end

      if Vagrant.has_plugin?('vagrant-hostmanager')
        hosts = Array.new()

        if !configValues['apache']['install'].nil? &&
            configValues['apache']['install'].to_i == 1 &&
            configValues['apache']['vhosts'].is_a?(Hash)
          configValues['apache']['vhosts'].each do |i, vhost|
            hosts.push(vhost['servername'])

            if vhost['serveraliases'].is_a?(Array)
              vhost['serveraliases'].each do |vhost_alias|
                hosts.push(vhost_alias)
              end
            end
          end
        elsif !configValues['nginx']['install'].nil? &&
               configValues['nginx']['install'].to_i == 1 &&
               configValues['nginx']['vhosts'].is_a?(Hash)
          configValues['nginx']['vhosts'].each do |i, vhost|
            hosts.push(vhost['server_name'])

            if vhost['server_aliases'].is_a?(Array)
              vhost['server_aliases'].each do |x, vhost_alias|
                hosts.push(vhost_alias)
              end
            end
          end
        end

        if hosts.any?
          contents = File.open("#{dir}/puphpet/shell/ascii-art/hostmanager-notice.txt", 'r'){ |file| file.read }
          puts "\n\033[32m#{contents}\033[0m\n"

          if config.vm.hostname.to_s.strip.length == 0
            config.vm.hostname = 'puphpet-dev-machine'
          end

          config.hostmanager.enabled           = true
          config.hostmanager.manage_host       = true
          config.hostmanager.ignore_private_ip = false
          config.hostmanager.include_offline   = false
          config.hostmanager.aliases           = hosts
        end
      end

      if Vagrant.has_plugin?('vagrant-cachier')
        config.cache.scope = :box
      end

      config.vm.usable_port_range = (data['vm']['usable_port_range']['start'].to_i..data['vm']['usable_port_range']['stop'].to_i)

      if data['vm']['chosen_provider'].empty? || data['vm']['chosen_provider'] == 'virtualbox'
        ENV['VAGRANT_DEFAULT_PROVIDER'] = 'virtualbox'

        config.vm.provider :virtualbox do |virtualbox|
          data['vm']['provider']['virtualbox']['modifyvm'].each do |key, value|
            if key == 'memory'
              next
            end
            if key == 'cpus'
              next
            end

            if key == 'natdnshostresolver1'
              value = value ? 'on' : 'off'
            end

            virtualbox.customize ['modifyvm', :id, "--#{key}", "#{value}"]
          end

          virtualbox.customize ['modifyvm', :id, '--memory', "#{data['vm']['memory']}"]
          virtualbox.customize ['modifyvm', :id, '--cpus', "#{data['vm']['cpus']}"]

          if data['vm']['hostname'].to_s.strip.length != 0
            virtualbox.customize ['modifyvm', :id, '--name', config.vm.hostname]
          end
        end
      end

      if data['vm']['chosen_provider'] == 'vmware_fusion' || data['vm']['chosen_provider'] == 'vmware_workstation'
        ENV['VAGRANT_DEFAULT_PROVIDER'] = (data['vm']['chosen_provider'] == 'vmware_fusion') ? 'vmware_fusion' : 'vmware_workstation'

        config.vm.provider 'vmware_fusion' do |v|
          data['vm']['provider']['vmware'].each do |key, value|
            if key == 'memsize'
              next
            end
            if key == 'cpus'
              next
            end

            v.vmx["#{key}"] = "#{value}"
          end

          v.vmx['memsize']  = "#{data['vm']['memory']}"
          v.vmx['numvcpus'] = "#{data['vm']['cpus']}"

          if data['vm']['hostname'].to_s.strip.length != 0
            v.vmx['displayName'] = config.vm.hostname
          end
        end
      end

      if data['vm']['chosen_provider'] == 'parallels'
        ENV['VAGRANT_DEFAULT_PROVIDER'] = 'parallels'

        config.vm.provider 'parallels' do |v|
          data['vm']['provider']['parallels'].each do |key, value|
            if key == 'memsize'
              next
            end
            if key == 'cpus'
              next
            end

            v.customize ['set', :id, "--#{key}", "#{value}"]
          end

          v.memory = "#{data['vm']['memory']}"
          v.cpus   = "#{data['vm']['cpus']}"

          if data['vm']['hostname'].to_s.strip.length != 0
            v.name = config.vm.hostname
          end
        end
      end

      ssh_username = !data['ssh']['username'].nil? ? data['ssh']['username'] : 'vagrant'

      config.vm.provision 'shell' do |s|
        s.path = 'puphpet/shell/initial-setup.sh'
        s.args = '/vagrant/puphpet'
      end
      config.vm.provision 'shell' do |kg|
        kg.path = 'puphpet/shell/ssh-keygen.sh'
        kg.args = "#{ssh_username}"
      end
      config.vm.provision :shell, :path => 'puphpet/shell/install-ruby.sh'
      config.vm.provision :shell, :path => 'puphpet/shell/install-puppet.sh'

      config.vm.provision :puppet do |puppet|
        puppet.facter = {
          'ssh_username'     => "#{ssh_username}",
          'provisioner_type' => ENV['VAGRANT_DEFAULT_PROVIDER'],
          'vm_target_key'    => 'vagrantfile-local',
        }
        puppet.manifests_path = "#{data['vm']['provision']['puppet']['manifests_path']}"
        puppet.manifest_file  = "#{data['vm']['provision']['puppet']['manifest_file']}"
        puppet.module_path    = "#{data['vm']['provision']['puppet']['module_path']}"

        if !data['vm']['provision']['puppet']['options'].empty?
          puppet.options = data['vm']['provision']['puppet']['options']
        end
      end

      config.vm.provision :shell do |s|
        s.path = 'puphpet/shell/execute-files.sh'
        s.args = ['exec-once', 'exec-always']
      end
      config.vm.provision :shell, run: 'always' do |s|
        s.path = 'puphpet/shell/execute-files.sh'
        s.args = ['startup-once', 'startup-always']
      end
      config.vm.provision :shell, :path => 'puphpet/shell/important-notices.sh'

      if File.file?("#{dir}/puphpet/files/dot/ssh/id_rsa")
        config.ssh.private_key_path = [
          "#{dir}/puphpet/files/dot/ssh/id_rsa",
          "#{dir}/puphpet/files/dot/ssh/insecure_private_key"
        ]
      end

      if !data['ssh']['host'].nil?
        config.ssh.host = "#{data['ssh']['host']}"
      end
      if !data['ssh']['port'].nil?
        config.ssh.port = "#{data['ssh']['port']}"
      end
      if !data['ssh']['username'].nil?
        config.ssh.username = "#{data['ssh']['username']}"
      end
      if !data['ssh']['guest_port'].nil?
        config.ssh.guest_port = data['ssh']['guest_port']
      end
      if !data['ssh']['shell'].nil?
        config.ssh.shell = "#{data['ssh']['shell']}"
      end
      if !data['ssh']['keep_alive'].nil?
        config.ssh.keep_alive = data['ssh']['keep_alive']
      end
      if !data['ssh']['forward_agent'].nil?
        config.ssh.forward_agent = data['ssh']['forward_agent']
      end
      if !data['ssh']['forward_x11'].nil?
        config.ssh.forward_x11 = data['ssh']['forward_x11']
      end
      if !data['vagrant']['host'].nil?
        config.vagrant.host = data['vagrant']['host'].gsub(':', '').intern
      end
    end
    #
    # remote machine
    #
    # vagrant up prod --provider=managed
    # vagrant ssh prod
    #
    master_config.vm.define "prod", autostart:false do |prod_config|
        prod_config.vm.box = "tknerr/managed-server-dummy"
        prod_config.vm.provider :managed do |managed_config, override|
            managed_config.server = "xxx.xxx.xxx.xxx"
            override.ssh.username = "user.name"
            override.ssh.private_key_path = "#{dir}/puphpet/files/dot/ssh/id_rsa"
            override.ssh.port = "2222"
        end

        if Vagrant.has_plugin?('vagrant-hostmanager')
            hosts = Array.new()

            if !configValues['apache']['install'].nil? &&
                configValues['apache']['install'].to_i == 1 &&
                configValues['apache']['vhosts'].is_a?(Hash)
              configValues['apache']['vhosts'].each do |i, vhost|
                hosts.push(vhost['servername'])

                if vhost['serveraliases'].is_a?(Array)
                  vhost['serveraliases'].each do |vhost_alias|
                    hosts.push(vhost_alias)
                  end
                end
              end
            elsif !configValues['nginx']['install'].nil? &&
                   configValues['nginx']['install'].to_i == 1 &&
                   configValues['nginx']['vhosts'].is_a?(Hash)
              configValues['nginx']['vhosts'].each do |i, vhost|
                hosts.push(vhost['server_name'])

                if vhost['server_aliases'].is_a?(Array)
                  vhost['server_aliases'].each do |x, vhost_alias|
                    hosts.push(vhost_alias)
                  end
                end
              end
            end

            if hosts.any?
              contents = File.open("#{dir}/puphpet/shell/ascii-art/hostmanager-notice.txt", 'r'){ |file| file.read }
              puts "\n\033[32m#{contents}\033[0m\n"

              prod_config.hostmanager.enabled           = true
              prod_config.hostmanager.manage_host       = true
              prod_config.hostmanager.ignore_private_ip = false
              prod_config.hostmanager.include_offline   = false
              prod_config.hostmanager.aliases           = hosts
            end
          end

          if Vagrant.has_plugin?('vagrant-cachier')
            prod_config.cache.scope = :box
          end

          prod_config.vm.provision 'shell' do |s|
            s.path = 'puphpet/shell/initial-setup.sh'
            s.args = '/vagrant/puphpet'
          end
          prod_config.vm.provision 'shell' do |kg|
            kg.path = 'puphpet/shell/ssh-keygen.sh'
            kg.args = "user.name"
          end
          prod_config.vm.provision :shell, :path => 'puphpet/shell/install-ruby.sh'
          prod_config.vm.provision :shell, :path => 'puphpet/shell/install-puppet.sh'

          prod_config.vm.provision :puppet do |puppet|
            puppet.facter = {
              'ssh_username'     => "user.name",
              'provisioner_type' => "managed",
            }
            puppet.manifests_path = "#{data['vm']['provision']['puppet']['manifests_path']}"
            puppet.manifest_file  = "#{data['vm']['provision']['puppet']['manifest_file']}"
            puppet.module_path    = "#{data['vm']['provision']['puppet']['module_path']}"

            if !data['vm']['provision']['puppet']['options'].empty?
              puppet.options = data['vm']['provision']['puppet']['options']
            end
          end

          prod_config.vm.provision :shell do |s|
            s.path = 'puphpet/shell/execute-files.sh'
            s.args = ['exec-once', 'exec-always']
          end
          prod_config.vm.provision :shell, run: 'always' do |s|
            s.path = 'puphpet/shell/execute-files.sh'
            s.args = ['startup-once', 'startup-always']
          end
          prod_config.vm.provision :shell, :path => 'puphpet/shell/important-notices.sh'
    end
end
命令行输出:

# -*- mode: ruby -*-
# vi: set ft=ruby :

# current dir
dir = File.dirname(File.expand_path(__FILE__))

Vagrant.configure("2") do |config|
    #
    # local machine
    #
    # vagrant up dev
    # vagrant ssh dev
    #
    config.vm.define "dev", primary: true do |dev_config|
        dev_config.vm.box = "puphpet/ubuntu1404-x64"
        dev_config.vm.network :private_network, ip: "192.168.300.51"
    end
    #
    # remote machine
    #
    # vagrant up prod --provider=managed
    # vagrant ssh prod
    #
    config.vm.define "prod", autostart:false do |prod_config|
        prod_config.vm.box = "tknerr/managed-server-dummy"
        prod_config.vm.provider :managed do |managed_config, override|
            managed_config.server = "xxx.xxx.xxx.xxx"
            override.ssh.username = "user.name"
            override.ssh.private_key_path = "#{dir}/puphpet/files/dot/ssh/id_rsa"
            override.ssh.port = "2222"
        end
    end
end
C:\VirtualMachines\VagrantBoxes\APP01>vagrant provision
==> dev: VM not created. Moving on...
==> prod: Warning! The ManagedServers provider doesn't support any of the Vagrant
==> prod: high-level network configurations (`config.vm.network`). They
==> prod: will be silently ignored.
==> prod: Warning! Folder sync disabled because the rsync binary is missing.
==> prod: Make sure rsync is installed and the binary can be found in the PATH.
==> prod: Running provisioner: shell...
    prod: Running: C:/Users/Pascal/AppData/Local/Temp/vagrant-shell20141004-5396
-157lmpt.sh
==> prod: sudo: no tty present and no askpass program specified
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

chmod +x /tmp/vagrant-shell && /tmp/vagrant-shell /vagrant/puphpet

Stdout from the command:

Stderr from the command:

sudo: no tty present and no askpass program specified
据我所知,问题在于,当vagrant在远程服务器上时,它不能像在虚拟机上那样创建共享文件夹。因此,它无法访问傀儡文件并中断

我的问题:有没有一种方法可以让Puppet在本地运行并将命令发送到服务器(使用ssh),或者我可以将Puppet文件复制到服务器上(不干燥,我知道,但之后我会使用git将其置于版本控制之下,并在本地机器和远程机器上使用)?有人对这样的设置感兴趣吗(还是更好的解决方案)


编辑:如果这有帮助:我的本地机器运行Windows,但虚拟机是Ubuntu 14.04,在远程机器上也是Ubuntu 14.04。我使用的是最新版本的vagrant。

根据我的经验,输出的
sudo:no tty present和no askpass程序都没有指定
告诉我 该sudoeruser.name应提供密码

我们需要

无密码Sudo

这很重要!除了默认的SSH之外,Vagrant的许多方面都很重要 用户需要配置无密码sudo。这允许Vagrant配置 网络、装载同步文件夹、安装软件等

首先,一些最小的操作系统安装甚至不需要 默认情况下包括sudo。请验证是否以某种方式安装了sudo

安装sudo后,配置它(通常使用visudo)以允许 “流浪”用户的无密码sudo。这可以通过 配置文件末尾的以下行:

vagrant ALL=(ALL)NOPASSWD:ALL

此外,Vagrant在以下情况下默认不使用pty或tty: 通过SSH连接。您需要确保没有已连接的线路 它的要求。删除它,如果它存在。这允许sudo工作 请注意,您可以将Vagrant配置为请求 一个pty,它允许您保留此配置。但默认情况下为Vagrant 他不会这么做的

对于Ubuntu,配置文件是
/etc/sudoers
,您应该更改

流浪者全部=(全部)无通行证:全部

user.nameALL=(ALL)NOPASSWD:ALL