Search code examples
vagrantparallels

Error: $cron_values is false, not a hash or array


Vagrant installs and starts the Centos 6.6 VM up correctly, but fails to provision it with this error message:

Error: $cron_values is false, not a hash or array at /tmp/vagrant-puppet/manifests-893fcda21077f5a583c2dbbba8515c0a/nodes/Cron.pp:3 on node localhost.localdomain

Just before that this was displayed:

==> default: Running provisioner: puppet... ==> default: Running Puppet with site.pp... ==> default: Info: Loading facts in /tmp/vagrant-puppet/modules-419a158586c48436c8f5c2349fe39c11/composer/lib/facter/composer_home.rb ==> default: Info: Loading facts in /tmp/vagrant-puppet/modules-419a158586c48436c8f5c2349fe39c11/concat/lib/facter/concat_basedir.rb ==> default: Info: Loading facts in /tmp/vagrant-puppet/modules-419a158586c48436c8f5c2349fe39c11/firewall/lib/facter/ip6tables_version.rb ==> default: Info: Loading facts in /tmp/vagrant-puppet/modules-419a158586c48436c8f5c2349fe39c11/firewall/lib/facter/iptables_persistent_version.rb ==> default: Info: Loading facts in /tmp/vagrant-puppet/modules-419a158586c48436c8f5c2349fe39c11/firewall/lib/facter/iptables_version.rb ==> default: Info: Loading facts in /tmp/vagrant-puppet/modules-419a158586c48436c8f5c2349fe39c11/git/lib/facter/git_exec_path.rb ==> default: Info: Loading facts in /tmp/vagrant-puppet/modules-419a158586c48436c8f5c2349fe39c11/git/lib/facter/git_version.rb ==> default: Info: Loading facts in /tmp/vagrant-puppet/modules-419a158586c48436c8f5c2349fe39c11/php/lib/facter/php_fact_extension_dir.rb ==> default: Info: Loading facts in /tmp/vagrant-puppet/modules-419a158586c48436c8f5c2349fe39c11/php/lib/facter/php_fact_version.rb ==> default: Info: Loading facts in /tmp/vagrant-puppet/modules-419a158586c48436c8f5c2349fe39c11/puppi/lib/facter/last_run.rb ==> default: Info: Loading facts in /tmp/vagrant-puppet/modules-419a158586c48436c8f5c2349fe39c11/puppi/lib/facter/puppi_projects.rb ==> default: Info: Loading facts in /tmp/vagrant-puppet/modules-419a158586c48436c8f5c2349fe39c11/puppi/lib/facter/windows_common_appdata.rb ==> default: Info: Loading facts in /tmp/vagrant-puppet/modules-419a158586c48436c8f5c2349fe39c11/rabbitmq/lib/facter/rabbitmq_erlang_cookie.rb ==> default: Info: Loading facts in /tmp/vagrant-puppet/modules-419a158586c48436c8f5c2349fe39c11/rvm/lib/facter/rvm_installed.rb ==> default: Info: Loading facts in /tmp/vagrant-puppet/modules-419a158586c48436c8f5c2349fe39c11/rvm/lib/facter/rvm_version.rb ==> default: Info: Loading facts in /tmp/vagrant-puppet/modules-419a158586c48436c8f5c2349fe39c11/staging/lib/facter/staging_http_get.rb ==> default: Info: Loading facts in /tmp/vagrant-puppet/modules-419a158586c48436c8f5c2349fe39c11/staging/lib/facter/staging_windir.rb ==> default: Info: Loading facts in /tmp/vagrant-puppet/modules-419a158586c48436c8f5c2349fe39c11/stdlib/lib/facter/facter_dot_d.rb ==> default: Info: Loading facts in /tmp/vagrant-puppet/modules-419a158586c48436c8f5c2349fe39c11/stdlib/lib/facter/pe_version.rb ==> default: Info: Loading facts in /tmp/vagrant-puppet/modules-419a158586c48436c8f5c2349fe39c11/stdlib/lib/facter/puppet_vardir.rb ==> default: Info: Loading facts in /tmp/vagrant-puppet/modules-419a158586c48436c8f5c2349fe39c11/stdlib/lib/facter/root_home.rb

