0
votes

I am using vagrant and chef to build a VM.

Host: OSX 10.9.5
audrey:ubuntu2 jluc$ chef -v
Chef Development Kit Version: 0.10.0
chef-client version: 12.5.1
berks version: 4.0.1
kitchen version: 1.4.2

audrey:ubuntu2 jluc$ vagrant -v
Vagrant 1.8.1
audrey:ubuntu2 jluc$ vagrant plugin list
vagrant-berkshelf (4.1.0)
vagrant-omnibus (1.4.1)
vagrant-share (1.1.5, system)

Virtualbox: 5, but same on 4 previously.

Guest: Ubuntu 14.04

Background: I am using alien to install Oracle rpm. However, you can't just point the client to a url or package somewhere, you need to download the rpms from Oracle, accept conditions and then make the files available to your client install. There are 2 rpms, one 30MB, one 640KB.

I am doing this by launching a http server on the host, on port 9003.

Problem:

The download/remote_file time, within the chef run, is anywhere from 5-20 minutes, while I can wget/curl them from within the guest in 5-15 seconds.

Details:

The following chef code deals with those files:

ip = node[:network][:default_gateway]

simplehttp_port=node[:basedjango][:port_host_fileserver]
fn_basic = "oracle-instantclient12.1-basiclite-12.1.0.2.0-1.x86_64.rpm"

execute 'download_basic' do
  cwd "/tmp"
  command "wget  http://#{ip}:#{simplehttp_port}/#{fn_basic} "
  not_if do ::File.exists?(fnp_basic) end
end

#I have also used this instead, just as slow...
remote_file fnp_basic do

  uri = "http://#{ip}:#{simplehttp_port}/#{fn_basic}"

  not_if do ::File.exists?(fnp_basic) end

  mode '0755'
  action :create
end

My problem is that I can vagrant ssh into the guest and wget or curl the file in anything from 5 to 15 seconds. From the chef cookbooks, I am looking at 5-20 minutes each time (there is a condition guard to avoid downloading it if it exists).

==> default: [2016-01-18T11:13:58-08:00] INFO: file[/etc/profile.d/ORACLE_HOME.sh] mode changed to 755
==> default:       
==> default: - change mode from '' to '0755'
==> default:       
==> default: - change owner from '' to 'root'
==> default:       
==> default: - change group from '' to 'root'
==> default:     
==> default:  (up to date)
==> default: Recipe: basedjango::oracle
==> default:   
==> default: * execute[download_basic] action run

!!! 11:13 to 11:28 => 15 minutes here.

==> default: [2016-01-18T11:28:04-08:00] INFO: 

execute[download_basic] ran successfully
==> default:     
==> default: - execute wget  http://10.0.2.2:9003/oracle-instantclient12.1-basiclite-12.1.0.2.0-1.x86_64.rpm 
==> default:   * execute[install_basic] action run

And here is the same command, executed manually via vagrant ssh. About 2 seconds in this case.

vagrant@vagrant:/tmp$ wget  http://10.0.2.2:9003/oracle-instantclient12.1-basiclite-12.1.0.2.0-1.x86_64.rpm
--2016-01-18 11:50:40--  http://10.0.2.2:9003/oracle-instantclient12.1-basiclite-12.1.0.2.0-1.x86_64.rpm
Connecting to 10.0.2.2:9003... connected.
HTTP request sent, awaiting response... 200 OK
Length: 30940809 (30M) [text/html]
Saving to: ‘oracle-instantclient12.1-basiclite-12.1.0.2.0-1.x86_64.rpm’

100%[====================================================================================================================================================================================>] 30,940,809  17.8MB/s   in 1.7s

2016-01-18 11:50:41 (17.8 MB/s) - ‘oracle-instantclient12.1-basiclite-12.1.0.2.0-1.x86_64.rpm’ saved [30940809/30940809]

The remote_file resource behaves the same way, so at first I thought it was something wrong with it or the way I use it. The rpms are NOT being served from the Vagrant shared directory, btw.

Any ideas?

1
Have you tried storing them in the cookbook and using a cookbook_file? Not a great solution in most cases, but will probably be faster here. - coderanger
No, I haven't. I could also leave them in the vagrant share directory and access them that way. But I am really curious why grabbing these files takes so long in the first place. - JL Peyret
If I had to guess, they might be routing via different virtual network devices between the host and guest. - coderanger
you mean, that the guest download would use different virtual devices within a chef execution context vs from a bash shell? certainly, the file download/access time within chef is quite acceptable for really remote files, for example when apt-get fetches packages. Only my host files end up being a disaster. - JL Peyret
what you say makes sense, but how would I check/control the above? - JL Peyret

1 Answers

-1
votes

I don't know if you haven't already found a solution, but when I had that issue (even downloading from another server) I could 'fix' it by enabling debug output for chef. This magically increased the download speed.

Simply put

config.vm.provion :chef_solo |chef|
  chef.log_level = 'debug'
  [...]
end