9

我是 Puppet 的新手,对使用依赖项有疑问。

我正在使用 Puppet 在 Ubuntu 11.04 上安装 Nginx 1.0.5。它需要添加一个新的 apt 存储库,因为 natty 通常随 Nginx 0.8 一起提供。在命令行中,安装过程如下:

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

该脚本有效,但 exec{} 指令每次都运行,而不是仅在实际安装 nginx 时运行。理想情况下,我希望仅在实际安装 nginx 之前运行“apt”命令,而不是在简单地检查 nginx 安装时运行。

我对通知/订阅模型有基本的了解,但我不确定如何让 nginx 指令仅在实际安装 nginx 时发送“通知”信号。

4

2 回答 2

14

以下是解决此问题的两种方法:

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 它应该运行。(您可以改为notify => Exec["nginx_repository"]在 python-software-properties 包节中指定;通知在关系一端的效果与在关系另一端的订阅效果相同。)

第二种方法的缺点是,如果出现任何问题,puppet 将永远无法解决,并且如果包是通过 puppet 规则以外的其他方式安装的(例如作为依赖项拉入其他地方),它将永远不会运行 exec (并且 nginx 软件包安装将继续失败)。

换句话说,让 exec 有某种方法来检查它是否已经运行的第一种方法是非常可取的。

于 2011-08-27T03:28:12.757 回答
1

您可以通过使用 Facter 变量来确保版本独立性,lsbdistcodename如下面的修改createsfreiheit 代码中的属性:

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 回答