Search code examples
chef-infravagrantchef-recipechef-solo

Playing with Vagrant and python recipe and I do not figure how I can use python_virtualenv


My Vagrantfile looks like this (some parts are missing):

Vagrant.configure("2") do |config|    
    # Provisioning
    config.vm.provision :chef_solo do |chef|
        chef.cookbooks_path = ["provisioning/chef/cookbooks"]
        chef.log_level = :debug
        chef.run_list = ["recipe[python]"]
    end
end

According to Opscode python recipe Readme, it is possible to install python package with a python_pip command and python virtualenvs with a python_virtualenv command. How Can I integrate them in my Vagrantfile?


Solution

  • The pip and virtualenv are already included as part of python's default recipe. By specifying recipe[python] you effectively loaded recipe recipe[python::default] which includes respective install method, pip and virtualenv.

    In order to use python_pip and python_virtualenv providers (as name suggest they provide the functionality) you just add them to your custom application recipe like suggested in cookbook's README file

    python_pip "gunicorn"
    
    python_virtualenv "/home/ubuntu/my_cool_ve" do
      owner "ubuntu"
      group "ubuntu"
      action :create
    end
    

    you need to create own cookbook/recipe. I would recommend to first understand the logic of the cookbooks, but if you want a kick start you can use something like

    cd to/your/cookbooks/directory
    mkdir mycookbook
    cd mycookbook
    mkdir recipes
    touch README.md
    cat >recipes/default.rb <<-EOF
    # create sample directory
    directory "/tmp/xx"
    
    python_pip "gunicorn"
    
    python_virtualenv "/home/ubuntu/my_cool_ve" do
      owner "ubuntu"
      group "ubuntu"
      action :create
    end
    
    EOF
    

    and add this cookbook to run list recipe[mycookbook].

        chef.run_list = ["recipe[python]", "recipe[mycookbook]"]
    

    Don't forget to check resources like Cookbooks and Getting started with Chef