Usando atributos no Chef Solo JSON
Pergunta
É possível especificar valores de atributos no JSON do Chef Solo?Eu tenho um solo.json com uma lista de execução e gostaria de especificar os atributos lá.A documentação do Chef parece indicar que deveria ser possível fazer algo como:
{
"hostname": {
"test": "value2"
},
"default_attributes": {
"hostname": {
"test": "value3"
}
},
"override_attributes": {
"hostname": {
"test": "value4"
}
},
"default": {
"hostname": {
"test": "value5"
}
},
"run_list": [
"recipe[hostname::default]"
]
}
Porém, sempre que tento acessar o valor da minha receita:
p node['hostname']['test']
Acabei de obter o valor definido em atributos/default.rb e, se não o definir lá, recebo de volta um valor nulo.
Existe uma maneira de referenciar esses valores?
Solução
O único nível de atributos que você pode armazenar nos dados do nó é normal
, todo o resto é redefinido no início da convergência e reconstruído a partir de funções, ambientes e livros de receitas.Você quer algo assim:
{
"normal": {
"hostname": {
"test": "something"
}
},
"run_list": [
"recipe[hostname::default]"
]
}
Outras dicas
Tentei usar o exemplo acima para definir atributos em um arquivo JSON para chef-solo, e o "normal": {...}
bloco foi completamente ignorado.A lista de execução foi lida, mas os atributos parecem nunca funcionar.
Meu comando é:
chef-solo -c /path/to/config_file.rb -j /path/to/file.json
Meu arquivo JSON:
{
"name": "my_json_file",
"description": "JSON run-list and attributes.",
"normal": {
"my_cookbook": {
"git_branch": "staging"
}
},
"run_list": [
"recipe[my_cookbook::recipe1]",
"recipe[my_cookbook::recipe2]",
]
}
Durante as convergências, o Chef voltou direto aos valores padrão dentro de attributes/default.rb
.Os valores JSON estão sendo inseridos corretamente?Até agora, minha única solução alternativa foi criar uma nova receita para cada "git_branch":
atributo que desejo testar com chef-solo e adicionar essa lista de execução atualizada a um arquivo JSON diferente.Essencialmente, copiar uma receita inteira para alterar uma única node.normal['my_cookbook']['git_branch']
valor.Escusado será dizer que isso não deveria ser uma solução.
Usando Chef 14.0.202
Seguir:
Não definir o nível de precedência do atributo dentro do arquivo JSON com Chef Solo funciona.O JSON deve ser semelhante a este:
{
"name": "my_json_file",
"description": "JSON run-list and attributes.",
"my_cookbook": {
"git_branch": "staging"
},
"run_list": [
"recipe[my_cookbook::recipe1]",
"recipe[my_cookbook::recipe2]",
]
}
Não incluindo o "normal": {...}
ou "default_attributes": {...}
, etc, passarão atributos para chef-solo usar.