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

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

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

service { 'openstack-nova-network':
  ensure    => running,
  enable    => true,
  subscribe => File['/etc/nova/nova.conf'],
}

这一切都很顺利。

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

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

file { '/path/to/some/file':
  source => 'puppet:///.../',
  notify => File['/etc/nova/nova.conf'],
}

...但这似乎不起作用。除了 notify为每个服务添加明确的条目外,还有其他更好的方法吗?

更新

你知道,我开始怀疑我的问题不够清楚。我想为造成的混乱道歉,并尝试更明确地表达我的请求:

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

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

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

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

$services = [ service1, service2, service ]

因为这样我就可以这样做:

file { '/usr/lib/python/glance/notifier/notify_qpid.py':
  notify => Service[$services],
}

但这样不行,因为不同主机上的服务列表不同。也许我可以反过来维护一个“修补程序”文件列表:

$hotfix_files = [
  '/usr/lib/python2.6/site-packages/glance/notifier/notify_qpid.py',
  '/root/puppet/modules/openstack/files/nova/impl_qpid.py',
]

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

service { 'openstack-nova-network':
  ensure    => running,
  enable    => true,
  subscribe => [
    File['/etc/nova/nova.conf'],
    File[$hotfix_files],
  ]
}

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

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

答案1

您所追求的主要目标是“通知所有订阅 /etc/nova/nova.conf 的服务”,这似乎无法通过file-resources 实现。但是,它可以通过exec-resources 和refreshonly-parameter 实现。(刚刚测试了类似的配置木偶 2.7.11)。您必须添加一个虚拟exec资源:

exec {'dummy-nova-refresh':
    command     => "/bin/true",
    refreshonly => true,
}

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

订阅该Exec的所有服务:

service { 'openstack-nova-network':
    ensure    => running,
    enable    => true,
    subscribe => Exec['dummy-nova-refresh'],
}

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

file { '/path/to/some/file':
    source => 'puppet:///.../',
    notify => Exec['dummy-nova-refresh'],
}

大功告成。任何文件的变更都会触发订阅的所有服务的刷新'dummy-nova-refresh'

答案2

我其实并不是这两种技术的专家,但我认为你必须将要重新启动的服务订阅到替换的文件。例如:

  configfile { "/etc/httpd/conf/httpd.conf":
    source => "/httpd/httpd.conf",
    mode => 644,
  }

  service { httpd:
    running => true,
    subscribe => file["/etc/httpd/conf/httpd.conf"]
  }

不确定这个语法是否正确,但我希望你能明白我的意思。

答案3

service { 'openstack-nova-network':
  ensure    => running,
  enable    => true,
  subscribe => [
               File['/etc/nova/nova.conf'],
               File['/path/to/some/file'],
               ],
}

那应该可行。

相关内容