O Puppet não suporta esse tipo de configuração, mas a restrição pode ser facilmente contornada. A razão está em duas "regras" básicas de fantoches:
- Uma classe pode ser incluída apenas uma vez (as inclusões subsequentes não farão nada)
- A ordem de execução não é estritamente definida e pode até ser aleatória
er-dev e er-bce-dev incluem a classe er . Mas a classe não pode ser incluída duas vezes, portanto, er class é executada apenas com o padrão $venvname = "er" ou com a substituição $venvname = "er-dev" , mas não com ambas.
A solução: altere a classe er para uma definição (consulte "Definições" no Tutorial da linguagem de marionetes ( link )):
modules / django-env / manifests / er.pp
# Create new er resource definition
define django-env::er($vpath="/home/django/virtualenvs", $vname="er") {
file { "$vpath/$vname" :
ensure => directory
}
# etc ...
}
Não precisamos das variáveis $venvname e $venvpath , elas são especificadas como valores padrão na definição. O nome django-env::er adiciona a definição ao namespace django-env e permite a importação automática (veja abaixo).
Importar e incluir
A diferença entre import e include statemens é:
-
importfunciona com arquivos e não executa classes -
includeexecuta classes
Os arquivos - devem ser importados antes que as classes possam ser incluídas
Observação: há uma exceção muito strong à última regra: consulta ao módulo Puppet . A declaração include faz importações automáticas em muitas situações. Aqui estão alguns deles:
-
include footenta importar o arquivomodule_dir/foo/manifests/init.pp -
include foo::barimportsmodule_dir/foo/manifests/bar.pp
Com essas importações automáticas e a definição de recursos, você pode definir vários ambientes virtuais com muita facilidade. Alterar node 'centos-dev' :
node 'centos-dev' imports default {
include django-env
# The er resource with default values:
django-env::er { 'er-bce': }
# Another er resource with different environment name:
django-env::er { 'er-bce-dev': vname => 'bce-dev'}
}
E você pode remover basicamente todas as declarações import considerando django-env module.
Feliz Puppeting!