Назад | Перейти на главную страницу

Копирование файлов из нескольких папок в одну папку с помощью марионетки

Я пытаюсь придумать марионеточный модуль 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>"]

Каким-то образом поле обслуживания не приходит должным образом. Он идет с порядковым номером. Есть предложения, как это сделать с помощью марионетки?

Заранее спасибо.