chef - imagen - ejemplo de atributo alt html
Chef: ¿Cómo invalido los atributos predeterminados en los roles? (6)
Estoy usando el libro de cocina opscode nginx para configurar el servidor nginx en mis nodos. El libro de cocina nginx tiene algunos atributos predeterminados que me gustaría anular en mi función ("servidor web").
Estos son los atributos que me gustaría anular:
default[''nginx''][''version''] = "1.2.2" # in cookbooks/nginx/attributes/default.rb
default[''nginx''][''source''][''prefix''] = "/opt/nginx-#{node[''nginx''][''version'']}" # in cookbooks/nginx/attributes/source.rb
En mi archivo roles / web_server.rb tengo algo como esto:
name "web_server"
description "Setup a web server"
run_list "role[base]", "recipe[nginx]"
override_attributes ''nginx'' => {
''install_method'' => "source",
''version'' => "1.2.3",
''source'' => { "prefix" => "/opt/nginx", "checksum" => nil }
}
Sin embargo, al ejecutar el chef-cliente, la receta nginx ignora mis anulaciones y usa las predeterminadas.
¿Qué estoy haciendo mal aquí?
¡Gracias!
¿Has comprobado el orden de precedencia de los atributos aquí? https://docs.chef.io/attributes.html#attribute-precedence
Asegúrese de que no haya ningún atributo anulado en un nodo directamente en su receta.
¿Has probado con paréntesis? Probé su ejemplo entre paréntesis y anulé los atributos predeterminados.
# your roles/web_server.rb file
override_attributes(
''nginx'' => {
''install_method'' => "source",
''version'' => "1.2.3",
''source'' => { "prefix" => "/opt/nginx", "checksum" => nil }
}
)
De acuerdo con el documento de https://docs.chef.io/attributes.html#attribute-precedence del https://docs.chef.io/attributes.html#attribute-precedence , esto debería funcionar:
name "web_server"
description "Setup a web server"
run_list "role[base]", "recipe[nginx]"
default_attributes ''nginx'' => {
''install_method'' => "source",
''version'' => "1.2.3",
''source'' => { "prefix" => "/opt/nginx", "checksum" => nil }
}
No debe usar override_attributes
en los roles . Una vez que comience a usar anulaciones en lugar de valores predeterminados, terminará rápidamente encontrando que ha usado la anulación más fuerte posible y no tendrá otra forma de anularla. Utilice default_overrides
lugar.
Las reglas de precedencia en torno a los atributos, que usan solo el nivel default
son en realidad bastante similares:
- Si hay uno, se usa el atributo del rol, por ejemplo,
require_two_factor_auth
se fuerza a verdadero condefault_overrides
en elrole[single_sign_on]
, incluso en QA - Si hay uno, se usa el atributo del entorno, por ejemplo,
require_two_factor_auth
se fuerza a verdadero enproduction
- Si hay uno, se usa el atributo de la receta, por ejemplo,
require_two_factor_auth
se establece en true enauth::two_factor
- Finalmente, se utiliza el atributo predeterminado sano del archivo de atributos predeterminado, por ejemplo,
require_two_factor_auth = false
Sin embargo, es extremadamente inusual que se establezca el mismo atributo en esos cuatro lugares. Si el valor correcto del atributo realmente depende de la receta, el rol y el entorno, entonces el valor resultante combina las características de los tres, y se establece un atributo diferente en cada nivel y se combina en la receta.
Si esto no funciona, dos posibilidades son:
- Rol editado no cargado al servidor
- Anulación de la lista de ejecuciones con
chef-client -o "recipe[nginx]"
lugar dechef-client -o role[web_server]
o simplechef-client
Si ese no es el caso, por favor proporcione más detalles. Uso esto todo el tiempo y siempre ha funcionado, y me preocuparía si hubiera casos extremos en los que esto no se comporte como se documenta.
El único problema que puedo adivinar es que estos atributos deben haber sido superados por el atributo force_overridden. También asegúrese de que los atributos que ha superado estén disponibles para la lista de ejecución (ya que soy escéptico sobre la forma en que ha organizado su archivo de rol)
El cuadro de precedencia de atributos [1] muestra que estas cuatro opciones se ubican por encima de su rol:
12. An override attribute located in an environment
13. A force_override attribute located in a cookbook attribute file
14. A force_override attribute located in a recipe
15. An automatic attribute identified by Ohai at the start of the chef-client run
Si esto no parece ser la causa, quizás ayude cambiar el formato. Yo lo escribiría como:
override_attributes(
nginx: {
install_method: ''source'',
version: ''1.2.3'',
source: {
prefix: ''/opt/nginx'',
checksum: [ ],
},
}
)
[1] https://docs.chef.io/attributes.html#attribute-precedence
También puede usar los atributos de anulación en el editor de roles (en la web o en la edición de roles de cuchillo)
{
"name": "web_server",
"description": "nginx version",
"json_class": "Chef::Role",
"default_attributes": {
},
"override_attributes": {
"nginx": {
"version": "1.2.2"
}
},
"chef_type": "role",
"run_list": [
"recipe[]",
"recipe[]"
],
"env_run_lists": {
}
}