1

そこで、ローカル VM として正常に動作するhttp://puphpet.com/を使用して VM を構築しました。私の現在の目標は、本番サーバーで同じものを使用することです。そのため、すべてのパペットを自分で作成する必要はありません。さらに重要なのは、開発用と本番用に 1 つのパペットをセットアップして、それらが実際に等しくセットアップされるようにすることです。Vagrant でリモート サーバーを管理するには、次のプラグインを使用します: https://github.com/tknerr/vagrant-managed-servers

これは、テスト用の私の Vagrant ファイルです。それは完璧に機能しますが、Puppet のものはすべてありません。
放浪者ファイル:

# -*- 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 ファイルに追加しようとしたところ、このモンスターになってしまいました。これはまだ製品サーバーに接続できますが、残念ながら「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 がリモート サーバー上にあるときに VM の場合のように共有フォルダーを作成できないことです。そのため、Puppet ファイルに到達できず、壊れます。

私の質問: Puppet にローカルで実行させ、(ssh を使用して) コマンドをサーバーに送信する方法はありますか、または Puppet ファイルをサーバーにコピーするだけでよいでしょうか (DRY ではなく、わかっていますが、それらを配置するだけです) git を使用してバージョン管理し、ローカル マシンとリモートでそれらを使用します)? このような設定(またはより良い解決策)を経験した人はいますか?

編集: これが役立つ場合: 私のローカル マシンは Windows を実行していますが、VM は Ubuntu 14.04 であり、リモート マシンでも Ubuntu 14.04 が実行されています。im最新バージョンのvagrantを使用しています。

4

1 に答える 1

2

私の経験では、出力sudo: no tty present and no askpass program specifiedは sudoer user.nameがパスワードを提供する必要があることを示しています。

必要です

パスワードなしの須藤

これは重要!。Vagrant の多くの側面は、デフォルトの SSH ユーザーにパスワードなしの sudo が設定されていることを期待しています。これにより、Vagrant はネットワークの構成、同期フォルダーのマウント、ソフトウェアのインストールなどを行うことができます。

まず、オペレーティング システムの一部の最小インストールには、デフォルトで sudo が含まれていません。何らかの方法で sudo をインストールしたことを確認します。

sudo をインストールしたら、「vagrant」ユーザーにパスワードなしの sudo を許可するように (通常は visudo を使用して) 構成します。これは、構成ファイルの最後にある次の行で実行できます。

vagrant ALL=(ALL) NOPASSWD: ALL

さらに、Vagrant は、SSH 経由で接続されている場合、デフォルトで pty または tty を使用しません。requiretty を含む行がないことを確認する必要があります。存在する場合は削除します。これにより、sudo は tty なしで適切に機能します。Vagrant を構成して pty を要求できることに注意してください。これにより、この構成を維持できます。しかし、Vagrant はデフォルトではこれを行いません。

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

Ubuntuの場合、構成ファイルは/etc/sudoers変更する必要があります

vagrant ALL=(ALL) NOPASSWD: ALL

user.name ALL=(ALL) NOPASSWD: ALL

于 2014-10-12T17:26:45.487 に答える