链接高级操作由文件中的更改触发

时间:2017-11-03 22:22:04

标签: puppet

我的要求是:

  1. 查找文件/ tmp / file
  2. 中的更改
  3. 如果有更改,请按以下顺序执行:
    • run command3
    • run command2
    • run command1
  4. 如果文件/ tmp /文件没有变化,则不执行任何操作。
  5. 我的代码是这样的:

    exec { 'exec3':
      command => 'command3',
      require => File['file'],
    }
    
    exec { 'exec2':
      command => 'command2',
      require => Exec['exec3'],
    }
    
    exec { 'exec1':
      command     => 'command1',
      require     => Exec['exec2'],
      subscribe   => File['file'],
      refreshonly => true,
    }
    

    但是,无论是否对/ tmp / file进行了更改,command3和command2始终会运行。我该如何预防呢?当/ tmp / file没有变化时,我不希望在exec1中运行“require”。

1 个答案:

答案 0 :(得分:4)

您需要:首先,为所有高管订阅文件资源;其次,对于每个人也需要他们先前的执行资源;第三,每个exec设置为refreshonly

以下是一些代码:

file { 'file':
  ensure  => file,
  path    => '/tmp/file',
  content => "some content\n",
}

exec { 'exec1':
  command   => 'command1', 
  subscribe => File['file'],
  refreshonly => true,
}

exec { 'exec2':
  command   => 'command2',
  subscribe => File['file'],
  require   => Exec['exec1'],
  refreshonly => true,
} 

exec { 'exec3':
  command   => 'command3',
  subscribe => File['file'],
  require   => Exec['exec2'],
  refreshonly => true,
}

这是如何运作的:

  • 使用exec的refreshonly机制,exec1仅在刷新事件时触发,当且仅当file1的内容发生更改时才会发送刷新事件。

  • 所有exec事件都需要由文件内容的更改类似地触发,因此他们都订阅了该文件。

  • 但是exec需要以特定的方式排序,因此exec2需要exec1,而exec3需要exec2。

另见reasons为什么需要小心使用refreshonly。