8 consejos para una automatización confiable del sistema Linux

La base de esta lista son muchos años de experiencia apoyando la automatización para el equipo de ejecución de contenedores aguas arriba (podman, buildah, skopeo, etc.). No me atribuiré todo el mérito, ya que muchos de estos consejos se basan en una combinación de experiencias avanzadas y contribuciones individuales de una gran comunidad de usuarios y desarrolladores.

La mayoría de los elementos siguientes se pueden resumir en un solo principio:. Este concepto se basa en una aplicación que consiste en: Cuantas más "cosas rompibles" tengas, más probable es que aparezca Murphy. Aquí hay ocho formas de evitar estos encuentros fortuitos.

Índice

    1. Reducir las dependencias de la red

    Reduzca las dependencias de la red, especialmente en servicios de terceros sobre los que no tiene control. Además, los servicios de red de primera y segunda parte deben considerarse "evitar si es posible". En realidad, hay dos aspectos en esta recomendación:

    1. Según todos los informes, la creación de redes es un sistema muy complejo de componentes relacionados y relaciones en tiempo real. En términos generales, todo esto debería funcionar casi sin problemas en todo momento, de lo contrario, podría tener un mal día.
    2. Una vez más, en términos generales, las interrupciones de la red suelen ser transitorias y dependen del tiempo (todos quieren que se solucionen rápidamente). Esto puede hacer que la depuración después del hecho sea increíblemente difícil. Incluso con un registro extenso, los efectos no observados pueden comenzar su mal día.

    2. Reducir las dependencias de software

    Cuando sea posible, reduzca las dependencias de software, especialmente en bibliotecas de terceros. Esto incluye tanto su tema de automatización básico como cualquier código de automatización compartido. A menos que bloquee la versión de cada componente desde la parte superior hasta la parte inferior de la pila, corre el riesgo de sufrir una interrupción debido a un comportamiento inesperado o cambios en la API en alguna parte. La situación es un poco mejor cuando verifica el código incluido, pero aún presenta un riesgo.

    Notar: Admito que este consejo puede ser bastante controvertido y ciertamente no tiene sentido en muchas situaciones. Piense en ello como un recordatorio de "piense dos veces", especialmente cuando desee que una biblioteca incorpore una función simple.

    3. Organiza las tareas de automatización

    Organice las tareas de automatización en orden descendente de las consecuencias de la falla. En otras palabras, intente detectar los elementos con el mayor impacto negativo lo antes posible. La idea aquí es ahorrar recursos (incluido el tiempo) para "whoopsies" de alto impacto a bajo costo de detección. Algunos ejemplos de pruebas de integración continua (CI) de VCS:

    1. ¿Son accesibles sus servicios de red de terceros? Por ejemplo, ¿se les puede hacer ping y se validan sus certificados SSL?
    2. ¿Su proveedor o código incluido realmente coincide con la lista de requisitos documentada y configurada?
    3. ¿Alguien dejó accidentalmente un comentario "FIXME" en el código recién confirmado?
    4. ¿Todos los nuevos commits están firmados?
    5. ¿Los cambios coinciden con el contexto de ejecución, por ejemplo, un cambio no documentado durante la prueba de la versión o documentación faltante/actualizaciones de prueba con un cambio de código?

    Con el tiempo, el efecto de este flujo de trabajo es que los controles importantes recibirán la mayor atención y el mantenimiento más confiable (ya que las fallas tienden a retrasar todo el tren). A su vez, los desarrolladores también podrán circular más rápido. Por ejemplo, no esperarán mucho para descubrir que escribieron mal su propio nombre.

    4. Mantenga los trabajos cortos

    Mantenga los trabajos lo más cortos posible y en "trozos" fácilmente reproducibles. Mucho dependerá del software de orquestación, pero la mayoría de las aplicaciones permiten más de un paso de ejecución. Usando otro ejemplo de prueba de CI, si tiene que ejecutar pruebas unitarias, de integración y de sistema (en ese orden), evite ejecutarlas todas juntas, una a la vez, en un solo script. De esta forma, si falla el paso de integración, los usuarios no tienen que volver a ejecutar las pruebas unitarias. Esto mejora la confiabilidad al no volver a ejecutar operaciones redundantes, lo que incita innecesariamente a Murphy a volver a ingresar al tren de engranajes de automatización.

    5. Evitar operaciones no imprescindibles para la ejecución

    Evite operaciones no esenciales (como instalación o configuración) mientras se ejecuta. En su lugar, prepare sus entornos de tiempo de ejecución con todos los elementos necesarios por adelantado. Esto no solo hace que las cosas sean más eficientes, sino que también ayuda a cumplir con los otros consejos de este artículo. También le permite observar y probar el entorno preconstruido en el momento de la construcción. Si sus entornos se comparten entre tareas con diferentes requisitos, considere almacenar en caché estos componentes/paquetes en la imagen. La instalación en tiempo de ejecución desde un caché local es mucho más segura y confiable que acceder a un repositorio remoto a través de la red.

    6. Utiliza las herramientas adecuadas

    Utilice las herramientas más básicas disponibles para la tarea en cuestión. Por ejemplo, si necesita verificar indicadores binarios después de aplicar una máscara de bits, no intente hacerlo en un script bash. Del mismo modo, si su programa C ++ simplemente ejecuta una serie de comandos, use bash en su lugar. Esto mejora la confiabilidad al no exponer las operaciones a efectos secundarios no relacionados con el propósito principal del trabajo.

    7. Seguimiento de fallas

    Realice un seguimiento de los fallos en función de la frecuencia de su firma. La mayoría de las veces (pero no siempre), las fallas de automatización harán que se guarde una pista en alguna parte. Identifíquelos y clasifíquelos (por ejemplo, por nombre de solicitud) para que pueda mantener un registro centralizado de la ocurrencia. Podría decirse que lleva bastante trabajo completarlo, lo que quizás requiera que aprenda e interactúe con múltiples servicios y API. Sin embargo, con los resultados ordenados por frecuencia de firmas, podrá detectar rápidamente qué problemas afectan a la mayoría de las personas. Estos elementos deben recibir la mayor atención y tendrán el mayor impacto en la confiabilidad de la automatización.

    8. Usa los comentarios de manera efectiva

    comentario nro. Suponga que cualquier lector de su código puede determinar cómo funciona. No pueden determinar lo que usted (el autor) pensó cuando escribió el código. La automatización involucra muchas partes móviles. Algunas de las relaciones pueden no ser obvias para un lector no iniciado. Los comentarios son particularmente útiles cuando informan sobre las relaciones entre los componentes.

    Por ejemplo, considere el siguiente comentario:

    # Default variable value comes from CI unless executed manually.
    # Detect this (`$CI == false`) to ensure the user did not leave
    # the value blank.

    Podrías imaginar fácilmente el código que lo adorna, alguna forma de definición o validación de variables. Además, se refería a una fuente adicional de información, "CI" (lo que sea que eso signifique en el contexto del guión).

    Comentarios útiles como este no necesitan adornar cada línea de su guión; apuntarlos. Concéntrese en los elementos afectados por archivos o fuerzas externas (incluidas las erupciones solares). Estos detalles hacen que la automatización sea más confiable al garantizar que la "salsa secreta" se transmita continuamente a cualquier persona responsable de futuras actualizaciones o mantenimiento.

    Conclusión

    En la mayoría de las situaciones, será imposible seguir todos estos consejos. Están destinados a servir como pautas para el compromiso cuando las implementaciones alternativas son razonables. De lo contrario, para servir mejor a sus partes interesadas, a veces será necesario violar algunos de estos principios. Sin embargo, otros (como escribir excelentes críticas) tenderán a tener un efecto sutil pero constante con el tiempo. Seré el primero en admitir que mantenerlo simple a menudo es mucho más difícil que poner cinta adhesiva. Sin embargo, con el tiempo, la mayoría de las cintas adhesivas se secan y se vuelven crujientes, lo que obliga a solucionar el problema nuevamente. Hazte un favor a ti mismo en el futuro, pasa el tiempo refactorizando hacia la simplicidad desde el principio.

    Artículos de interés

    Subir