我是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 docs和ttboj's very detail article on loops in Puppet,但我仍然没有得到它。
我的问题可能更多地与Puppet资源的工作方式有关,但有人可以解释一下编写这么简单的任务最简单的方法吗?
答案 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运行静态脚本序列意味着您不会利用该工具的优势(系统抽象和状态建模)并遇到其中的一些弱点。只运行一个脚本按顺序调用所有其他脚本会不会更简单? (你甚至可以为它定义一个类型。)