Aquí hay un fragmento de mi manifiesto (basado en este módulo:https://github.com/stankevich/puppet-python):
python::virtualenv { $virtualenv_dir:
ensure => present,
version => 'system',
systempkgs => false,
distribute => false,
owner => $user,
group => $group,
}
Eso funciona bien cuando ejecuto la aplicación de títeres por primera vez. Sin embargo, la segunda vez falla:
Already using interpreter /usr/bin/python
Traceback (most recent call last):
File "/usr/bin/virtualenv", line 3, in
virtualenv.main()
File "/usr/lib/python2.7/dist-packages/virtualenv.py", line 938, in main
never_download=options.never_download)
File "/usr/lib/python2.7/dist-packages/virtualenv.py", line 1039, in create_environment
site_packages=site_packages, clear=clear))
File "/usr/lib/python2.7/dist-packages/virtualenv.py", line 1274, in install_python
shutil.copyfile(executable, py_executable)
File "/usr/lib/python2.7/shutil.py", line 83, in copyfile
with open(dst, 'wb') as fdst:
IOError: [Errno 26] Text file busy: '/usr/local/myapp/venv/bin/python'
Probablemente esto se deba a que tengo un montón de procesos en segundo plano ejecutándose usando el binario Python de virtualenv (trabajadores de Celery, trabajadores de uwsgi, etc.).
¿Hay alguna manera de iniciar virtualenv solo la primera vez? No es necesario ejecutar el comando virtualenv una vez creado el directorio, ¿verdad?
Respuesta1
La siguiente clase creará un entorno virtual. "crea" limita el comando para que solo se ejecute si virtualenv no existe
class virtualenv ( $virtualenv_dir ) {
package{'python-virtualenv':
ensure => installed,
}
exec{'create_virtualenv':
creates => $virtualenv_dir,
command => "virtualenv $virtualen_dir",
require => Package['python-virtualenv'],
}
}
Llame a la clase con lo siguiente:
class {'virtualenv':
virtualenv_dir => '/path/to/virtualenv',
}