Honestly, I'm not sure where to even look for the problem. I can SSH into the VM and that part seems to work correctly. Apache doesn't seem to be installed yet as the host does not resolve.

I'm also not sure if there is more information that could be of benefit? If so, I am more than happy to provide it. There does not seem to be very many people at all who have experienced this problem. Even if you don't know the solution, I'd be grateful if you could at least provide some direction on where to look for perhaps a more verbose log (I ran vagrant provision --debug but the error logs didn't make much more sense there), or something that could get me started?

I am running this machine with Parallels as the provider.

Any ideas?

Update:

The VagrantFile is generated by puppet (or really PuPHPet). Here is the config.yaml file:

vagrantfile-local:
    vm:
        box: puphpet/centos65-x64
        box_url: puphpet/centos65-x64
        hostname: ''
        memory: '512'
        cpus: '1'
        chosen_provider: parallels
        network:
            private_network: 192.168.58.101
            forwarded_port:
                48IqH2aTQkz4:
                    host: '9321'
                    guest: '22'
        post_up_message: ''
        provider:
            virtualbox:
                modifyvm:
                    natdnshostresolver1: on
            vmware:
                numvcpus: 1
            parallels:
                cpus: 1
        provision:
            puppet:
                manifests_path: puphpet/puppet
                manifest_file: site.pp
                module_path: puphpet/puppet/modules
                options:
                    - '--verbose'
                    - '--hiera_config /vagrant/puphpet/puppet/hiera.yaml'
                    - '--parser future'
        synced_folder:
            jzVfnoa6cO3T:
                owner: ''
                group: ''
                source: ./
                target: /Users/myname/Sites/website/
                sync_type: nfs
                rsync:
                    auto: 'false'
        usable_port_range:
            start: 10200
            stop: 10500
    ssh:
        host: null
        port: null
        private_key_path: null
        username: vagrant
        guest_port: null
        keep_alive: true
        forward_agent: false
        forward_x11: false
        shell: 'bash -l'
    vagrant:
        host: detect
server:
    install: '1'
    packages:
        - ImageMagick
        - vim-common
        - php-soap
firewall:
    install: '1'
    rules: null
apache:
    install: '1'
    settings:
        user: www-data
        group: www-data
        default_vhost: true
        manage_user: false
        manage_group: false
        sendfile: 0
    modules:
        - rewrite
    vhosts:
        MvR5v9C4Vsuh:
            servername: myserver.mag
            serveraliases:
                - www.awesome.dev
            docroot: /Users/myname/Sites/sitename/base/
            port: '80'
            setenv:
                - 'APP_ENV dev'
            override:
                - All
            options:
                - Indexes
                - FollowSymLinks
                - MultiViews
            engine: ''
            custom_fragment: ''
            ssl_cert: ''
            ssl_key: ''
            ssl_chain: ''
            ssl_certs_dir: ''
    mod_pagespeed: 0
php:
    install: '1'
    version: '55'
    composer: '1'
    composer_home: ''
    modules:
        php:
            - cli
            - intl
            - mcrypt
        pear: {  }
        pecl:
            - pecl_http
            - imagick
    ini:
        display_errors: On
        error_reporting: '-1'
        session.save_path: /var/lib/php/session
    timezone: America/Chicago
    mod_php: 0
xdebug:
    install: '1'
    settings:
        xdebug.default_enable: '1'
        xdebug.remote_autostart: '0'
        xdebug.remote_connect_back: '1'
        xdebug.remote_enable: '1'
        xdebug.remote_handler: dbgp
        xdebug.remote_port: '9000'
ruby:
    install: '1'
    versions: {  }
nodejs:
    install: '0'
    npm_packages: {  }
python:
    install: '1'
    packages: {  }
    versions: {  }
mysql:
    install: '1'
    override_options: {  }
    root_password: root
    adminer: 0
    databases:
        ouWYyTlD0olg:
            grant:
                - ALL
            name: db_name
            host: localhost
            user: user_name
            password: password
            sql_file: ../databases/output.sql
redis:
    install: '1'
    settings:
        conf_port: '6379'

VagrantFile:

require 'yaml'

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

configValues = YAML.load_file("#{dir}/puphpet/config.yaml")
data         = configValues['vagrantfile-local']

Vagrant.require_version '>= 1.6.0'

