我们使用Boxen/Ppuppet来自动构建我们的Mac开发笔记本电脑,其中一步是安装rabbitmq,声明vhosts并添加用户。
但是rabbitmq需要更多的时间来准备vhosts声明和添加新用户,所以我们总是要运行boxen两次。
这是我的逻辑
通过运行以下命令检查rabbitmq是否准备就绪
rabbitmqadmin list vhost
但我们需要安装并运行rabbitmq,所以我添加了
require => Service['dev.rabbitmq']
如果以上命令有效,那么我们就知道rabbit正在接受连接。
给,让我们把所有的东西放在一起。
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
没有。如果仅由CCD_ 5来调用它。
这可能吗?
感谢
你在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']
}
除非你告诉你的执行官出于某种原因不要运行,否则它总是会运行的。
有关exec资源,请参阅Puppet Type Reference,并查找unless
和onlyif
。
至于这个问题的题目,我原来忽略了。require
意味着传递给require
的资源必须在调用资源之前应用。所以在这种情况下
Service['dev.rabbitmq']
将在之前应用
Exec['Wait for rabbitmq']
。
require
不会确保exec
资源不会运行。