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 é:
-
import
funciona com arquivos e não executa classes -
include
executa 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 foo
tenta importar o arquivomodule_dir/foo/manifests/init.pp
-
include foo::bar
importsmodule_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!