chef - usar - Anulación de atributos en la receta
usar atributo alt en html (3)
Digamos que tengo un atributo predeterminado en un libro de cocina:
default.nginx_upstreams = {
''service1'' => [''service1.server.com''],
''service2'' => [''service2.server.com''],
}
Luego se modifica y se anula en roles y entornos hasta que finalmente llega a mi receta. Allí, calculo algunos servicios adicionales que me gustaría agregar al atributo. Si hago algo como esto:
node.nginx_upstreams.merge! {''service3'' => [''service3.server.com'']}
luego, cuando trato de usar el atributo en mi plantilla, obtengo un undefined method ''each'' for nil:NilClass
en mi plantilla cuando intento hacerlo
<% node.nginx_upstreams.each do |name, servers| %>
Además, también recibo una WARN: Setting attributes without specifying a precedence is deprecated and will be removed in Chef 11.0
. La útil advertencia me dice cómo establecer atributos en precedencia normal (aparentemente, usando node.set["key"] = "value"
, pero no me dice cómo especificar los atributos predeterminados o anular).
Puedo evitar este problema haciendo algo como esto:
upstreams = node.nginx_upstreams.to_hash
upstreams.merge! {''service3'' => [''service3.server.com'']}
template "nginx_config" do
variables({:upstreams=>upstreams})
end
pero eso se siente como un truco. No puedo encontrar ninguna documentación en node.set()
más allá de esta página , que también indica que puede establecer los atributos normales y anular en la receta, pero no dice cómo.
Entonces ... ¿cómo se establecen adecuadamente los atributos (que se fusionan en profundidad junto con todo lo demás) desde el interior de la receta? ¿Qué hace realmente la llamada node.set()
y puedo decirle la precedencia en la que deseo fusionarme?
Entonces, después de cavar, encontré la respuesta:
node.set
Use node.default
(o quizás node.override) en lugar de node.set porque node.set es un alias para node.normal. Los datos normales persisten en el objeto nodo. Por lo tanto, el uso de node.set persistirá en los datos en el objeto nodo. Si el código que usa node.set se elimina más adelante, si esos datos ya se han establecido en el nodo, se mantendrá.
Los atributos normales y de anulación se borran al inicio de la ejecución chef-cliente, y luego se reconstruyen como parte de la ejecución en función del código en los libros de cocina y las recetas en ese momento.
node.set
(y node.normal
) solo deberían usarse para generar algo así como generar una contraseña para una base de datos en la primera ejecución chef-cliente, después de lo cual se recuerda (en lugar de persistir). Incluso este caso debe evitarse, ya que usar una bolsa de datos es la forma recomendada de almacenar este tipo de datos.
Solo quería dar más información sobre los atributos del Chef, es muy importante para los usuarios, que remitirán esta pregunta a la anulación de atributos del nodo.
File Methods corresponde a los atributos
Use los siguientes métodos dentro del archivo de atributos para un libro de cocina o dentro de una receta. Estos métodos corresponden al tipo de atributo del mismo nombre:
- anular
- defecto
- normal (o set, donde set es un alias para normal)
- _a no ser que
- ¿atributo?
Precedencia del atributo
Los atributos siempre son aplicados por el chef-cliente en el siguiente orden:
- Un atributo predeterminado ubicado en un archivo de atributos de libro de cocina
- Un atributo predeterminado ubicado en una receta
- Un atributo predeterminado ubicado en un entorno
- Un atributo predeterminado ubicado en el rol
- Un atributo force_default ubicado en un archivo de atributos de libro de cocina
- Un atributo force_default ubicado en una receta
- Un atributo normal ubicado en un archivo de atributos de libro de cocina
- Un atributo normal ubicado en una receta
- Un atributo de anulación ubicado en un archivo de atributos de libro de cocina
- Un atributo de reemplazo ubicado en una receta
- Un atributo de reemplazo ubicado en un rol
- Un atributo de sustitución ubicado en un entorno
- Un atributo force_override ubicado en un archivo de atributos de libro de cocina
- Un atributo force_override ubicado en una receta
- Un atributo automático identificado por Ohai al inicio de la ejecución chef-cliente
donde el último atributo en la lista es el que se aplica al nodo.
Significa que, el atributo OHAI tendrá la precedencia más alta, mientras que el atributo predeterminado en el archivo de atributos del libro de cocina tendrá la precedencia más baja.
Nota: proporcionó los detalles importantes de los documentos de Chef para los attributes para el beneficio de los usuarios. Porque a veces la URL se moverá o no será válida.
default.nginx_upstreams
es lo mismo que default[:nginx_upstreams]
y por default[''nginx_upstreams'']
- la convención es usar 1 de los dos últimos. Y a medida que usa cadenas más, úselas aquí también.
La forma en que nginx_upstreams
en el archivo de atributos es lo mismo que hacerlo de esta manera:
default[''nginx_upstreams''][''service1''] = [''service1.server.com'']
default[''nginx_upstreams''][''service2''] = [''service2.server.com'']
Y no tiene que default[''nginx_upstreams''] = {}
antes de eso. Estos no son hashes, sino atributos, y son mucho más inteligentes. :)
La modificación de atributos desde dentro de la receta se hace así:
node.default[''nginx_upstreams''][''service3''] = [''service3.server.com'']
Puede usar set
o override
lugar de default
aquí, si necesita cambiar la precedencia. Omitir el nombre de precedencia ( node[''nginx_upstreams'']
o node.nginx_upstreams
) usará el set
precedencia. Pero esto está en desuso y pronto será eliminado; de eso se trata la advertencia. Consulte la página del manual sobre atributos , porque todo está realmente allí.