Puppet の仮想環境を一度だけ初期化する

Puppet の仮想環境を一度だけ初期化する

これが私のマニフェストからの抜粋です(このモジュールに基づいています:https://github.com/stankevich/puppet-python):

python::virtualenv { $virtualenv_dir:
ensure => present,
version => 'system',
systempkgs => false,
distribute => false,
owner => $user,
group => $group,
}

初めて puppet apply を実行したときは問題なく動作します。しかし、2 回目は失敗します。

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」は、仮想環境が存在しない場合にのみコマンドが実行されるように制限します。

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',
}

関連情報