Ejemplo 8: Administración de servicios - AWS OpsWorks

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Ejemplo 8: Administración de servicios

importante

El AWS OpsWorks Stacks servicio llegó al final de su vida útil el 26 de mayo de 2024 y se ha desactivado tanto para los clientes nuevos como para los actuales. Recomendamos encarecidamente a los clientes que migren sus cargas de trabajo a otras soluciones lo antes posible. Si tienes preguntas sobre la migración, ponte en contacto con el AWS Support equipo en AWS Re:post o a través de Premium AWS Support.

Normalmente, los paquetes como servidores de aplicaciones tienen un servicio asociado que debe iniciarse, pararse, reiniciarse, etc. Por ejemplo, debe iniciar el servicio Tomcat después de instalar el paquete o después de que la instancia termine de arrancar, y reiniciar el servicio cada vez que modifique el archivo de configuración. En este tema se abordan los aspectos básicos de cómo administrar un servicio en una instancia de Linux, utilizando como ejemplo un servidor de aplicaciones Tomcat. El recurso del servicio funciona prácticamente de la misma manera en las instancias de Windows, aunque haya algunas diferencias de detalle. Para obtener más información, consulte service.

nota

En el ejemplo se realiza una instalación de Tomcat mínima, lo suficiente para demostrar los aspectos básicos de cómo utilizar un recurso service. Si desea ver un ejemplo de cómo implementar recetas para tener un servidor Tomcat más funcional, consulte Crear una capa personalizada de servidor Tomcat.

Definición e inicio de un servicio

En esta sección se demuestran los aspectos básicos de cómo definir e iniciar un servicio.

Primeros pasos
  1. En el directorio opsworks_cookbooks, cree un directorio llamado tomcat y ábralo.

  2. Añada un archivo metadata.rb a tomcat con el contenido siguiente.

    name "tomcat" version "0.1.0"
  3. Inicialice y configure Test Kitchen, tal y como se describe en Ejemplo 1: Instalación de paquetes, y elimine CentOS de la lista platforms.

  4. Añada un subdirectorio recipes a tomcat.

Se utiliza un recurso service para administrar un servicio. La siguiente receta predeterminada instala Tomcat e inicia el servicio.

execute "install_updates" do command "apt-get update" end package "tomcat7" do action :install end include_recipe 'tomcat::service' service 'tomcat' do action :start end

La receta hace lo siguiente:

  • El recurso execute ejecuta apt-get update para instalar las actualizaciones del sistema actuales.

    Para la instancia de Ubuntu utilizada en este ejemplo, debe instalar las actualizaciones antes de instalar Tomcat. Es posible que otros sistemas tengan requisitos diferentes.

  • El recurso package instala Tomcat 7.

  • La receta tomcat::service incluida define el servicio y se trata más adelante.

  • El recurso service inicia el servicio Tomcat.

    También puede utilizar este recurso para ejecutar otros comandos, como parar o reiniciar el servicio.

En el ejemplo siguiente se demuestra la receta tomcat::service.

service 'tomcat' do service_name "tomcat7" supports :restart => true, :reload => false, :status => true action :nothing end

Esta receta crea la definición del servicio Tomcat de la siguiente manera:

  • Otros recursos utilizan el nombre del recurso, tomcat, para hacer referencia el servicio.

    Por ejemplo, default.rb hace referencia a tomcat para iniciar el servicio.

  • El recurso service_name especifica el nombre del servicio.

    Cuando genera una lista de los servicios de la instancia, el servicio Tomcat recibe el nombre tomcat7.

  • supports especifica cómo Chef administra los comandos restart, reload y status del servicio.

    • true indica que Chef puede utilizar el script init u otro proveedor de servicios para ejecutar el comando.

    • false indica que Chef debe intentar ejecutar el comando por otros medios.

Observe que action está establecido en :nothing, lo que indica al recurso que no debe realizar ninguna acción. El recurso de servicio es compatible con acciones como start y restart. Sin embargo, este libro de recetas sigue una práctica estándar de utilizar una definición de servicio que no tiene acción e iniciar o reiniciar el servicio en otro punto. Cada receta que empieza o reinicia un servicio primero debe definirlo, por lo que el enfoque más sencillo es poner la definición del servicio en una receta independiente e incluirla en otras recetas según las necesidades.

nota

En aras a la sencillez, la receta predeterminada de este ejemplo utiliza un recurso service para iniciar el servicio después de ejecutar la definición del servicio. Normalmente, una implementación de producción inicia o reinicia un servicio mediante notifies, tal y como se explica más adelante.

Para ejecutar la receta
  1. Cree un archivo default.rb que contenga el ejemplo de receta predeterminado y guárdelo en recipes.

  2. Cree un archivo service.rb que contenga el ejemplo de definición del servicio y guárdelo en recipes.

  3. Ejecute kitchen converge y, a continuación, inicie sesión en la instancia y ejecute el siguiente comando para verificar que el servicio se esté ejecutando.

    sudo service tomcat7 status
