Puppet 链接由文件中的更改触发的EXEC

Puppet 链接由文件中的更改触发的EXEC,puppet,Puppet,我的要求是: 在文件/tmp/file中查找更改 如果有变更,请按以下顺序执行: 运行命令3 运行命令2 运行命令1 如果文件/tmp/file中没有更改,则不执行任何操作 我的代码如下: exec{'exec3': command=>“command3”, require=>File['File'], } exec{'exec2': command=>command2, require=>Exec['exec3'], } exec{'exec1': command=>command1, r

我的要求是:

  • 在文件/tmp/file中查找更改
  • 如果有变更,请按以下顺序执行:
    • 运行命令3
    • 运行命令2
    • 运行命令1
  • 如果文件/tmp/file中没有更改,则不执行任何操作
  • 我的代码如下:

    exec{'exec3':
    command=>“command3”,
    require=>File['File'],
    }
    exec{'exec2':
    command=>command2,
    require=>Exec['exec3'],
    }
    exec{'exec1':
    command=>command1,
    require=>Exec['exec2'],
    订阅=>File['File'],
    refreshonly=>true,
    }
    

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

    您需要:首先,让所有exec订阅文件资源;第二,每个人也需要他们之前的执行资源;第三,将每个exec设置为
    refreshonly

    下面是一些代码:

    文件{'file':
    确保=>文件,
    路径=>'/tmp/file',
    content=>“某些内容\n”,
    }
    exec{'exec1':
    command=>command1,
    订阅=>File['File'],
    refreshonly=>true,
    }
    exec{'exec2':
    command=>command2,
    订阅=>File['File'],
    require=>Exec['exec1'],
    refreshonly=>true,
    } 
    exec{'exec3':
    command=>“command3”,
    订阅=>File['File'],
    require=>Exec['exec2'],
    refreshonly=>true,
    }
    
    工作原理:

    • 使用exec的机制,只有在刷新事件时才会触发exec1,并且只有在文件1的内容发生更改时才会发送刷新事件

    • 所有exec事件都需要由文件内容的更改以类似方式触发,因此它们都订阅该文件

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


    另请参见为什么只需小心使用refreshonly。

    您需要:首先,让所有执行人员订阅文件资源;第二,每个人也需要他们之前的执行资源;第三,将每个exec设置为
    refreshonly

    下面是一些代码:

    文件{'file':
    确保=>文件,
    路径=>'/tmp/file',
    content=>“某些内容\n”,
    }
    exec{'exec1':
    command=>command1,
    订阅=>File['File'],
    refreshonly=>true,
    }
    exec{'exec2':
    command=>command2,
    订阅=>File['File'],
    require=>Exec['exec1'],
    refreshonly=>true,
    } 
    exec{'exec3':
    command=>“command3”,
    订阅=>File['File'],
    require=>Exec['exec2'],
    refreshonly=>true,
    }
    
    工作原理:

    • 使用exec的机制,只有在刷新事件时才会触发exec1,并且只有在文件1的内容发生更改时才会发送刷新事件

    • 所有exec事件都需要由文件内容的更改以类似方式触发,因此它们都订阅该文件

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


    另请参见为什么只需小心使用refreshonly。

    也许值得注意的是,与Puppet中的任何其他内容不同,资源默认值具有动态范围。这对这个答案本身没有特别的影响,但是当这个代码被插入到OP的上下文中时,可能会产生意想不到的结果。@Alex Harvey,谢谢。成功了。不过,在我的代码中,仍然有一个问题,您能否解释一下为什么所有exec块中的命令都会在第一个exec块本应仅在文件发生更改时运行的情况下运行。
    require
    metaparameter仅声明事件发生的顺序,其他所有事情都是相同的(并且如果第一个资源无法应用,也会阻止第二个资源被应用)同时,
    subscribe
    metaparameter i与
    refreshonly=>true
    结合声明,当且仅当资源订阅更改状态时,才应应用资源。是的,一开始有点混乱。可能值得注意的是,与Puppet中的任何其他内容不同,资源默认值具有动态范围。这对这个答案本身没有特别的影响,但是当这个代码被插入到OP的上下文中时,它可能会产生意想不到的结果。@Alex Harvey,谢谢。它起作用了。但在我的代码中,仍然是一个问题,你能解释一下为什么所有exec块中的命令都会运行,而第一个exec块应该只在fi发生变化时运行吗le.
    require
    元参数仅声明事件发生的顺序,所有其他事件都是相同的(如果第一个资源未能应用,还阻止第二个资源被应用)。同时,
    subscribe
    metaparameter i与
    refreshonly=>true
    结合声明,当且仅当订阅的资源更改状态时,才应应用该资源。是的,一开始有点混乱。