2012-10-10 13 views
5

Estoy tratando de establecer un orden secuencial en algunos de mis módulos para ciertos nodos.Puppet Nodes.pp Include Modules Execution Order

node basenode{ 
include ps 
include netfx 
include hg 
include reportviewer2012 
include wdeploy30 
include sqlexpress2008 
include windowsrolesfeatures 
include tcbase 
} 

node 'myserver' inherits basenode { 
include tcuiagent 

Class['tcuiagent'] -> Class['tcbase'] -> Class['windowsrolesfeatures'] -> Class['ps'] 
} 

Ciertamente Yo NO quiero establecer dependencias dentro de los recursos del módulo, ya que los hará más interdependiente, que no quiero hacer. En este caso, quiero cumplir este orden.

  1. ps (primera)
  2. windowsrolesfeatures
  3. anyotherpackage {hg, netfx ...} (no me importa el orden de aprovisionamiento) n. tcbase
  4. tcuigant (último)

Respuesta

1

Si realmente no desea expresar las relaciones entre los módulos, puede usar las etapas para hacer cumplir una orden.

primero debe declarar las etapas en su parte superior manifiesta:

## Very important : we define stages. 
## Can only be done here. 
stage { 'first': }  # the first of first 
stage { 'apt': }  # to install apt sources and run apt-get update if necessary 
# stage main   # default stage, always available 
stage { 'last': }  # a stage after all the others 
# Now we define the order : 
Stage[first] -> Stage[apt] -> Stage[main] -> Stage[last] 

luego usarlos:

# basics needing a run state 
# We use the "class" syntax here because we need to specify a run stage. 
class 
{ 
    'puppeted': # debug 
     stage => first, # note the explicit stage ! 
     ; 
    'apt_powered': # Very important for managing apt sources 
     stage => apt, # note the explicit stage ! 
     #offline => 'true', # uncomment this if you are offline or don't want updates 
     ; 
    'apt_powered::upgraded': # will systematically upgrade paquets. dev machine -> we want to stay up to date 
     stage => apt, # note the explicit stage ! 
     ; 
} 

Pero esto es feo y esto no es lo que las etapas se hacen para.

+1

Supongo que no tengo otra opción. 1. Cree la relación entre recursos, incluso si pertenecen a diferentes módulos.Ejemplo (netfx40, netfx45, sql2012). En este caso tengo tres módulos pero la cadena de dependencia es como fue declarada sql2012-> netfx45-> netfx40. Adivinando que no se puede redistribuir el módulo sql2012 sin los otros módulos. 2. Al usar las etapas, estoy creando las relaciones en el nivel superior, pero los recursos ya no son independientes, ya que tienen una "etapa" variable que debe establecerse en el sitio.pp – Maverick

1

Me gustaría sugerir fuertemente la reescritura de los módulos de manera que el orden en que están instalados no es importante ya o crear las relaciones necesarias a los recursos.

Si está instalando/configurando recursos relacionados de diferentes módulos, podría considerar fusionar esos módulos.

Ger.

+0

Si creo relaciones entre los recursos entonces usted está haciendo recursos de diferentes módulos dependientes y hago desea crear esa relación en el nivel superior, pero utilizando etapas se ven muy feos . – Maverick

+0

¡Buen nombre! Imagino a un oso trepando arrojando manzanas de mala gana sobre un picnicker desprevenido. –

1

Supongo que lo resuelvo usando un enfoque diferente con herencia de nodos.

node windowsmachine{ 
include ps #powershell 
include windowsrolesfeatures #windows roles and features 
include netfx #netframework 4.0 and 4.5 
} 

node teamcitybase inherits windowsmachine { 
include hg #mercurial 
include nuget #nuget configuration 
include reportviewer2012 
include wdeploy30 #web deployment 3.0 
include tcbase #asp.net configuration 
include sqlexpress2008 #sqlexpress 
} 

node 'myserver1','myserver2' inherits teamcitybase{ 
#pending installation of puppet clients 
} 

node 'myserver3' inherits teamcitybase { 
include tcuiagent 
} 

módulos de configuración de la máquina de Windows no dependen unos de otros, pero myserver1 con el sqlexpress2008 depende de que la línea de base.

Sin etapas o dependencia del módulo !!!!!

1

Después de liberar el mismo problema, me encontré con la siguiente publicación que funciona mejor que todas las que he encontrado.

1 ##################### 
2 # 1) Define the stages 
3 ##################### 
4 
5 stage { 'prereqs': 
6 before => Stage['main'], 
7 } 
8 
9 stage { 'final': 
10 require => Stage['main'], 
11 } 
12 
13 ##################### 
14 # 2) Define the classes 
15 ##################### 
16 
17 # We don't care when this class is executed, it will 
18 # be included at random in the main stage 
19 class doThisWhenever1 { 
20 
21 } 
22 
23 # We don't care when this class is executed either, it will 
24 # be included at random in the main stage 
25 class doThisWhenever2 { 
26 
27 } 
28 
29 # We want this class to be executed before the 
30 # main stage 
31 class doThisFirst { 
32 
33 exec {'firstThingsFirst': 
34  command => '/bin/echo firstThingsFirst', 
35 } 
36 } 
37 
38 # We want this class to be executed after the 
39 # main stage 
40 class doThisLast { 
41 
42 exec {'lastly': 
43  command => '/bin/echo lastly', 
44 } 
45 
46 } 
47 
48 ##################### 
49 # 3) Assign the classes 
50 # to a stage 
51 ##################### 
52 
53 class { 'doThisFirst': 
54 stage => prereqs, 
55 } 
56 
57 class { 'doThisLast': 
58 stage => final, 
59 } 
60 
61 
62 include doThisFirst 
63 include doThisLast 

http://pipe-devnull.com/2013/09/20/puppet-ensure-class-execution-ordering.html

Saludos