Usando Incluindo Nome de Classe em Condicionais com Modelos de Marionetes

3

Estou em uma situação em que, por questões de gerenciamento, gostaria de usar o mesmo modelo de arquivo de configuração para duas classes. Eu só espero que uma pequena seção do arquivo de configuração seja diferente entre os dois, e já que espero que ambas as classes sejam incluídas para a maioria dos nós, eu gostaria de ter uma condicional simples para determinar qual classe está incluindo o arquivo.

Como exemplo, suponhamos que sensor e snuffler estejam incluídos no mesmo nó. Eu gostaria que o modelo fosse parecido com isto

<% if scope.name == "sensor" %>
 include sensor/file1
 include sensor/file2
<% else %>
 include snuffler/file1
 include snuffler/file2
<% end %>

Isso é possível diretamente ou eu preciso voltar a algo como definir variáveis nas definições de classe?

    
por Scott Pack 18.04.2012 / 21:17

2 respostas

3

A maneira mais fácil de fazer isso é examinar a variável scope.tags e procurar um membro com o nome da classe em que você está interessado. Por padrão, um recurso é marcado com seu tipo (como 'classe' 'ou' type '), bem como o nome do recurso definidor (como' sensor 'ou' snuffler '). No meu teste rápido eu fiz algo assim:

class other {
  file { '/etc/test':
    content => template('test/test.erb'),
  }
}

class test {
  file { '/etc/test':
    content => template('test/test.erb'),
  }
}

include test

Com um modelo que parecia:

I am an erb template:
<% if scope.tags.member? 'test' %>
I was made in the Test class!
<% end %>

Quando chamado da classe 'teste', o conteúdo extra é exibido.

    
por 18.04.2012 / 21:46
3

A variável "scope" refere-se à classe Puppet::Parser::Scope , que também parece acompanhar a origem. Você pode se referir a ele com scope.source.name :

class classname::foo {
  notice(inline_template("scope='<%= scope.source.name %>'"))
}

imprime

notice: Scope(Class[Classname::Foo]): scope='classname::foo'
    
por 18.04.2012 / 21:54