Ejemplo 5: Uso de atributos - 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 5: Uso de atributos

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 existentes. 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.

Las recetas de las secciones anteriores utilizan valores rígidos para todo lo que no sea la plataforma. Este enfoque es poco eficiente si, por ejemplo, desea utilizar el mismo valor en más de una receta. Puede definir los valores fuera de las recetas incluyendo un archivo de atributos en su libro de recetas.

Un archivo de atributos es una aplicación de Ruby que asigna valores a uno o varios atributos. Tiene que estar en la carpeta attributes del libro de recetas. Chef incorpora los atributos en el objeto de nodo y cualquier receta puede utilizar los valores de atributo haciendo referencia al atributo. En este tema se muestra cómo modificar la receta de Iteración para utilizar los atributos. Aquí tenemos la receta original como referencia.

[ "/srv/www/config", "/srv/www/shared" ].each do |path| directory path do mode 0755 owner 'root' group 'root' recursive true action :create end end

El ejemplo que se muestra a continuación define atributos para el nombre, el modo, el propietario y los valores de grupo del subdirectorio.

default['createdir']['shared_dir'] = 'shared' default['createdir']['config_dir'] = 'config' default['createdir']['mode'] = 0755 default['createdir']['owner'] = 'root' default['createdir']['group'] = 'root'

Tenga en cuenta lo siguiente:

  • Cada definición comienza por un tipo de atributo.

    Si un atributo está definido más de una vez, quizá en archivos de atributos diferentes, el tipo de atributo sirve para especificar la prioridad del atributo, lo que determina qué definición se integrará en el objeto de nodo. Para obtener más información, consulte Prioridad de los atributos. Todas las definiciones de este ejemplo tienen el tipo de atributo default, que es el tipo que se suele utilizar para este propósito.

  • Los atributos tienen nombres anidados.

    El objeto de nodo es básicamente una tabla hash que se puede anidar profundamente de forma arbitraria, por lo que los nombres de atributo pueden y suelen estar anidados. Este archivo de atributos aplica la práctica estándar de usar un nombre anidado con el nombre del libro de recetas, createdir, como el primer elemento.

El motivo para utilizar createdir como primer elemento del atributo es que cuando se ejecuta Chef, este incorpora los atributos de todos los libros de recetas en el objeto de nodo. Con AWS OpsWorks Stacks, el objeto de nodo incluye una gran cantidad de atributos de los libros de cocina integrados, además de los atributos que tú definas. Si se incluye el nombre del libro de recetas en el nombre del atributo, se reducirá el riesgo de que se produzca un conflicto de nombre con los atributos de otro libro de recetas, en especial si el atributo tiene un nombre como port o user. No dé a un atributo un nombre como [:apache2][:user], por ejemplo, a menos que desee anular el valor de dicho atributo. Para obtener más información, consulte Uso de atributos personalizados del libro de recetas.

En el ejemplo siguiente se muestra la receta original con atributos en lugar de utilizar valores rígidos.

[ "/srv/www/#{node['createdir']['shared_dir']}", "/srv/www/#{node['createdir']['config_dir']}" ].each do |path| directory path do mode node['createdir']['mode'] owner node['createdir']['owner'] group node['createdir']['group'] recursive true action :create end end
nota

Si desea integrar el valor de un atributo en una cadena, póngalo entre #{}. En el ejemplo anterior, #{node['createdir']['shared_dir']} anexa "shared" a "/srv/www/".

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

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

  3. Cree un subdirectorio de createdir denominado attributes y añada un archivo denominado default.rb que contenga las definiciones de atributo.

  4. Edite .kitchen.yml para eliminar CentOS de la lista de plataformas.

  5. Ejecute kitchen converge y, a continuación, inicie sesión en la instancia y compruebe que contenga /srv/www/shared y /srv/www/config.

nota

Con AWS OpsWorks Stacks, definir valores como atributos ofrece una ventaja adicional: puedes usar un JSON personalizado para anular esos valores por pila o incluso por despliegue. Esto puede resultar útil para diferentes fines, entre otros, los siguientes:

  • Puede personalizar el comportamiento de las recetas, como las opciones de configuración o los nombres de usuario, sin tener que modificar el libro de recetas.

    Puede, por ejemplo, utilizar el mismo libro de recetas para distintas pilas y utilizar el JSON personalizado para especificar opciones de configuración clave de una pila determinada. Esto le permite ahorrar el tiempo y los esfuerzos necesarios para modificar el libro de recetas o utilizar un libro de recetas diferente para cada pila.

  • No tiene que poner información potencialmente confidencial como, por ejemplo, contraseñas de la base de datos, en el repositorio del libro de rectas.

    En su lugar, puede utilizar un atributo para definir un valor predeterminado y después utilizar el JSON personalizado para anular dicho valor y utilizar el verdadero valor.

Para obtener más información acerca de cómo utilizar un JSON personalizado para anular atributos, consulte Anulación de atributos.

El archivo de atributos se denomina default.rb porque es una aplicación de Ruby, aunque sea bastante sencilla. Esto significa que puede, por ejemplo, utilizar la lógica condicional para especificar valores de atributos en función del sistema operativo. En Lógica condicional, ha especificado otro nombre de subdirectorio para diferentes familias de Linux de la receta. Con un archivo de atributos, puede poner la lógica condicional en este.

El archivo de atributos siguiente utiliza value_for_platform para especificar un valor de atributo ['shared_dir'] diferente en función del sistema operativo. Para otras condiciones, puede utilizar la lógica if-elsif-else de Ruby o una instrucción case.

data_dir = value_for_platform( "centos" => { "default" => "shared" }, "ubuntu" => { "default" => "data" }, "default" => "user_data" ) default['createdir']['shared_dir'] = data_dir default['createdir']['config_dir'] = "config" default['createdir']['mode'] = 0755 default['createdir']['owner'] = 'root' default['createdir']['group'] = 'root'
Para ejecutar la receta
  1. Ejecute kitchen destroy para comenzar por una instancia nueva.

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

  3. Edite .kitchen.yml para añadir una plataforma CentOS a la sección de plataformas, tal y como se describe en Lógica condicional.

  4. Ejecute kitchen converge y, a continuación, inicie sesión en las instancias para comprobar que contengan los directorios.

Cuando haya terminado, ejecute kitchen destroy para terminar la instancia. En el ejemplo siguiente se utiliza un libro de recetas nuevo.