Estou tentando criar um módulo de fantoches sensu_client
que instala e configura o cliente sensu em uma instância.
A estrutura de diretórios do módulo é assim:
.
|-- examples
|-- files
| |-- client-ssl
| |-- custom_plugins
| | |-- common
| | '-- <env>
| '-- default_plugins
|-- manifests
|-- spec
| '-- classes
'-- templates
'-- custom_plugins
|-- common
'-- <env>
Pastas e suas descrições são algo assim:
files/default_plugins/
: plugins padrão da internet
files/custom_plugins/common
: plugins que escrevemos, independentemente do ambiente
files/custom_plugins/<env>
: plugins específicos do ambiente que escrevemos
e a mesma ideia para o diretório de modelos.
Se possível, gostaria de copiar todos esses plugins para a mesma pasta /etc/sensu/plugins
em clientes porque em nossos outros ambientes (que gerenciamos usando ansible), padronizamos a localização do plugin sensu para ser a pasta /etc/sensu/plugins
.
Quando executo o manifesto que escrevi, recebo esta mensagem de erro:
Error: Could not retrieve catalog from remote server: Error 400 on SERVER: Evaluation Error: Error while evaluating a Resource Statement, Cannot alias File[copy common custom plugins] to ["/etc/sensu/plugins/"] at /etc/puppetlabs/code/environments/<env>/modules/sensu_client/manifests/config.pp:46; resource ["File", "/etc/sensu/plugins/"] already declared at /etc/puppetlabs/code/environments/<env>/modules/sensu_client/manifests/config.pp:46 at /etc/puppetlabs/code/environments/<env>/modules/sensu_client/manifests/config.pp:46:3 on node <fqdn>
que é óbvio agora, porque eu tenho vários blocos de arquivos em que estou tentando copiar arquivos / modelos para o diretório /etc/sensu/plugins
.
Vocês podem me indicar a maneira recomendada de fazer isso?
Outra pequena coisa relacionada que estou tentando alcançar, mas não sendo feita, é isso. Eu quero gerar /etc/sensu/conf.d/client.json
arquivo que se parece com isso
{
"client": {
"name": "<hostname>",
"address": "<ip address>",
"subscriptions": ["<hostname>", "all", "<env>", "<service>"]
}
}
Existem dois ambientes em que executamos o fantoche, e a convenção de nomenclatura segue esse padrão.
Ambiente 1: o FQDN é <env>-<service><index>.<domain-name1>.tld
e o nome do host é <env>-<service><index>
Ambiente 2: o FQDN é <service><index>.<domain-name2>.tld
e o nome do host é <service><index>
Meu arquivo de modelo para o mesmo se parece com isto:
{
"client": {
"name": "<%= @hostname %>",
"address": "<%= @ipaddress %>",
"subscriptions": <%= @pr_subscription_array %>
}
}
onde estou recebendo o pr_subscription_array no meu manifesto usando este bloco:
$pr_service_name = regsubst("${facts[hostname]}", '^(.*?)-([a-zA-Z]*)[0-9]*', '')
$pr_subscription_array = [ "${facts[hostname]}", "all", "${facts['agent_specified_environment']}", "$pr_service_name" ]
Isso está gerando a assinatura assim: "subscriptions": ["<hostname>", "all", "<env>", "<service><index>"]
Algumas informações sobre como o campo de serviço não está sendo exibido corretamente. Ele vem com o número do índice. Alguma sugestão sobre como fazer isso usando fantoche?
Obrigado antecipadamente.
Tags puppet