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

переменные марионетки, установленные в среде exec, недоступны где-либо еще в классе

Я пытаюсь настроить конфигурацию ведения журнала с путями журналов на основе проверки, существует ли этот файл журнала. Однако операторы if всегда возвращают истину, даже если я знаю, что /var/log/hermes/hermes.log не существует. Я тестировал exec {"service_log_check", только если он работает, так что это как-то связано с оператором if. Я думал добавить в каждый exec что-то вроде environment => ["FOO = true", а затем изменить оператор if на if $ FOO == true, но оказалось, что переменные, установленные в среде exec, доступны только внутри exec, а не целиком класс. Это сводит меня с ума!!! Мы используем марионетку v3.7

class hermes :: fluentd ($ service_name = 'hermes', $ logs = '/ var / log / test / test.log') {

exec {"service_log_check":
  command => '/bin/true',
  onlyif => '/usr/bin/test -e /var/log/hermes/hermes.log',
}

exec {"service_log_json_check":
  command => '/bin/true',
  onlyif => '/usr/bin/test -e /var/log/hermes/hermes-json.log',
}

exec {"request_log_check":
  command => '/bin/true',
  onlyif => '/usr/bin/test -e /var/log/hermes/request.log',
}

if service_log_check {
    $service_logs = "/var/log/${service_name}/${service_name}.log"
}
else { $service_logs = []
}

if service_log_json_check {
    $service_json_logs = "/var/log/${service_name}/${service_name}-json.log"
}
else { $service_json_logs = []
}

if request_log_check {
    $service_request_logs = "/var/log/${service_name}/request.log"
}
else
{ $service_request_logs = []
}

$logs_to_tail = [$logs, $service_logs, $service_json_logs, $service_request_logs]


file { "/etc/td-agent/config.d/${service_name}_service_logs.conf":
    ensure => present,
    content => template('service_logs.conf.erb'),
    owner  => td-agent,
    group  => td-agent,
    mode   => '0775'
}

}

К сожалению, марионетка работает не так. Ресурсы Exec не могут устанавливать значения, на которые может ссылаться другой код в манифесте марионетки. Здесь есть несколько концепций, которые вам необходимо понять:

  1. Puppet является «декларативным», а не «скриптом». Вы объявляете желаемое состояние, и марионетка заботится о переводе целевой машины в это состояние.
  2. Манифест (объявление желаемого состояния) компилируется перед его применением; переменные оцениваются только в этот момент, задолго до выполнения exec

Если вам нужно получить информацию от узла, чтобы принять решение о том, какое у вас желаемое состояние (т.е. какие значения следует поместить в файл .conf), вам необходимо написать Custom Fact (см. https://docs.puppet.com/facter/3.7/custom_facts.html)