ChefのCookBookで、virtualenvを使えるようにする

poise/python · GitHub を使ってPython環境を作ると、自作のCookBookでpipやvirtualenvが使えるようになります。

poise/python · GitHub で は、Pythonのインストール、pipのインストール、virtualenvのインストールを行います。

インストールする場合はbuild-essentialが必要になります。
また、Redhat系の環境にパッケージでインストールするの場合はyumも必要になります。

インストール方法

recipesのdefault.rbを見ると、他のrecipeをincludeしているので、特に何も指定しなくてもpythonのインストール、pipのインストール、virtualenvのインストールが実行されることがわかります。

include_recipe "python::#{node['python']['install_method']}"
include_recipe "python::pip"
include_recipe "python::virtualenv"

パッケージインストールの場合は、run_listにpythonを追加するだけです。 chef-soloだったら、/tmp/vagrant-chef-1/dna.jsonなどに設定。

{
  "run_list" : [
    "recipe[python]"
  ]
}

ソースコードからインストールする場合には、environmentなどに、install_methodとversionを指定します(他にもcheck_sumなども指定できます)。 以下はchef-soloでの設定例です。

{
  "python" : {
    "install_method" : "source",
    "version" : "2.7.5"
  },
  "run_list": [
    "recipe[python]"
  ]
}

ソースコードからインストールする場合には、versionはソースコードを取得する先もある程度指定できます。

remote_file "#{Chef::Config[:file_cache_path]}/Python-#{version}.tar.bz2" do
  source "#{node['python']['url']}/#{version}/Python-#{version}.tar.bz2"
  checksum node['python']['checksum']
  mode "0644"
  not_if { ::File.exists?(install_path) }
end

recipes/source.rb を確認するとわかりますが、拡張子(.tar.bz2)の部分が固定なので、tar.bz2が無い場合にはエラーになってしまうので注意が必要です。
2.7.6は拡張子(.tar.bz2)のものが無いので、現時点ではエラーになりました。

pipやvirtualenvの使い方

pipの使い方は、virtualenvのrecipeを見ればわかるかと思います。

python_pip "virtualenv" do
  action :install
end

virtualenvとpipを使ってFlaskをインストールには、次のようなレシピを作って実行すればOKです。

include_recipe "python::pip"
include_recipe "python::virtualenv"

python_virtualenv "/home/vagrant/apps" do
  action :create
  owner "vagrant"
  group "vagrant"
end

python_pip "Flask" do
  action :install
  virtualenv "/home/vagrant/apps"
end

確認してみると、インストールされていることがわかります。

vagrant@vagrant-ubuntu:~$source ./apps/bin/activate
(apps)vagrant@vagrant-ubuntu:~$ pip list
argparse (1.2.1)
Flask (0.10.1)
itsdangerous (0.23)
Jinja2 (2.7.1)
MarkupSafe (0.18)
pip (1.4.1)
setuptools (0.9.8)
Werkzeug (0.9.4)
wsgiref (0.1.2)