在Ubuntu 11.04上安装Nginx 1.0.5时如何使用Puppet依赖项

ric*_*ler 9 ubuntu nginx puppet ubuntu-11.04

我是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
Run Code Online (Sandbox Code Playgroud)

所以我写了这个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,
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

fre*_*eit 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",
}
Run Code Online (Sandbox Code Playgroud)

这将告诉exec仅在该文件不存在时才运行.如果还有其他方法可以检查exec是否已成功运行,则可以使用onlyif =>unless =>指定要检查的命令.

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"],
  }
Run Code Online (Sandbox Code Playgroud)

这将告诉exec仅在通知时才运行,并将告诉该程序包通知exec它应该运行.(您可以notify => Exec["nginx_repository"]在python-software-properties包节中指定;通知对关系一端的影响与关系另一端的订阅相同.)

第二种方法的缺点是,如果出现任何问题,puppet将永远不会弄明白,如果包装是通过其他方式安装的,而不是通过该木偶规则(例如作为依赖性在其他地方引入),它将永远不会运行exec (并且nginx包安装将继续失败).

换句话说,让执行官有一些检查它是否已经运行的方法是非常可取的.