這是我的清單中的一個片段(基於此模組:https://github.com/stankevich/puppet-python):
python::virtualenv { $virtualenv_dir:
ensure => present,
version => 'system',
systempkgs => false,
distribute => false,
owner => $user,
group => $group,
}
當我第一次運行 puppet apply 時,效果很好。但第二次失敗了:
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'
這可能是因為我有一堆使用 virtualenv 中的 Python 二進位檔案運行的後台進程(Celery 工作人員、uwsgi 工作人員等)。
有沒有辦法只在第一次初始化 virtualenv ?建立目錄後就不需要執行 virtualenv 指令了,對嗎?
答案1
下面的類別將建立一個虛擬環境。 「creates」限制指令僅在 virtualenv 不存在時執行
class virtualenv ( $virtualenv_dir ) {
package{'python-virtualenv':
ensure => installed,
}
exec{'create_virtualenv':
creates => $virtualenv_dir,
command => "virtualenv $virtualen_dir",
require => Package['python-virtualenv'],
}
}
使用以下命令呼叫該類別:
class {'virtualenv':
virtualenv_dir => '/path/to/virtualenv',
}