我们使用Boxen / Puppet自动构建我们的Mac开发笔记本电脑,一步是安装rabbitmq,声明vhosts并添加用户。
但是,让rabbitmq为vhosts声明和添加新用户做好准备需要花费更多的时间,所以我们总是要运行两次boxen。
这是我的逻辑
通过运行以下命令检查rabbitmq是否准备就绪
rabbitmqadmin list vhost
但我们需要安装和运行rabbitmq,所以我补充道
require => Service['dev.rabbitmq']
如果以上命令有效,那么我们就知道兔子正在接受连接。
在这里,让我们把所有东西放在一起。
exec { "Wait for rabbitmq":
command => "rabbitmqadmin list vhosts",
tries => 2,
try_sleep => 30,
require => Service['dev.rabbitmq']
}
dev::rabbitmq::vhost { '/clearvh':
require => Exec['Wait for rabbitmq']
}
dev::rabbitmq::user { 'clear': password => 'password' }
dev::rabbitmq::permission { [ 'guest', 'clear' ]: vhost => '/clearvh' }
}
效果很好,但每次都会调用Exec {"Wait for rabbit"}
,即使dev::rabbit::vhost
没有。如果仅由dev::rabbitmq::vhost
调用它,那将是一个想法。
这可能吗?
由于
答案 0 :(得分:0)
你以错误的方式处理exec
。您需要有条件阻止exec
运行。
exec { "Wait for rabbitmq":
command => "rabbitmqadmin list vhosts",
tries => 2,
try_sleep => 30,
unless => 'some command which returns "0" that tells you rabbitmq is already ready for vhosts',
require => Service['dev.rabbitmq']
}
除非你告诉你的执行官不要因某种原因而逃跑,否则它会一直运行。
请参阅Puppet Type Reference for the exec resource并查找unless
和onlyif
。
至于我最初忽略的这个问题的标题。 require
表示必须在调用资源之前应用传递给require
的资源。所以在这种情况下
Service['dev.rabbitmq']
将在
之前应用 Exec['Wait for rabbitmq']
。
require
无法确保不会运行exec
资源。