Puppet - 通知后无法仅执行有序的Exec命令链

时间:2015-10-21 20:42:26

标签: vagrant manifest puppet redmine puppet-enterprise

TLDR:

我无法将Puppet“Exec”命令的有序链配置为仅运行ONCE。

详细信息:

我想使用Vagrant和Puppet模块来设置安装了Redmine的VM以及加载到其中的一些示例数据。 我正在使用https://forge.puppetlabs.com/johanek/redmine并且效果很好 - 安装了Redmine并且它可以工作。

我的目标:
现在我想使用REST API将示例数据加载到Redmine中:

  1. 创建1个测试项目
  2. 将2个问题导入此项目
  3. 我想要一个接一个地运行2个简单的“Exec”并且只运行一次,但我无法实现这一点,因此问题。

    我目前的努力:
    我试图订阅redmine安装的最新步骤之一

      

    subscribe => [执行[ 'rails_migrations']]

    然后导入数据,但第一步“create-project1”总是通知第二步“导入问题”,因此它会创建重复数据。 如果几次运行vagrant配置,“import-issues”会产生重复的问题。 这是我的代码:

    exec {'create-project1':
        subscribe => [Exec['rails_migrations']],
        path    => ['/usr/bin', '/usr/sbin', '/bin'],
        creates => "$redmine_install_dir/.data_loaded",
        command => "curl WHICH_CREATES_PROJECT && touch $redmine_install_dir/.data_loaded",
        notify  => [Exec['import-issues']],
    } ->
    exec {'import-issues':
        path    => ['/usr/bin', '/usr/sbin', '/bin'],
        command => "curl WHICH_IMPORTS_ISSUES",
        refreshonly => true,
    }
    

    问题:
    如何配置这些Exec命令在链中运行并且仅运行?

    我也在考虑在不久的将来将这个链扩展到5个命令,所以请记住这一点。

1 个答案:

答案 0 :(得分:0)

你差不多只有'ONLY ONCE' - Puppet有onlyif个属性,你可以在你的exec块中包含这些属性来测试文件是否已经存在。

然后,您可以执行类似

的操作
exec {'create-project1':
    subscribe => [Exec['rails_migrations']],
    path    => ['/usr/bin', '/usr/sbin', '/bin'],
    onlyif  => "test ! -f $redmine_install_dir/.data_loaded"
    command => "curl WHICH_CREATES_PROJECT && touch $redmine_install_dir/.data_loaded",
    notify  => [Exec['import-issues']],

$redmine_install_dir/.data_loaded存在的测试 - 你应该能够用它来实现你想要的东西