O loop Dir.foreach
é executado antes que a ação do diretório remoto realmente ocorra. Chef executa em duas fases. Durante o primeiro, todo o seu código de receita é executado e os recursos são colocados em uma matriz para avaliação posterior. Na segunda fase, esses recursos são executados para realmente fazer o trabalho. O que está acontecendo no seu caso, como aludido por StephenKing, é que:
- seu bloco
remote_directory
é executado e coloca um recurso no modelo para desativar esse diretório remoto. - o seu
Dir.foreach
loop é executado, mas como o recurso para # 1 ainda está na matriz (ainda não foi executado), não há filhos no diretório/var/service
. Então, o loop faz um loop sobre 0 elementos e sai. - Na sua segunda execução de
chef-client
, você tem valores em/var/service
, então o loop funciona muito bem.
A menos que você precise fazer uma convergência completa em apenas uma corrida de chef, você realmente não tem nenhum problema. Apenas certifique-se de usar as instruções not_if
e only_if
para garantir que cada recurso só seja executado quando necessário. No entanto, se você precisa fazer tudo em uma corrida, é necessário hackear uma solução. A opção mais fácil é forçar uma avaliação imediata do seu recurso remote_directory
fazendo algo assim:
remote_directory "/var/service/" do
source "#{node['site-scribe']['cluster']}"
end.run_action(:create)
Isso forçará a ação a ser executada durante a primeira fase da execução do chef e, em seguida, o loop funcionará.