Извлеките файл filebeat «fileds», используемый из всех определений атрибутов (на основе ruby) - PullRequest
0 голосов
/ 23 ноября 2018

В настоящее время я добавляю поддержку filebeat для предоставляемых нами услуг;Для каждого сервиса у нас есть несколько файлов журнала, которые я хотел бы отслеживать;У меня есть 1 общий рецепт filebeat, и я различаю журналы разных сервисов в разных атрибутах .rb файлов;В тех у меня есть отдельное определение для журнала;

Все определения имеют одинаковую конфигурацию "fileds";Могу ли я добавить его в какое-нибудь место, которое будет использоваться всеми конфигурациями?

Моя структура:

  cookbooks    
    common
      recipes
        filebeat.rb   
    services
      attributes
        service1.rb
        service2.rb

Содержимое servicesX.rb имеет следующие определения:

access_log = {
    'paths' => ['TBD'],
    'input_type' => 'log',
    'fields' => {
      'hostname' => node["opsworks"]["instance"]["hostname"],
      'customer' => node["opsworks"]["instance"]["layers"][0],
      'internal_ip' => node["opsworks"]["instance"]["private_ip"],
      'ec2id' => node["opsworks"]["instance"]["aws_instance_id"],
      'os' => node["opsworks"]["instance"]["os"],
      'instance_type' => node["opsworks"]["instance"]["instance_type"]        },
      'fields_under_root' => true
}


audit_log = {
    'paths' => ['TBD'],
    'input_type' => 'log',
    'fields' => {
      'hostname' => node["opsworks"]["instance"]["hostname"],
      'customer' => node["opsworks"]["instance"]["layers"][0],
      'internal_ip' => node["opsworks"]["instance"]["private_ip"],
      'ec2id' => node["opsworks"]["instance"]["aws_instance_id"],
      'os' => node["opsworks"]["instance"]["os"],
      'instance_type' => node["opsworks"]["instance"]["instance_type"]
      },
      'fields_under_root' => true
}

Как мне извлечь

'fields' => {
  'hostname' => node["opsworks"]["instance"]["hostname"],
  'customer' => node["opsworks"]["instance"]["layers"][0],
  'internal_ip' => node["opsworks"]["instance"]["private_ip"],
  'ec2id' => node["opsworks"]["instance"]["aws_instance_id"],
  'os' => node["opsworks"]["instance"]["os"],
  'instance_type' => node["opsworks"]["instance"]["instance_type"]

Где-нибудь в одном и том же файле (servicesX.rb), чтобы его можно было использовать для всех определений файлов журналов?

Примечание: я новичок в рубине: /

Спасибо !!

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

После моего исследования: преимущества реализации не оправдывают затраченное время;Оставив его;

0 голосов
/ 23 ноября 2018

После получения отзывов и пояснений в комментариях ниже, OP, кажется, хочет DRY код и повторно использовать определение fields.

Самый простой способ - сохранить его в переменной и затем использовать это:

fields = {
  'hostname' => node["opsworks"]["instance"]["hostname"],
  'customer' => node["opsworks"]["instance"]["layers"][0],
  'internal_ip' => node["opsworks"]["instance"]["private_ip"],
  'ec2id' => node["opsworks"]["instance"]["aws_instance_id"],
  'os' => node["opsworks"]["instance"]["os"],
  'instance_type' => node["opsworks"]["instance"]["instance_type"]
}

audit_log = {
  'paths' => ['TBD'],
  'input_type' => 'log',
  'fields' => fields
}

Это, однако, может вызвать проблемы с настройкой node.Это действительно зависит от потока остальной части вашего сценария.В chef (при условии, что речь идет о chef) node - это контекст, в котором выполняется скрипт, поэтому слишком раннее задание fields может вызвать проблемы, когда этот node используется гораздо позже:

fields = { hostname: node["opsworks"]["instance"]["hostname"] }
# ... do lots of stuff, like fetching, preparing, connecting and whatnot.
fields # now contains the `node` values as set before connecting etc.

Если это проблема, лучшим вариантом было бы определить метод, который возвращает поля из переданного узла:

def fields(node)
  {
    'hostname' => node["opsworks"]["instance"]["hostname"],
    'customer' => node["opsworks"]["instance"]["layers"][0],
    'internal_ip' => node["opsworks"]["instance"]["private_ip"],
    'ec2id' => node["opsworks"]["instance"]["aws_instance_id"],
    'os' => node["opsworks"]["instance"]["os"],
    'instance_type' => node["opsworks"]["instance"]["instance_type"]
  }
 end

Или очищенный:

def fields(node)
  instance = node["opsworks"]["instance"]
  {
    hostname:      instance["hostname"],
    customer:      instance["layers"][0],
    internal_ip:   instance["private_ip"],
    ec2id:         instance["aws_instance_id"],
    os:            instance["os"],
    instance_type: instance["instance_type"]
  }
 end

Затем используйте эту функцию:

audit_log = {
  'paths' => ['TBD'],
  'input_type' => 'log',
  'fields' => fields(node)
}
...