9

私は Puppet を初めて使用し、依存関係の操作について質問があります。

Puppet を使用して、Ubuntu 11.04 に Nginx 1.0.5 をインストールしています。natty には通常 Nginx 0.8 が付属しているため、新しい apt リポジトリを追加する必要があります。コマンドラインでは、インストールは次のようになります。

# apt-get install python-software-properties
# add-apt-repository ppa:nginx/stable
# apt-get update
# apt-get install nginx

そこで、この Puppet スクリプトを書きました。

class nginx::install {
  package { "nginx":
    ensure => present,
    require => Exec["nginx_repository"],
  }

  exec { "add-apt-repository ppa:nginx/stable && apt-get update":
    alias => "nginx_repository",
    require => Package["python-software-properties"],
  }

  package { "python-software-properties":
    ensure => installed,
  }
}

スクリプトは機能しますが、nginx が実際にインストールされているときだけではなく、毎回 exec{} ディレクティブが実行されます。理想的には、nginxのインストールが単にチェックされているときではなく、実際のnginxのインストールの前にのみ「apt」コマンドを実行したいと思います。

通知/サブスクライブ モデルについては基本的な理解がありますが、実際に nginx をインストールするときにのみ、nginx ディレクティブで "notify" シグナルを送信する方法がわかりませんでした。

4

2 に答える 2

14

これを修正するには、次の 2 つの方法があります。

1)

exec { "add-apt-repository ppa:nginx/stable && apt-get update":
    alias => "nginx_repository",
    require => Package["python-software-properties"],
    creates => "/etc/apt/sources.list.d/nginx-stable-natty.list",
}

これにより、そのファイルが存在しない場合にのみ実行するように exec に指示されます。exec が正常に実行されたことを確認する別の方法がある場合は、onlyif =>orunless =>を使用して確認するコマンドを指定できます。

2)

  exec { "add-apt-repository ppa:nginx/stable && apt-get update":
    alias => "nginx_repository",
    require => Package["python-software-properties"],
    refreshonly => true,
    subscribe => Package["python-software-properties"],
  }

これは、通知された場合にのみ実行するように exec に指示し、実行する必要があることを exec に通知するようにそのパッケージに指示します。(代わりに python-software-properties パッケージ スタンザで指定することもできますnotify => Exec["nginx_repository"]。関係の一方の端での通知の効果は、関係のもう一方の端でのサブスクライブと同じです。)

2 番目のアプローチの欠点は、何か問題が発生した場合に puppet がそれを認識できず、その puppet ルール以外の方法でパッケージがインストールされた場合 (他の場所の依存関係としてプルされるなど)、exec が実行されないことです。 (そして、nginx パッケージのインストールは失敗し続けます)。

言い換えれば、exec がすでに実行されているかどうかをチェックする何らかの方法を持っているという最初のアプローチが非常に望ましいです。

于 2011-08-27T03:28:12.757 に答える
1

freiheit のコードlsbdistcodenameの属性に対する次の変更のように、Facter 変数を使用することで、バージョンの独立性を確保できます。creates

exec { "add-apt-repository ppa:nginx/stable && apt-get update":
  alias => "nginx_repository",
  require => Package["python-software-properties"],
  creates => "/etc/apt/sources.list.d/nginx-stable-${lsbdistcodename}.list",
}

Ubuntu 12.04 Lucid の場合、これは次のように展開されます。

creates => "/etc/apt/sources.list.d/nginx-stable-lucid.list",
于 2013-09-20T12:22:23.587 に答える