Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

333
Vistas
Chef: pasa valor de un recurso a otro recurso

Aquí hay una parte de mi código Chef Ruby y estoy tratando de pasar un valor de un bloque a otro bloque. Tenemos múltiples puertos ejecutándose en el servidor, el siguiente código verificará el puerto y, si no se está ejecutando, intentará ejecutar el segundo bloque. Adjunto el código y el error. Por favor, ayuda donde me estoy equivocando.

 ports.each do |port| bash "Check_port_running_#{port}" do code <<-EOH pidval=$(ps -ef | grep /opt/redis/src/redis-server | grep *:#{port} | grep -vc grep) if (($pidval == 0));then portval_#{port}=true else portval_#{port}=false fi EOH end bash "Starting_redis_after_crash_for_port - #{port}" do only_if { "portval_#{port}" } code <<-EOH rm -f #{port}.pid sudo service redis@#{port} start EOH end end

Error: obtener el siguiente error

 ================================================================================ Error executing action `run` on resource 'bash[Starting_redis_after_crash_for_port - 54321]' ================================================================================ Errno::ENOENT ------------- No such file or directory - portval_54321 Resource Declaration: --------------------- # In /tmp/kitchen/cache/cookbooks/csg_orderservices_redis/recipes/configure.rb 184: bash "Starting_redis_after_crash_for_port - #{port}" do 185: only_if "portval_#{port}" 186: code <<-EOH 187: rm -f #{port}.pid 188: sudo service redis@#{port} start 189: EOH 190: end 191: end Compiled Resource: ------------------ # Declared in /tmp/kitchen/cache/cookbooks/csg_orderservices_redis/recipes/configure.rb:184:in `block in from_file' bash("Starting_redis_after_crash_for_port - 54321") do action [:run] default_guard_interpreter :default backup 5 interpreter "bash" declared_type :bash cookbook_name "csg_orderservices_redis" recipe_name "configure" code " rm -f 54321.pid\n sudo service redis@54321 start\n" domain nil user nil only_if "portval_54321" end
over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Mi opinión sería evitar el uso de recursos bash para esto. Esto es para garantizar que sus recetas de Chef sean idempotentes y puedan simplificar su código, ya que la mayor parte del trabajo pesado lo realiza el cliente de Chef. Solo uso recursos de bash, powershell, etc. como último recurso.

Aquí está mi sugerencia y ejemplo a continuación:

Cree un archivo de biblioteca llamado redis.rb en su carpeta de bibliotecas dentro del libro de cocina. Prefiero asignar un espacio de nombres a mis bibliotecas para ayudar a organizar mis métodos. Este redis_active? El método se puede usar desde cualquier parte de su libro de cocina donde se incluya este módulo.

bibliotecas/redis.rb:

 # Replace CookbookName with actual cookbook name module CookbookName module Redis include Chef::Mixin::ShellOut def redis_active?(port) cmd = "ps -ef | grep /opt/redis/src/redis-server | grep *:#{port} | grep -vc grep" pid_exists = shell_out(cmd).stdout.strip.to_i return true if pid_exists > 0 end end end

En su receta de redis, el recurso de file solo tomará medidas si redis_active? El método devuelve falso para el puerto especificado, y luego el recurso file convergerá y eliminará el archivo pid. Cuando este recurso converja, notificará al recurso del service que reinicie el servicio del servidor redis inmediatamente.

recetas/redis.rb:

 # Replace CookbookName with actual cookbook name Chef::Resource::File.send(:include, CookbookName::Redis) ports.each do |port| file "/path/to/#{port}.pid" do action :delete not_if { redis_active?(port) } notifies :restart, "service[redis@#{port}]", :immediately end service "redis@#{port}" do action :nothing end end
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda