2014-08-29 60 views
1

我们使用Boxen/Puppet自动构建Mac开发笔记本电脑,一步是安装rabbitmq,声明虚拟主机并添加用户。木偶:只能通过require调用创建一个exec

但是它需要更多的时间让rabbitmq准备虚拟主机声明并添加新用户,所以我们总是必须运行boxen两次。

这里是我的逻辑

察看RabbitMQ的是通过运行以下命令 rabbitmqadmin list vhost 准备好,但我们需要安装并运行了,所以我说 require => Service['dev.rabbitmq'] 如果上面的命令工作,然后我们知道兔子正在接受连接的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调用它将是想法。

这可能吗?

感谢

+1

你可以用'refreshonly => true'和'subscribe'服务来尝试,而不是仅仅需要它。但我不确定重试语义是否适用于“刷新”操作,而不是您现在正在执行的实际同步操作。如果没有,您可以通过执行内部执行失败/睡眠/重试循环的包装脚本来解决此问题。 – 2014-08-29 08:52:33

+0

'refreshonly' /'subscribe'也有一个好处,就是如果Puppet不必(重新)启动服务,那么Exec就不会运行。但我也不知道Puppet是否会在“执行”刷新上重试。我猜它会做,但我不知道。你能否使用shell提供程序和exec“sleep 30; rabbitmqadmin list vhosts”? – 2014-08-29 15:55:36

回答

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并寻找unlessonlyif

至于我最初忽略的这个问题的标题。 require表示传递给require的资源必须在调用资源之前应用。因此,在这种情况下

Service['dev.rabbitmq']

Exec['Wait for rabbitmq']之前应用。

require不能确保exec资源不会运行。

+0

让我们忘记我做了什么,在声明虚拟主机之前,您会做什么来检查rabbitmq是否准备好(接受连接)?'onlyif'不是我想要的,因为如果失败了,我的虚拟主机声明就会被忽略。 – 2014-08-29 04:57:39

+0

你可能会保留执行。使用'try'和'try_sleep'参数给你的exec。我要用它更新我的答案。如果它仍然不是你想要的,我们可以进一步探索。 – ptierno 2014-08-31 03:09:40

+0

heh。无视这一点。没有意识到我已经尝试过'try_sleep' :) – ptierno 2014-08-31 03:10:35