我可以让 Puppet 订阅一个目录,以便对任何文件的更改都会触发服务重新加载吗?

我可以让 Puppet 订阅一个目录,以便对任何文件的更改都会触发服务重新加载吗?

我们有一个基本的“nginx”类,节点的类包含这个基类并在/etc/nginx/conf.d下添加它们的配置文件

我希望 nginx 服务在单个位置订阅 /etc/nginx/conf.d,这样编写节点类的人就不必记住添加notify => Service['nginx']。我尝试使用下面的 Puppet 代码,但它不起作用(即,在我修改 application.conf 后,nginx 服务没有重新加载)。

这可能吗?

模块/nginx/init.pp

class nginx {
  package { 'nginx':
    ensure => installed,
  }

  service { 'nginx':
    ensure     => running,
    enable     => true,
    hasstatus  => true,
    hasrestart => true,
    require    => Package['nginx'],
    subscribe  => File['/etc/nginx', '/etc/nginx/conf.d'],
  }

  file { ['/etc/nginx', '/etc/nginx/conf.d']:
    ensure  => directory,
    owner   => application,
    group   => application,
    recurse => true,
  }
}

模块/应用程序/init.pp

class application {    
  file {'/etc/nginx/conf.d/application.conf': 
    ensure  => present,
    owner   => application,
    group   => application,
    source  => 'puppet:///modules/application/application.conf',
    require => Package['nginx'],
  }
}

答案1

使用 Puppet 我发现,如果你正在做的事情没有立即奏效,那么你可能正在尝试做一些你不应该做的事情。在这种情况下,你可能希望每个单独的站点只将配置文件放入 nginx/conf.d 中。相反,您需要创建一个代表 nginx vhost 的定义资源。在该资源中,您需要负责将正确的配置文件放入 conf.d 中,并通知 nginx 服务。

这样做的一个好处是您可以标准化所有需要的配置。例如,大多数 nginx 站点都需要启用 gzip。假设您忘记了这一点,您是宁愿在默认模板中进行此更改,还是必须找到每个定义的 nginx 配置进行更改?或者假设在用于 HTTPS 的密码中发现了另一个漏洞。使用一个标准 nginx 配置,您需要更改它。由于每个应用程序都会删除自己的配置文件,因此您将在各个地方进行更改。

答案2

如果你需要将通用功能抽象为可重用的功能,最好的选择是创建一个定义的类型。类似这样的方法应该可行:

define nginx::config_fragment (
  $group,
  $owner,
  $source,
) {
  file { "/etc/nginx/conf.d/${title}.conf":
    ensure => 'file',
    group  => $group,
    owner  => $owner,
    source => $source,
  }
}

然后,在site.pp您的资源类型上设置默认值:

Nginx::Config_fragment {
  group  => 'application',
  owner  => 'application',
  notify => Service['nginx'],
}

每当触发刷新时,都会file通知封闭的定义类型,然后安排 nginx 服务重新加载。

答案3

不确定这是否有效,但是如何创建一个简单的 exec,根据受监控目录的内容生成一个文件,订阅该文件,然后触发重启...

例如:

class nginx {
  package { 'nginx':
    ensure => installed,
  }

  service { 'nginx':
    ensure     => running,
    enable     => true,
    hasstatus  => true,
    hasrestart => true,
    require    => Package['nginx'],
    subscribe  => File['/etc/nginx', '/etc/nginx/conf.d'],
  }

  file { ['/etc/nginx', '/etc/nginx/conf.d']:
    ensure  => directory,
    owner   => application,
    group   => application,
    recurse => true,
  }


  exec { "/tmp/nginx-config-checksum":
    path    => "/usr/local/bin/:/bin:/usr/sbin",
    command => 'find /etc/nginx/conf.d | xargs md5sum > /tmp/nginx-config-checksum',
  }
  file { "/tmp/nginx-config-checksum"        
    notify  => Service['nginx']
  }
}

相关内容