Puppet:创建一个exec只能通过require调用

时间:2014-08-29 03:18:42

标签: puppet boxen

我们使用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调用它,那将是一个想法。

这可能吗?

由于

1 个答案:

答案 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并查找unlessonlyif

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

Service['dev.rabbitmq']

将在

之前应用

Exec['Wait for rabbitmq']

require无法确保不会运行exec资源。