【问题标题】:How to work with Puppet dependencies when installing Nginx 1.0.5 on Ubuntu 11.04在 Ubuntu 11.04 上安装 Nginx 1.0.5 时如何使用 Puppet 依赖项
【发布时间】:2011-11-04 18:53:22
【问题描述】:

我是 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 时发送“通知”信号。

【问题讨论】:

    标签: ubuntu nginx ubuntu-11.04 puppet


    【解决方案1】:

    这里有两种解决方法:

    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 =>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"],
      }
    

    这将告诉 exec 仅在收到通知时运行,并告诉该包通知 exec 它应该运行。 (您可以改为在 python-software-properties 包节中指定 notify => Exec["nginx_repository"];通知在关系一端的效果与在关系另一端的订阅效果相同。)

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

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

    【讨论】:

    • 谢谢,这是一个非常有用的解释。您的两个示例都有效,由于您提到的原因,我最终选择了#1。
    【解决方案2】:

    您可以使用 Facter 变量 lsbdistcodename 来确保版本独立性,如下修改 freiheit 代码中的 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",
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-03
      • 2021-11-29
      • 1970-01-01
      • 1970-01-01
      • 2012-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多