是否可以通知 Puppet 中的 File[] 资源并触发订阅该文件的资源?

lar*_*sks 2 puppet

我们使用 Puppet 来管理 OpenStack 安装。OpenStack 由许多松散连接的部分组成,所有部分都通过 AMQP 进行通信。几个部分使用一个通用配置文件 ( /etc/nova/nova.conf),因此典型的服务资源如下所示:

service { 'openstack-nova-network':
  ensure    => running,
  enable    => true,
  subscribe => File['/etc/nova/nova.conf'],
}
Run Code Online (Sandbox Code Playgroud)

这一切都很好。

现在我们使用 Puppet 来安装一些底层 Python 代码的修补程序。当我们替换 Python 源文件之一时,我们希望重新启动使用它的服务。通常,这与订阅的服务集完全相同 /etc/nova/nova.conf

我希望我可以通过通知文件来利用现有的依赖项来做到这一点,就像这样......

file { '/path/to/some/file':
  source => 'puppet:///.../',
  notify => File['/etc/nova/nova.conf'],
}
Run Code Online (Sandbox Code Playgroud)

...但这似乎不起作用。除了notify为每个服务输入显式 条目之外,还有更好的方法来做到这一点吗?

更新

你知道,我开始怀疑我的问题并不完全清楚。我想为造成的混乱道歉,并尽量让我的要求更明确一点:

我意识到我可以使用一组显式依赖项来做到这一点,无论是作为subscribe服务的notify值还是已安装文件的值。问题是这意味着维护一个 M*N 的依赖矩阵。引入新文件意味着:

  • 更新 Mservice资源,或
  • 更新N个file资源

这种重复的复制粘贴工作很容易出错,尤其是当多人负责配置时。

一种选择是维护一个中央服务列表:

$services = [ service1, service2, service ]
Run Code Online (Sandbox Code Playgroud)

因为那时我可以这样做:

file { '/usr/lib/python/glance/notifier/notify_qpid.py':
  notify => Service[$services],
}
Run Code Online (Sandbox Code Playgroud)

但这行不通,因为不同主机上的服务列表不同。可能我可以翻转它并维护一个“修补程序”文件列表:

$hotfix_files = [
  '/usr/lib/python2.6/site-packages/glance/notifier/notify_qpid.py',
  '/root/puppet/modules/openstack/files/nova/impl_qpid.py',
]
Run Code Online (Sandbox Code Playgroud)

然后更新所有服务定义一次:

service { 'openstack-nova-network':
  ensure    => running,
  enable    => true,
  subscribe => [
    File['/etc/nova/nova.conf'],
    File[$hotfix_files],
  ]
}
Run Code Online (Sandbox Code Playgroud)

但这仍然需要手动维护修改文件列表。

我真正想做的是说,“通知所有订阅的服务/etc/nova/nova.conf”。

Mik*_*kko 6

您所追求的主要内容是“通知订阅 /etc/nova/nova.conf 的所有服务”,似乎无法使用file-resources。但是,它与exec-resources 和refreshonly-parameter 一起使用。(刚刚用Puppet 2.7.11测试了类似的配置)。您必须添加一个虚拟exec-resource:

exec {'dummy-nova-refresh':
    command     => "/bin/true",
    refreshonly => true,
}
Run Code Online (Sandbox Code Playgroud)

当命令运行时,exec向其所有订阅者发送通知。并且refreshonly-parameter 确保该命令仅在刷新时运行。

订阅此 Exec 的所有服务:

service { 'openstack-nova-network':
    ensure    => running,
    enable    => true,
    subscribe => Exec['dummy-nova-refresh'],
}
Run Code Online (Sandbox Code Playgroud)

并使用来自所有文件资源的通知。(也为 执行此操作/etc/nova/nova.conf,或在每个 的订阅列表中指定它service):

file { '/path/to/some/file':
    source => 'puppet:///.../',
    notify => Exec['dummy-nova-refresh'],
}
Run Code Online (Sandbox Code Playgroud)

并做了。任何文件的更改都会触发订阅的所有服务的刷新'dummy-nova-refresh'