ser saber requisitos que puesto para habilidades gastronomia estudiar ejecutivo debo como caracteristicas actitudes chef continuous-deployment

saber - ¿Cómo abortas/terminas una carrera de Chef?



requisitos para puesto de chef (5)

Chef :: Application.fatal! debe hacer lo que está buscando. Aquí hay un ejemplo de nuestra base de códigos que podría ser útil.

cipher = case key.length when 16 then "AES-128-ECB" when 24 then "AES-192-ECB" when 32 then "AES-256-ECB" else Chef::Application.fatal!("AES Key must be 16, 24, or 32 characters in length but key #{key} has length of #{key.length}") end

Bajo ciertas condiciones, necesito abortar / finalizar un Chef ejecutado con un código de estado distinto de cero, que luego se propagará de regreso a través de nuestra cadena de implementación y, finalmente, a Jenkins, dando como resultado una gran bola roja y gruesa.

¿Cuál es la mejor manera de hacer esto?


La forma recomendada de cancelar o editar una ejecución de Chef es generar una excepción. Aquí hay un ejemplo:

ruby_block "some tricky operation" do block do OperationFoo raise "Operation Foo Failed" if some_condition end end


Para hacer una salida impura durante una carrera solo de chef, intente esto:

bash ''exit'' do code ''killall -9 chef-solo'' end


Para los lectores que llegen a esta pregunta y responden en el futuro que pueden no estar familiarizados con Chef, un Chef ejecuta "converge" el nodo o lo alinea con la política declarada en la (s) receta (s) que está ejecutando. Esto también se llama "convergencia". Esto tiene dos fases, "compilar" y "ejecutar". La fase de compilación es cuando Chef evalúa ("compila") el código Ruby de las recetas, buscando recursos para agregar a la Colección de recursos. Una vez que se completa, "ejecuta" las acciones de cada recurso para ponerlo en el estado deseado. Se ejecutan comandos del sistema, etc.

Erik Hollensbe escribió un excelente recorrido sobre cómo funciona esto en 2013 .

Ahora, para la respuesta:

Hay varias maneras de finalizar una ejecución de Chef, o salir de una receta de Chef, dependiendo de cómo quiera hacerlo, ya que las recetas de Chef son de código Ruby.

Si su objetivo es dejar de procesar una receta en función de una condición, pero continúe con el resto de la ejecución, utilice la palabra clave Ruby de return . Por ejemplo:

file ''/tmp/ponies'' do action :create end return if node[''platform''] == ''windows'' package ''bunnies-and-flowers'' do action :install end

Suponemos que si el sistema es Windows, no tiene un administrador de paquetes que pueda instalar el paquete bunnies-and-flowers, así que volvemos.

Si deseas abortar, el Chef corre por completo

Hay un par de otras cosas que puedes hacer. Chef sale si encuentra una excepción no controlada en cualquier lugar de la ejecución Chef. Por ejemplo, si un recurso de plantilla no puede encontrar su archivo fuente, o si el usuario que ejecuta Chef no tiene permiso para hacer algo como crear un directorio. Esta es la razón por la cual usar raise trabaja para terminar una carrera.

Donde pongas raise cuestiones. Si lo usa en un recurso ruby_block , solo aumentará durante la fase de ejecución en convergencia. Si lo usa fuera de un recurso como el ejemplo de return anterior, ocurrirá durante la fase de compilación.

file ''/tmp/ponies'' do action :create end raise if node[''platform''] == ''windows'' package ''bunnies-and-flowers'' do action :install end

Tal vez tenemos un administrador de paquetes en Windows, y queremos que este paquete esté instalado. El aumento resultará en que Chef salga fatalmente y entregue un rastro de pila.

Otro enfoque es usar Chef::Application.fatal! . Esto registra un mensaje fatal para el registrador de Chef y STDERR, y sale de la aplicación. También puede darle un código de retorno (¿quizás tiene un script que los comprueba?).

Chef::Application.fatal!("Didn''t expect the Spanish Inquistion", 42) if spanish_inquisition

(por supuesto, la spanish_inquisition es generalmente nula ya que nadie lo espera ... estoy divagando ...)

Esto dará como resultado la salida del Chef, el mensaje de registro enviado y el código de retorno 42 del proceso.

Nota : Esto hace que la aplicación completa salga, lo que significa que si se está ejecutando como un servicio demonizado, terminará y, dependiendo de cómo se administre el servicio, puede que vuelva a iniciarse o no. Por ejemplo, un servicio init.d no se reiniciará, pero runit hará un servicio runit .

Dado que las recetas son de Ruby, también puede manejar con gracia las condiciones de error con un bloque begin..rescue .

begin dater = data_bag_item(:basket, "flowers") rescue Net::HTTPServerException # maybe some retry code here? raise "Couldn''t find flowers in the basket, need those to continue!" end

data_bag_item realiza una solicitud HTTP para una bolsa de datos en el servidor Chef, y devolverá una Net::HTTPServerException si hay un problema del servidor (404 no encontrado, 403 no autorizado, etc.). Posiblemente podríamos intentar volver a intentarlo o realizar algún otro manejo, y luego retroceder para raise .

Informes de errores

Simplemente salir y lanzar un rastro de pila está bien si está ejecutando Chef desde la línea de comandos. Sin embargo, si lo está ejecutando en cron o como daemon en unos pocos, o incluso docenas o cientos de máquinas, esta no es una gran manera de mantener la cordura cuando hay problemas.

Ingrese la función del administrador del informe / manejador de excepciones . Puedes usar un controlador para tus carreras de Chef. Todos los manejadores de informes se ejecutan al final de una ejecución Chef. Los manejadores de excepciones se ejecutan al final de una ejecución abortada de Chef. El estado de la ejecución se rastrea y se puede verificar en el controlador, de modo que puede escribir uno que maneje ambos tipos de ejecución (exitosa / completa o fallida / abortada).

La documentación te dice cómo escribir uno. También incluye una lista de manejadores de código abierto disponibles que puede usar para una variedad de servicios, que incluyen:

  • Correo electrónico sobre SMTP
  • IRC
  • Grafito
  • HipChat

Y varios más.


Simplemente use la declaración siguiente cuando desee que el chef termine después de alguna acción:

throw :end_client_run_early

Saldrá sin ningún error.