Chef を使用してパッケージをインストールする最も「エレガントな」方法は何ですか?

Chef を使用してパッケージをインストールする最も「エレガントな」方法は何ですか?

上記のパッケージをインストールするには 3 つの方法があり、オプション 1 が最も好ましいのですが、オプション 2 や 3、あるいはその他のオプションを使用する理由があるかどうかを確認したいのです。(この質問の目的は、これを行うさまざまな方法についてのフィードバックを得ることです。可能であれば、この場合はコンパイル時にインストールしないでください)

1位。

p = package "snmp" do
  package_name value_for_platform(
    [ "centos", "redhat", "suse" ] => { "default" => "net-snmp" },
    "default" => "snmpd"
  )
  action :install
end

2番目。

packages = case node[:platform]
  when "centos","redhat","fedora"
    %w{net-snmp}
  else
    %w{snmpd}
  end

packages.each do |pkg|
  package pkg
end

3番目。

package "snmpd" do
  action :install
  only_if do platform?("ubuntu", "debian") end
end

答え1

通常、私は自分のレシピではあまり多くのディストリビューションをサポートしていませんが、他のレシピ (Opscode など) を読むときは、上記の 2 番目と同様のアプローチを高く評価します。主な違いは、配列をコンパイルするのではなく、リソースを直接明示的に呼び出す傾向があることです。

case node[:platform]
when "centos","redhat","fedora"
  package 'net-snmp'
else
  package 'snmpd'
end

ただし、具体的に何を表現しようとしているかによって、それぞれのケースには長所と短所がいくつかあります。

関連情報