【问题标题】:Run PuPHPet through Vagrant managed server on a remote server在远程服务器上通过 Vagrant 托管服务器运行 PuPHPet
【发布时间】:2014-10-04 10:29:47
【问题描述】:

所以我使用http://puphpet.com/ 构建了一个虚拟机,它可以作为本地虚拟机正常工作。我现在的目标是在我的 prod 服务器上使用相同的东西,这样我就不必自己编写所有 puppet 的东西,更重要的是为 dev 和 prod 设置一个 puppet,这样它们就可以真正平等地设置。要使用 Vagrant 管理远程服务器,我使用这个插件:https://github.com/tknerr/vagrant-managed-servers(我没有在他们的问题中发布,因为“问题”在我的 Vagrantfile 中。

这是/曾经是我用于测试的 Vagrant 文件。它运行完美,但没有 Puppet 的所有内容。
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

然后我尝试将 Puppet 的东西添加到我的 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

命令行输出:

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 文件并中断。

我的问题:有没有办法让 Puppet 在本地运行并将命令发送到服务器(使用 ssh),或者我可以将 Puppet 文件复制到服务器(不是 DRY,我知道但我会只需使用 git 将它们置于版本控制之下,然后在我的本地机器和远程机器上使用它们)?有没有人体验过这样的设置(或更好的解决方案)?

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

【问题讨论】:

    标签: vagrant puppet remote-server vagrantfile puphpet


    【解决方案1】:

    根据我的经验,输出 sudo: no tty present and no askpass program specified 告诉我 sudoer user.name 应该提供密码。

    我们需要

    无密码须藤

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

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

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

    vagrant ALL=(ALL) NOPASSWD: ALL

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

    https://docs.vagrantup.com/v2/boxes/base.html

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

    vagrant ALL=(ALL) NOPASSWD: ALL

    用户名 ALL=(ALL) NOPASSWD: ALL

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-27
      • 2013-05-26
      • 1970-01-01
      • 1970-01-01
      • 2016-11-27
      • 1970-01-01
      • 1970-01-01
      • 2017-10-20
      相关资源
      最近更新 更多