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
La AWS OpsWorks Stacks El 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 tiene preguntas sobre la migración, póngase en contacto con el AWS Support Equipo en AWS Re:post
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 integradosport
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
-
Ejecute
kitchen destroy
para comenzar por una instancia limpia. -
Sustituya el código de
recipes/default.rb
por el ejemplo de receta anterior. -
Cree un subdirectorio de
createdir
denominadoattributes
y añada un archivo denominadodefault.rb
que contenga las definiciones de atributo. -
Edite
.kitchen.yml
para eliminar CentOS de la lista de plataformas. -
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 Al definir los valores como atributos, se obtiene una ventaja adicional; se puede utilizar la opción personalizada JSON 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.
Puedes, por ejemplo, usar el mismo libro de cocina para distintas pilas y usar la opción personalizada JSON para especificar los ajustes de configuración clave de una pila concreta. 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, puedes usar un atributo para definir un valor predeterminado y, a continuación, usar el personalizado JSON para reemplazar ese valor por el valor real.
Para obtener más información sobre cómo utilizar la personalización JSON para anular los 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
-
Ejecute
kitchen destroy
para comenzar por una instancia nueva. -
Sustituya el código de
attributes/default.rb
por el ejemplo anterior. -
Edite
.kitchen.yml
para añadir una plataforma CentOS a la sección de plataformas, tal y como se describe en Lógica condicional. -
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.