如何使用Puppet在循环中顺序执行脚本?

时间:2015-08-09 09:40:07

标签: resources exec puppet sequential

我是Puppet的新手,但我无法解决这个简单的问题:我想要定义一个资源,只需一个接一个地执行一系列脚本,等待一个人的执行完成后再启动下一个。

以下是我的尝试:

$ cat test.pp
define my_test {
   exec { "my test task $name":
        provider => shell,
        logoutput => true,
        command => "sleep $name && echo slept for $name seconds",
    }
}

my_test { [3, 2, 1, 0]: }

$ puppet apply test.pp
Notice: Compiled catalog for my.domain.fr in environment production in 0.05 seconds
Notice: /Stage[main]/Main/My_test[0]/Exec[my test task 0]/returns: slept for 0 seconds
Notice: /Stage[main]/Main/My_test[0]/Exec[my test task 0]/returns: executed successfully
Notice: /Stage[main]/Main/My_test[3]/Exec[my test task 3]/returns: slept for 3 seconds
Notice: /Stage[main]/Main/My_test[3]/Exec[my test task 3]/returns: executed successfully
Notice: /Stage[main]/Main/My_test[1]/Exec[my test task 1]/returns: slept for 1 seconds
Notice: /Stage[main]/Main/My_test[1]/Exec[my test task 1]/returns: executed successfully
Notice: /Stage[main]/Main/My_test[2]/Exec[my test task 2]/returns: slept for 2 seconds
Notice: /Stage[main]/Main/My_test[2]/Exec[my test task 2]/returns: executed successfully
Notice: Finished catalog run in 6.27 seconds

我也尝试使用[3, 2, 1, 0].each |$var| { ... }构造,并阅读the docsttboj's very detail article on loops in Puppet,但我仍然没有得到它。

我的问题可能更多地与Puppet资源的工作方式有关,但有人可以解释一下编写这么简单的任务最简单的方法吗?

1 个答案:

答案 0 :(得分:3)

我不认为你只能用数组符号来做这件事。

如果你坚持你的声明,你仍然需要逐个添加关系。

My_test['3'] -> My_test['2'] -> My_test['1'] -> My_test['0']

非常值得。更容易从一开始就走得更远。

my_test { '3': }
->
my_test { '2': }
->
my_test { '1': }
->
my_test { '0': }

当然,这不允许你将标题移动到Hiera或其他地方。

我认为你可以编造一个糟糕的(聪明的)函数来生成资源并一次性添加关系,但这将是一种高维护方法。 (亲切地问你的同事/继任者。)

我建议你在这里查看你的动机。正如您所注意到的那样,使用Puppet运行静态脚本序列意味着您不会利用该工具的优势(系统抽象和状态建模)并遇到其中的一些弱点。只运行一个脚本按顺序调用所有其他脚本会不会更简单? (你甚至可以为它定义一个类型。)