www traductor spanishdict significa que planes palabras ingles español diccionario confiable buscar puppet

puppet - significa - traductor spanishdict



herencia de títeres VS composición de títeres (2)

Acabo de llegar a la herencia títere últimamente. Algunas preguntas a su alrededor:

  1. ¿Es una buena práctica usar la herencia de títeres? Algunos de los títeres con experiencia me han dicho que la herencia en títeres no es muy buena, no estaba del todo convencido.

  2. Viniendo de OO world, realmente quiero entender a escondidas, cómo funciona la herencia de títeres, cómo funciona la anulación.


  1. Eso depende, ya que hay dos tipos de herencia y no mencionas lo que quieres decir.

    1. Herencia de nodo: heredar de una node fqdn { } a otra. Esto, en particular, se recomienda encarecidamente, ya que tiende a fallar el principio de menos sorpresa . El ejemplo clásico que atrapa a la gente es este:

      node base { $mta_config = "main.cf.normal" include mta::postfix # uses $mta_config internally } node mailserver inherits base { $mta_config = "main.cf.mailserver" }

      La variable $mta_config se evalúa en el ámbito base, por lo que la "anulación" que se está intentando en el servidor de correo no funciona.

      No hay manera de influir directamente en lo que está en el nodo principal, por lo que hay poco beneficio sobre la composición. Este ejemplo se solucionaría eliminando la herencia e incluyendo mta::postfix (u otra clase "común" / "base") de ambos. También podrías usar clases parametrizadas .

    2. Herencia de clase: el uso de la herencia de clase es que puede anular los parámetros en los recursos definidos en una clase padre. Reimplementando el ejemplo anterior de esta manera, obtenemos:

      class mta::postfix { file { "/etc/postfix/main.cf": source => "puppet:///modules/mta/main.cf.normal", } service { ... } } class mta::postfix::server inherits mta::postfix { File["/etc/postfix/main.cf"]: source => "puppet:///modules/mta/main.cf.server", } # other config... }

      Esto funciona, pero evitaría profundizar más de un nivel de herencia, ya que se convierte en un dolor de cabeza para mantener.

    3. Sin embargo, en ambos de estos ejemplos, se mejoran fácilmente al especificar los datos con anticipación (a través de un ENC) o al consultar los datos en línea a través de extlookup o hiera.

  2. Esperemos que los ejemplos anteriores ayuden. La herencia de clase solo permite la anulación de parámetros, no puede eliminar recursos previamente definidos (una pregunta común). Siempre consulte el recurso con un nombre de tipo en mayúscula (el file { ..: } se convertirá en File[..] ).

    También es útil que también pueda definir los parámetros para que sean undef , anulándolos efectivamente.


Al principio, solo estoy especificando las diferencias entre los dos, la herencia es una relación "is-a" y la composición es una relación "has-a".

1) En la herencia títere es una herencia única, lo que significa que no podemos derivar de más de una clase. La herencia es buena en el títere, pero debemos ser conscientes de dónde se aplica. Por ejemplo, la sección de documentos de Puppet ["Aparte: Cuándo heredar" en este enlace https://docs.puppetlabs.com/puppet/latest/reference/lang_classes.html#aside-when-to-inherit] , en realidad lo nombran exactamente Dos situaciones donde debe suceder la herencia:

  • cuando desee sobrescribir un parámetro de un recurso definido en la clase principal
  • cuando desee heredar de una clase de parámetros para valores de parámetros estándar

Pero tenga en cuenta algunas cosas importantes aquí:

2) Por otro lado, la composición es la técnica de diseño para implementar la relación has-a. lo que podemos hacer usando la palabra clave include puppet y también, con la clase {''baseclass'':} , la última es, si desea usar parámetros.

( Tenga en cuenta : En Puppet, podemos usar "include" varias veces pero no la sintaxis de "class" , ya que Puppet se quejará con definiciones de clase duplicadas)

Por lo tanto, es mejor usar (ya sea herencia o composición) en Títere : depende del contexto al que me refiero, qué código de títere está escribiendo en este momento y de entender las limitaciones de la herencia de títeres y cuándo usar la composición.

Entonces, intentaré mantener todo esto en algunos puntos:

1) Al principio, títere utiliza el modelo de herencia única.

2) En títere, el consenso general sobre la herencia es usarla solo cuando necesita heredar los valores predeterminados de Base / Parent

3) Pero mira este problema donde quieres heredar los valores predeterminados del padre:

class apache { } class tomcat inherits apache { } class mysql inherits tomcat { } class commerceServer inherits mysql { }

A primera vista, esto parece lógico, pero tenga en cuenta que el módulo MySQL ahora está heredando los valores predeterminados y los recursos de la clase tomcat. Esto no solo NO tiene sentido ya que estos servicios no están relacionados, sino que también ofrece una oportunidad para que los errores terminen en sus manifiestos de títeres.

4) Entonces, el mejor enfoque es simplemente realizar una inclusión en cada clase (me refiero a la composición) que desee utilizar, ya que esto elimina todos los problemas de alcance de esta naturaleza.

Conclusión: podemos intentar simplificar nuestros manifiestos de títeres mediante el uso de la herencia, esto podría ser suficiente, pero solo es viable hasta cierto punto. Si su entorno crece a cientos o incluso miles de servidores, conformado por más de 20 o 30 tipos diferentes De servidor, algunos con atributos compartidos y diferencias sutiles, repartidos en múltiples entornos, es probable que termine con una red enmarañada de módulos heredados que no se pueda gestionar. En este punto, la elección obvia es la composición.

Ir a través de estos enlaces, ayuda a entender la composición y la herencia de títeres de buena manera (personalmente me ayudaron):

  1. Designing Puppet - Es realmente bueno, http://www.craigdunn.org/2012/05/239/
  2. Enlace de Wiki: http://en.wikipedia.org/wiki/Composition_over_inheritance
  3. Composición de clases de modelado con clases parametrizadas: https://puppetlabs.com/blog/modeling-class-composition-with-parameterized-classes

Básicamente soy un programador, personalmente soy un gran partidario de la Inversión de control / Inyección de dependencia, que es el concepto / patrón que puede ser posible a través de la composición.