Я пытаюсь придумать марионеточный модуль sensu_client
который устанавливает и настраивает клиент sensu в экземпляре.
Структура каталогов модуля выглядит так:
.
|-- examples
|-- files
| |-- client-ssl
| |-- custom_plugins
| | |-- common
| | `-- <env>
| `-- default_plugins
|-- manifests
|-- spec
| `-- classes
`-- templates
`-- custom_plugins
|-- common
`-- <env>
Папки и их описания выглядят примерно так:
files/default_plugins/
: плагины по умолчанию из Интернета
files/custom_plugins/common
: плагины, которые мы пишем, независимо от среды
files/custom_plugins/<env>
: плагины для конкретной среды, которые мы пишем
и та же идея для каталога шаблонов.
Если возможно, я хотел бы скопировать все эти плагины в ту же папку /etc/sensu/plugins
в клиентах, потому что в других наших средах (которыми мы управляем с помощью ansible) мы стандартизировали расположение плагина sensu, чтобы /etc/sensu/plugins
папка.
Когда я запускаю написанный мной манифест, я получаю следующее сообщение об ошибке:
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>
что сейчас очевидно, потому что у меня есть несколько файловых блоков, в которые я пытаюсь скопировать файлы / шаблоны в /etc/sensu/plugins
каталог.
Не могли бы вы, ребята, указать мне рекомендуемый способ сделать это?
Еще одна небольшая вещь, которую я пытаюсь достичь, но не достигаю, - это вот что. Я хочу создать /etc/sensu/conf.d/client.json
файл, который выглядит примерно так
{
"client": {
"name": "<hostname>",
"address": "<ip address>",
"subscriptions": ["<hostname>", "all", "<env>", "<service>"]
}
}
Мы запускаем puppet в двух средах, и соглашение об именах следует этому шаблону.
Среда 1: полное доменное имя <env>-<service><index>.<domain-name1>.tld
и имя хоста <env>-<service><index>
Среда 2: полное доменное имя <service><index>.<domain-name2>.tld
и имя хоста <service><index>
Мой файл шаблона для этого же выглядит так:
{
"client": {
"name": "<%= @hostname %>",
"address": "<%= @ipaddress %>",
"subscriptions": <%= @pr_subscription_array %>
}
}
где я получаю pr_subscription_array в своем манифесте, используя этот блок:
$pr_service_name = regsubst("${facts[hostname]}", '^(.*?)-([a-zA-Z]*)[0-9]*', '\2')
$pr_subscription_array = [ "${facts[hostname]}", "all", "${facts['agent_specified_environment']}", "$pr_service_name" ]
Это создает такую подписку: "subscriptions": ["<hostname>", "all", "<env>", "<service><index>"]
Каким-то образом поле обслуживания не приходит должным образом. Он идет с порядковым номером. Есть предложения, как это сделать с помощью марионетки?
Заранее спасибо.