【问题标题】:Puppet reboot when notifed AND parameter set to truePuppet 在收到通知且参数设置为 true 时重新启动
【发布时间】:2019-09-14 01:05:47
【问题描述】:

我在 init.pp 中有一个共享的 puppet 重启块,并且还希望有一个 $autorestart 的全局参数,默认为 false,因此重启是全局选择的。在一个子类中,我有一些资源,例如 file_line 更改设置,这些设置通常在重新启动之前不会生效,但这些不会设置需要重新启动的操作系统标志(例如写入 audit.rules 或 sysctl.conf),所以将这些设置为通知 => Reboot[after_run]。

我知道某些子类功能可以在服务重新启动时生效,但这不是我在这里尝试做的,例如 auditd 是受保护的服务。

我尝试将全局重新启动资源放在“if $autorestart”块中,但是如果全局 $autorestart 设置为 false,则子类资源上的通知无法编译。我试图让这个尽可能灵活而简单。

init.pp:

Boolean $autorestart = false,
…
  if $autorestart {
    reboot { 'after_run':
      apply   => 'finished',
      timeout => 60,
    }
  }

子类.pp:

    file_line { 'net.ipv6.conf.all.disable_ipv6':
      path  => '/etc/sysctl.conf',
      line  => 'net.ipv6.conf.all.disable_ipv6 = 1',
      match => '^net.ipv6.conf.all.disable_ipv6.*',
      notify => Reboot['after_run'],
    }

错误

Could not find resource 'Reboot[after_run]' in parameter 'notify'

我也尝试过 puppet-reboot 'onlyif' 参数,但它只接受某些条件并且不测试参数的值。 https://forge.puppet.com/puppetlabs/reboot#reboot-when-certain-conditions-are-met

任何帮助表示赞赏。

【问题讨论】:

    标签: if-statement puppet reboot


    【解决方案1】:

    ...但是如果全局 $autorestart 设置为 false,子类资源上的通知将无法编译

    这个问题可以通过在条件中移动关系元参数来解决,即

    if $autorestart {
      reboot { 'after_run':
        apply     => 'finished',
        timeout   => 60,
        subscribe => File_line['net.ipv6.conf.all.disable_ipv6'], ## ADD THIS
      }
    }
    

    (当然,从你的 file_line 资源中删除通知。)

    【讨论】:

    • 谢谢亚历克斯,我会试试的。一个问题是我将拥有大约 2 打资源,否则这些资源会通知重新启动。我想我可以在订阅中创建一个数组,但是鉴于会有这么多,你能建议一个替代方案吗?
    • @xit,我可能会误解,但我认为让一个重新启动资源订阅许多资源数组或在每个资源中都有一个通知行指向返回之间的复杂性没有任何区别重新启动?当然,如果您唯一担心的是它看起来很乱,那么您可以尝试在变量中定义资源数组?
    • 会做,稍后会报告结果。再次感谢。
    • Alex,您的建议非常有效,谢谢。我确实创建了要订阅的资源数组(作为变量),然后能够通过将其更改为订阅类数组来进行重复数据删除,我不知道这是可能的!再次感谢您的快速回复。
    • @xit,太好了,很高兴你解决了问题。
    猜你喜欢
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 2020-12-04
    • 1970-01-01
    相关资源
    最近更新 更多