从第一次应用开始就运行 puppet exec 进行文件更新

从第一次应用开始就运行 puppet exec 进行文件更新

我想根据文件更新运行 puppet exec-resource。例如:

File { '/tmp/foo.bar':
    audit => content,
} ~>
exec { 'deployment':
    command => 'do_something_meaningful.sh',
}

但是每次 puppet-apply-run 时都会执行此操作。即使文件没有更改。所以我尝试了 exec-attribute refreshonly。但是有了这个,exec 不会在第一次 puppet-apply 上执行。我认为这是因为还没有 md5-checksum state.yml。从第二次运行开始,它就运行良好了。

我当前的解决方法是这样的:

File { '/tmp/foo.bar':
    audit => content,
} 

exec { 'deployment_on_change':
    command     => 'do_something_meaningful.sh',
    refreshonly => true,
    subscribe   => File['/tmp/foo.bar']
}

exec {'deployment_on_first_run':
    command   => 'do_something_meaningful.sh',
    onlyif    => 'test ! -f marker.file',
    subscribe   => File['/tmp/foo.bar']
} ->
file { 'marker.file':
    ensure => present
}

有没有更优雅的方法来解决这个问题?

答案1

您正在强迫 Puppet 执行其设计目的之外的操作。通过执行,您只会延长每次 Puppet 的运行时间。而您不希望出现这种情况。

只需使用一项cron工作,它将检查是否有某些东西发生了变化。

file{'/usr/bin/local/do_something_meaningful':
  ensure  => present,
  owner   => 'myuser',
  mode    => '0755',
  source  => 'puppet:///modules/my_module/do_something_meaningful.sh',
}

cron { 'do_something_meaningful':
  command => '/usr/bin/local/do_something_meaningful',
  user    => 'myuser',
  hour    => ['8-17'],
  minute  => '*/30',
  require => File['/usr/bin/local/do_something_meaningful'],
}

如果您使用其他工具部署代码,则应参与do_something_meaningful.sh部署过程。Puppet 非常适合确保某些资源(文件、包、服务等)存在。

相关内容