Mantengo dos centros de datos y, a medida que una mayor parte de nuestra infraestructura importante comienza a controlarse a través de Puppet, es importante que el Puppet Master trabaje en el segundo sitio en caso de que nuestro sitio primario falle.
Aún mejor sería tener una especie de configuración activa / activa para que los servidores en el segundo sitio no estén sondeando a través de la WAN.
¿Hay algún método estándar de alta disponibilidad de títeres de sitios múltiples?
puppet
high-availability
Kyle Brandt
fuente
fuente
git
osvn
orsync
o cualquier sistema de control de versiones que utilices siendo lo que necesitas para escalar en lugar del maestro de marionetas.Respuestas:
Puppet en realidad se presta bastante bien a entornos multi-master, con advertencias. ¿El principal? A muchas partes de Puppet les gusta estar centralizadas. La autoridad de certificación, el inventario y los servicios de tablero / informe, el almacenamiento de archivos y las configuraciones almacenadas, todos ellos están en su mejor momento (o simplemente requieren) una configuración donde solo hay un lugar para que puedan hablar.
Sin embargo, es bastante factible hacer que muchas de esas piezas móviles funcionen en un entorno multimaestro, si está de acuerdo con la pérdida elegante de algunas de las funciones cuando ha perdido su sitio principal.
Comencemos con la funcionalidad base para obtener un nodo que informa a un maestro:
Módulos y Manifiestos
Esta parte es simple. La versión los controla. Si se trata de un sistema de control de versiones distribuido, simplemente centralice y sincronice, y modifique su flujo de inserción / extracción según sea necesario en el sitio de conmutación por error. Si se trata de Subversion, entonces probablemente querrá
svnsync
el repositorio en su sitio de failover.Autoridad certificada
Una opción aquí es simplemente sincronizar los archivos de autoridad de certificación entre los maestros, para que todos compartan el mismo certificado raíz y puedan firmar certificados. Esto siempre me ha parecido "hacerlo mal";
Honestamente, no puedo decir que he hecho pruebas exhaustivas de esta opción, ya que parece horrible. Sin embargo, parece que Puppet Labs no está buscando alentar esta opción, según la nota aquí .
Entonces, lo que deja es tener un maestro de CA central. Todas las relaciones de confianza siguen funcionando cuando la CA está inactiva ya que todos los clientes y otros maestros almacenan en caché el certificado de la CA y la CRL (aunque no actualizan la CRL tan a menudo como deberían), pero no podrá firmar nuevos certificados hasta obtiene una copia de seguridad del sitio primario o restaura el maestro de CA a partir de copias de seguridad en el sitio de conmutación por error.
Escogerá un maestro para que actúe como CA y hará que todos los demás maestros lo deshabiliten:
Entonces, querrá que ese sistema central obtenga todo el tráfico relacionado con los certificados. Hay algunas opciones para esto;
SRV
soporte de registros en 3.0 para apuntar todos los nodos de agente al lugar correcto para la CA:_x-puppet-ca._tcp.example.com
ca_server
opción de configuración en elpuppet.conf
de todos los agentesProxy todo el tráfico para solicitudes relacionadas con CA de agentes en el maestro correcto. Por ejemplo, si está ejecutando todos sus maestros en Apache a través de Passenger, configúrelo en los no CA:
Y eso debería hacerlo.
Antes de pasar a los servicios auxiliares, una nota al margen;
Nombres DNS para certificados maestros
Creo que esto es la razón más convincente para pasar a 3.0. Supongamos que desea apuntar un nodo a "cualquier antiguo maestro de trabajo".
Bajo 2.7, necesitaría un nombre DNS genérico como
puppet.example.com
, y todos los maestros lo necesitan en su certificado. Eso significa establecerdns_alt_names
en su configuración, volver a emitir el certificado que tenían antes de que se configuraran como maestro, volver a emitir el certificado nuevamente cuando necesite agregar un nuevo nombre DNS a la lista (como si quisiera tener varios nombres DNS para tienen agentes prefieren maestros en su sitio) .. feo.Con 3.0, puede usar
SRV
registros. Dale a todos tus clientes esto;Entonces, no se necesitan certificados especiales para los maestros: solo agregue un nuevo registro a su
SRV
RR en_x-puppet._tcp.example.com
y listo, es un maestro en vivo en el grupo. Mejor aún, puede hacer que la lógica de selección maestra sea más sofisticada; "cualquier antiguo maestro que trabaje, pero prefiera el que está en su sitio" al configurar diferentes conjuntos deSRV
registros para diferentes sitios; no esdns_alt_names
necesarioInformes / Panel de control
Este funciona mejor centralizado, pero si puedes vivir sin él cuando tu sitio principal está inactivo, entonces no hay problema. Simplemente configure todos sus maestros con el lugar correcto para colocar los informes.
..y ya está todo listo. No cargar un informe no es fatal para la ejecución de la configuración; simplemente se perderá si las tostadas del servidor del tablero de instrumentos.
Inventario de hechos
Otra cosa buena que hayas pegado en tu tablero es el servicio de inventario. Con el
facts_terminus
conjuntorest
según lo recomendado en la documentación, esto realmente interrumpirá las ejecuciones de configuración cuando el servicio de inventario central esté inactivo. El truco aquí es usar elinventory_service
término en los maestros no centrales, lo que permite una falla graciosa.Tenga su servidor de inventario central configurado para almacenar los datos de inventario a través de ActiveRecord o PuppetDB, y debe mantenerse actualizado siempre que el servicio esté disponible.
Entonces, si está de acuerdo con tener un entorno de administración de configuración bastante básico donde ni siquiera puede usar la CA para firmar un nuevo certificado de nodo hasta que se restaure, entonces esto puede funcionar bien, aunque sería realmente bueno si algunos de estos componentes fueran un poco más amigables para ser distribuidos .
fuente
SRV
registro en consecuencia - losSRV
registros meEl enfoque de "títere sin maestro" que describe Ladadadada es con el que estoy más familiarizado (es básicamente lo que hacemos con radmind en mi empresa). Creo que con mayor precisión es "Maestros múltiples sincronizados por un proceso externo", donde cualquier servidor podría (en teoría) servir a todo nuestro universo en una emergencia.
En nuestro caso, debido a la naturaleza de radmind, simplemente
rsync
las transcripciones y los archivos de datos de un maestro aprobado al servidor radmind de cada sitio remoto, y los clientes extraen sus actualizaciones del servidor con un nombre de host cortoradmind
(a través de la magia deresolv.conf
esto se evalúa comoradmind.[sitename].mycompany.com
siempre local). servidor radmind. Si el servidor local está caído, es bastante fácil anular y apuntar a cualquier otro servidor del sitio).Este tipo de proceso rsync probablemente también funcionaría en su situación, pero probablemente sea subóptimo en comparación con una solución basada en control de versiones.
Para títeres o chefs, un sistema basado en el control de versiones tiene más sentido que el simple rsync por varias razones: la principal es que estás controlando las versiones de scripts de títeres (en lugar de imágenes completas del sistema operativo como lo harías con radmind).
Como beneficios adicionales de la administración basada en el control de versiones, puede hacer que varias personas trabajen en el repositorio a la vez (una gran victoria para el paralelismo), obtiene el historial de revisiones esencialmente de forma gratuita, y si alguien rompe el entorno de Puppet, tiene una reversión fácil (suponiendo que usted ' lo
git
estás usando también tienesgit blame
que hace lo que dice en la lata).La ramificación y fusión creativa incluso le permite manejar una importante actualización del sistema operativo u otra transición dentro del marco de control de versiones: una vez que lo haga correctamente, simplemente cambie a la nueva rama y (con suerte) el impulso de producción simplemente funcionará.
Si implementara esto aquí, probablemente aprovecharía los ganchos de pre-commit y post-commit en git para asegurar que las configuraciones de títeres que se están comprometiendo sean sanas (pre-lado del cliente) y las empuje al resto del universo si are (publicación del lado del servidor, posiblemente también desencadenando una actualización del entorno si sus políticas de implementación permiten tal comportamiento).
En términos de abrir nuevos servidores de puppetmaster en cada sitio, simplemente puede consultar el entorno de puppet para cada puppetmaster remoto y usar la piratería resolv.conf / hostname que describí anteriormente o cualquier IP de servicio de difusión redirigida a sistemas locales como sugirió Michuelnik ( este último es útil si desea una conmutación por error automática si el maestro de marionetas de un sitio explota) para asegurarse de que cada sitio vea al maestro de marionetas "correcto" y no obstruya sus enlaces WAN al intentar obtener actualizaciones.
La gente de Brain Tree Payments aparentemente ha combinado el control de versiones y las soluciones rsync junto con algunas tareas personalizadas de Capistrano: su solución parece estar a medias en el sentido de que todavía se basa en elementos de flujo de trabajo manual, pero podría adaptarse y automatizarse sin demasiado trabajo.
El probador compulsivo paranoico en mí tiene una afición por su
noop
paso de verificación de cordura: el que odia los procesos manuales en mí desea un cierto nivel de automatización a su alrededor ...fuente