nota

Si estaba ejecutando service.rb por separado de default.rb, tendrá que editar .kitchen.yml para añadir tomcat::service a la lista de ejecución. Sin embargo, cuando incluya una receta, su código se incorpora en la receta de matrices antes de que se ejecute la receta. Por lo tanto, service.rb es básicamente una parte de default.rb y no requiere una entrada de lista de ejecución diferente.

Uso de notifies para iniciar o reiniciar un servicio

Por lo general, las implementaciones de producción no utilizan service para iniciar o reiniciar un servicio. En su lugar, añaden notifies a cualquiera de varios recursos. Por ejemplo, si quiere reiniciar el servicio después de modificar un archivo de configuración, incluya notifies en el recurso template asociado. El uso de notifies para reiniciar explícitamente el servicio reporta las siguientes ventajas en comparación con el uso de un recurso service.

  • El elemento notifies reinicia el servicio únicamente si el archivo de configuración asociado ha cambiado, por lo que no hay riesgo de provocar un reinicio del servicio innecesario.

  • Chef reinicia el servicio como máximo una vez al final de cada ejecución, sea cual sea el número de notifies que la ejecución contenga.

    Por ejemplo, la ejecución de Chef puede incluir varios recursos de plantilla, cada uno de los cuales modifica un archivo de configuración diferente y requiere un reinicio de servicio si el archivo ha cambiado. Ahora bien, normalmente se quiere reiniciar el servicio una única vez, al final de la ejecución de Chef. De lo contrario, es posible que intente reiniciar un servicio que aún no esté totalmente operativo después de un reinicio anterior, lo que puede dar lugar a errores.

En este ejemplo se modifica tomcat::default para incluir un recurso template que utiliza notifies para reiniciar el servicio. Un ejemplo realista utilizaría un recurso de plantilla para crear una versión personalizada de uno de los archivos de configuración de Tomcat, pero son bastante largos y complejos. Para mayor simplicidad, el ejemplo se limita a utilizar el recurso de plantilla de Creación de un archivo a partir de una plantilla. No tiene nada que ver con Tomcat, pero es una forma sencilla de mostrar cómo utilizar notifies. Para ver un ejemplo de cómo utilizar plantillas para crear archivos de configuración de Tomcat, consulte Recetas de instalación.

Para configurar el libro de recetas
  1. Añada un subdirectorio templates a tomcat y un subdirectorio default a templates.

  2. Copie la plantilla example_data.json.erb del libro de recetas createfile en el directorio templates/default.

  3. Añada un subdirectorio attributes a tomcat.

  4. Copie el archivo de atributos default.rb del libro de recetas createfile en el directorio attributes.

En la siguiente receta se utiliza notifies para reiniciar el servicio Tomcat.

execute "install_updates" do command "apt-get update" end package "tomcat7" do action :install end include_recipe 'tomcat::service' service 'tomcat' do action :enable end directory "/srv/www/shared" do mode 0755 owner 'root' group 'root' recursive true action :create end template "/srv/www/shared/example_data.json" do source "example_data.json.erb" mode 0644 variables( :a_boolean_var => true, :a_string_var => "some string" ) only_if {node['createfile']['install_file']} notifies :restart, resources(:service => 'tomcat') end

El ejemplo fusiona la receta de Creación de un archivo a partir de una plantilla en la receta de la sección anterior, con dos cambios importantes:

  • El recurso service sigue existiendo, pero ahora su objetivo es algo diferente.

    La acción :enable habilita el servicio Tomcat al arrancar.

  • Ahora, el recurso de plantilla contiene notifies, lo que permite reiniciar el servicio Tomcat si example_data.json ha cambiado.

    De este modo, se garantiza que el servicio se inicie cuando Tomcat se instale por primera vez y se reinicie después de cada cambio de configuración.

Para ejecutar la receta
  1. Ejecute kitchen destroy para comenzar por una instancia limpia.

  2. Sustituya el código de default.rb por el ejemplo anterior.

  3. Ejecute kitchen converge y, a continuación, inicie sesión en la instancia y verifique que el servicio se esté ejecutando.

nota

Si quiere reiniciar un servicio, pero la receta no contiene un recurso como template que admita notifies, puede utilizar un recurso ficticio execute en su lugar. Por ejemplo

execute 'trigger tomcat service restart' do command 'bin/true' notifies :restart, resources(:service => 'tomcat') end

El recurso execute debe tener un atributo command, incluso si está utilizando el recurso únicamente como forma de ejecutar notifies. Este ejemplo evita este requisito al ejecutar /bin/true, que es un comando de shell que simplemente devuelve un código de éxito.