web-dev-qa-db-ja.com

ファイルが存在しない場合にPipを使用してのみインストールするようにPuppetに指示する方法

Puppetを使用して、いくつかのPythonパッケージをpipを使用してインストールしています。Puppet2.7を使用しているため、パッケージ宣言は次のようになります。

package { "carbon": 
    require => Class["graphite::prereqs::install"],
    ensure  => latest,
    provider => pip,
}

問題は、このパッケージとgraphite-webパッケージには、pipを使用して同じバージョンを複数回インストールできるバグがあるようです。したがって、Sudo pip install carbon複数回、pipは毎回それをインストールします。これはパッケージのバグだと思います。

このバグはPuppetも混乱させるようです。システムをプロビジョニングするたびに、carbonおよびgraphite-webが再インストールされます。

したがって、この明らかなパッケージングのバグを回避する方法があるかどうか疑問に思っています。私は以下を試しました:

package { "carbon": 
    require => Class["graphite::prereqs::install"],
    ensure  => latest,
    provider => pip,
    creates => "/opt/graphite/bin/carbon-cache.py",
}

...しかし、createsは使用できません。パッケージをインストールする前にファイルを探すようにパッケージ宣言に指示できる別の方法はありますか?

6
Tom Purl

使用したいかもしれません exec's creates パラメータ:

exec { "carbon":
    command => "pip install carbon",
    require => Class["graphite::prereqs::install"],
    creates => "/opt/graphite/bin/carbon-cache.py",
    path    => ["/usr/bin", "/usr/sbin"],
    timeout => 100,
  }
8
Mike

「ensure => latest」の代わりに「ensure => installed」を使用してみます。

パペットタイプ参照 から:

パッケージの状態。パッケージを独自に取得できるパッケージングシステムでは、バージョン番号または最新を確認値として指定することにより、取得するパッケージを選択できます。 「通常の」システムファイルとは別に構成ファイルを管理するパッケージングシステムでは、puredを値として指定して、構成ファイルをアンインストールできます。有効な値は、存在する(インストール済みとも呼ばれる)、不在、パージ、保留、最新です。値は/./と一致できます。

Pipプロバイダーの記述方法はわかりませんが、installedではなくlatestを使用すると、puppetはパッケージがすでにインストールされていることを検出し、再度インストールしようとはしません。 。

1
Handyman5

私はテストしていませんが、これを試してください:

file { "/opt/graphite/bin/carbon-cache.py":
    ensure => 'absent',
}

package { "carbon": 
    require => [ Class["graphite::prereqs::install"], 
                 File["/opt/graphite/bin/carbon-cache.py"]
               ]
    ensure  => latest,
    provider => pip,
}
1
quanta