Vagrant.configure('2') 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?
      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

  data['vm']['synced_folder'].each do |i, folder|
    if folder['source'] != '' && folder['target'] != ''
      sync_owner = !folder['sync_owner'].nil? ? folder['sync_owner'] : 'www-data'
      sync_group = !folder['sync_group'].nil? ? folder['sync_group'] : 'www-data'

      if folder['sync_type'] == 'nfs'
        config.vm.synced_folder "#{folder['source']}", "#{folder['target']}", id: "#{i}", type: 'nfs'
        if Vagrant.has_plugin?('vagrant-bindfs')
          config.bindfs.bind_folder "#{folder['target']}", "/mnt/vagrant-#{i}"
        end
      elsif folder['sync_type'] == 'smb'
        config.vm.synced_folder "#{folder['source']}", "#{folder['target']}", id: "#{i}", type: 'smb'
      elsif folder['sync_type'] == 'rsync'
        rsync_args = !folder['rsync']['args'].nil? ? folder['rsync']['args'] : ['--verbose', '--archive', '-z']
        rsync_auto = !folder['rsync']['auto'].nil? ? folder['rsync']['auto'] : true
        rsync_exclude = !folder['rsync']['exclude'].nil? ? folder['rsync']['exclude'] : ['.vagrant/']

        config.vm.synced_folder "#{folder['source']}", "#{folder['target']}", id: "#{i}",
          rsync__args: rsync_args, rsync__exclude: rsync_exclude, rsync__auto: rsync_auto, type: 'rsync', group: sync_group, owner: sync_owner
      elsif data['vm']['chosen_provider'] == 'parallels'
        config.vm.synced_folder "#{folder['source']}", "#{folder['target']}", id: "#{i}",
          group: sync_group, owner: sync_owner, mount_options: ['share']
      else
        config.vm.synced_folder "#{folder['source']}", "#{folder['target']}", id: "#{i}",
          group: sync_group, owner: sync_owner, mount_options: ['dmode=775', 'fmode=764']
      end
    end
  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']['provider']['virtualbox']['modifyvm']['name'].nil? ||
        data['vm']['provider']['virtualbox']['modifyvm']['name'].empty?
        if data['vm']['hostname'].to_s.strip.length != 0
          virtualbox.customize ['modifyvm', :id, '--name', config.vm.hostname]
        end
      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, override|
      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']['provider']['vmware']['displayName'].nil? ||
        data['vm']['provider']['vmware']['displayName'].empty?
        if data['vm']['hostname'].to_s.strip.length != 0
          v.vmx['displayName'] = config.vm.hostname
        end
      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']['provider']['parallels']['name'].nil? ||
        data['vm']['provider']['parallels']['name'].empty?
        if data['vm']['hostname'].to_s.strip.length != 0
          v.name = config.vm.hostname
        end
      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'

  customKey  = "#{dir}/files/dot/ssh/id_rsa"
  vagrantKey = "#{dir}/.vagrant/machines/default/#{ENV['VAGRANT_DEFAULT_PROVIDER']}/private_key"

  if File.file?(customKey)
    config.ssh.private_key_path = [
      customKey,
      "#{ENV['HOME']}/.vagrant.d/insecure_private_key"
    ]

    if File.file?(vagrantKey) and ! FileUtils.compare_file(customKey, vagrantKey)
      File.delete(vagrantKey)
    end

    if ! File.directory?(File.dirname(vagrantKey))
      FileUtils.mkdir_p(File.dirname(vagrantKey))
    end

    if ! File.file?(vagrantKey)
      FileUtils.cp(customKey, vagrantKey)
    end
  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

Solution

  • I recently came across this problem myself and here is how I fixed it. When you create a Puphpet config file, and do not specify any cron jobs, this error is created.

    To fix it make your cron key in config.yaml look like one of these:

    Option #1 (for kicking off the Magento cron job):

    cron:
        install: '1'
        jobs:
            cj_lfgowfjsb51y:
                name: magento
                user: ''
                command: '/bin/sh /var/www/sites/cron.sh'
                minute: '*/5'
                hour: '*'
                weekday: '*'
                month: '*'
                monthday: ''
    

    Option #2

    cron:
        install:'1'
        jobs: []