virtualenv.pp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. # == Define: python::virtualenv
  2. #
  3. # Creates Python virtualenv.
  4. #
  5. # === Parameters
  6. #
  7. # [*ensure*]
  8. # present|absent. Default: present
  9. #
  10. # [*version*]
  11. # Python version to use. Default: system default
  12. #
  13. # [*requirements*]
  14. # Path to pip requirements.txt file. Default: none
  15. #
  16. # [*systempkgs*]
  17. # Copy system site-packages into virtualenv. Default: don't
  18. #
  19. # [*distribute*]
  20. # Include distribute in the virtualenv. Default: true
  21. #
  22. # [*index*]
  23. # Base URL of Python package index. Default: none (http://pypi.python.org/simple/)
  24. #
  25. # [*owner*]
  26. # The owner of the virtualenv being manipulated. Default: root
  27. #
  28. # [*group*]
  29. # The group relating to the virtualenv being manipulated. Default: root
  30. #
  31. # [*proxy*]
  32. # Proxy server to use for outbound connections. Default: none
  33. #
  34. # [*environment*]
  35. # Additional environment variables required to install the packages. Default: none
  36. #
  37. # === Examples
  38. #
  39. # python::virtualenv { '/var/www/project1':
  40. # ensure => present,
  41. # version => 'system',
  42. # requirements => '/var/www/project1/requirements.txt',
  43. # proxy => 'http://proxy.domain.com:3128',
  44. # systempkgs => true,
  45. # index => 'http://www.example.com/simple/'
  46. # }
  47. #
  48. # === Authors
  49. #
  50. # Sergey Stankevich
  51. # Ashley Penney
  52. # Marc Fournier
  53. # Fotis Gimian
  54. #
  55. define python::virtualenv (
  56. $ensure = present,
  57. $version = 'system',
  58. $requirements = false,
  59. $systempkgs = false,
  60. $distribute = true,
  61. $index = false,
  62. $owner = 'root',
  63. $group = 'root',
  64. $proxy = false,
  65. $environment = []
  66. ) {
  67. $venv_dir = $name
  68. if $ensure == 'present' {
  69. $python = $version ? {
  70. 'system' => 'python',
  71. default => "python${version}",
  72. }
  73. $proxy_flag = $proxy ? {
  74. false => '',
  75. default => "--proxy=${proxy}",
  76. }
  77. $proxy_command = $proxy ? {
  78. false => '',
  79. default => "&& export http_proxy=${proxy}",
  80. }
  81. $system_pkgs_flag = $systempkgs ? {
  82. false => '',
  83. default => '--system-site-packages',
  84. }
  85. $distribute_pkg = $distribute ? {
  86. true => 'distribute',
  87. default => '',
  88. }
  89. $pypi_index = $index ? {
  90. false => '',
  91. default => "-i ${index}",
  92. }
  93. exec { "python_virtualenv_${venv_dir}":
  94. command => "mkdir -p ${venv_dir} ${proxy_command} && virtualenv ${system_pkgs_flag} ${venv_dir} && ${venv_dir}/bin/pip --log-file ${venv_dir}/pip.log install ${pypi_index} ${proxy_flag} --upgrade pip ${distribute_pkg}",
  95. user => $owner,
  96. creates => "${venv_dir}/bin/activate",
  97. path => [ '/bin', '/usr/bin', '/usr/sbin' ],
  98. cwd => "/tmp",
  99. environment => $environment,
  100. }
  101. if $requirements {
  102. exec { "python_requirements_initial_install_${requirements}_${venv_dir}":
  103. command => "${venv_dir}/bin/pip --log-file ${venv_dir}/pip.log install ${pypi_index} ${proxy_flag} -r ${requirements}",
  104. refreshonly => true,
  105. timeout => 1800,
  106. user => $owner,
  107. subscribe => Exec["python_virtualenv_${venv_dir}"],
  108. environment => $environment,
  109. }
  110. python::requirements { "${requirements}_${venv_dir}":
  111. requirements => $requirements,
  112. virtualenv => $venv_dir,
  113. proxy => $proxy,
  114. owner => $owner,
  115. group => $group,
  116. require => Exec["python_virtualenv_${venv_dir}"],
  117. }
  118. }
  119. } elsif $ensure == 'absent' {
  120. file { $venv_dir:
  121. ensure => absent,
  122. force => true,
  123. recurse => true,
  124. purge => true,
  125. }
  126. }
  127. }