2016-04-11 30 views
0

Şirketimdeki uygulanabilir, bazı hizmetler için Nagios şablonlarını oluşturmak üzere yapılandırıldı.Bir Jinja yapılandırma dosyası, genel değerler temelinde hizmet denetimleri eklemek için nasıl yapılandırılır?

Örneğin

:

 define service { 
      use      rabbit-critical-service   ; Name of service template to use 
      service_description  RabbitMQ {{ queue_name }} queue size 
      check_command     check_graphite_data!1000!15000!rabbitmq._.rabbitmq_messages.{{ queue_name }}.value 
      host_name    {{ rabbitmq_server }} 
      notifications_enabled 1 
      servicegroups   rabbitmq 
    } 

şablon, tüm sıraların aynı eşik değerleri ile otomatik olarak kontrolünü oluşturur. Sıra isimleri ansible_playbooks/roles/nagios/defaults/main.yml altında farklı bir dosyada yapılandırılır ve otomatik olarak Jinja kullanılarak oluşturulur.

Bazı özel çekler için yapılandırmanın farklı eşikleri dahil etmesinin kolay bir şekilde düzenlenmesini mümkün kılma görevini verdim ancak nasıl yapılacağını anlamakta zorlanıyorum.

{% if queue_size_specific_vars is not defined %} 
create the check using the current configuration... 
{% else %} 
create the check using the specific configuration which will be found in the `default/main.yml` file in the newly created generic value "queue_size_specific_vars" which is supposed to include two values, one for warning value and one for critical value. 
{% endif %} 

Benim sorulara

şunlardır:

  1. How do I achieve my goal (while taking into consideration two values instead of one)?
  2. I'm not sure this is the best way to achieve my goal, do you know a better way to do so?

Düzenleme # 1:

Öyle görünüyor böyle service_check şablon şey ekleme :

böyle bir şey düşündü Kendimi düzgün bir şekilde açıklamadım, size şablonun daha büyük bir kısmını göstereyim:

{% for queue_name in queues %} 
define service { 
     use      rabbit-critical-service   ; Name of service template to use 
     service_description  RabbitMQ {{ queue_name }} queue active consumers 
     check_command     check_graphite_data!0.9!0.9!rabbitmq._.rabbitmq_consumers.{{ queue_name }}!reverse 
     host_name    {{ rabbitmq_server }} 
     notifications_enabled 1 
     servicegroups   rabbitmq 
     max_check_attempts  4 
} 

{% if vars_production is not defined %} 
define service { 
     use      generic-service 
     service_description  RabbitMQ {{ queue_name }} queue read/write ratio 
     check_command     check_graphite!'http://{{ graphite_server }}:{{ graphite_port }}/render/?from=-10minutes&target=scale(divideSeries(offset(prod-rabbit-1.rabbitmq._.rabbitmq_messages.{{queue_name}}.value,1),offset(derivative(sumSeries(prod-rabbit-1.rabbitmq._.rabbitmq_deliver_get.{{queue_name}})),1)),100)&rawData'!1500!2000!avg 
     host_name    {{ rabbitmq_server }} 
     notifications_enabled 1 
     servicegroups   rabbitmq 
     max_check_attempts  4 
} 
{% endif %} 
define service { 
     use      rabbit-critical-service   ; Name of service template to use 
     service_description  RabbitMQ {{ queue_name }} queue size 
     check_command     check_graphite_data!1000!15000!rabbitmq._.rabbitmq_messages.{{ queue_name }}.value 
     host_name    {{ rabbitmq_server }} 
     notifications_enabled 1 
     servicegroups   rabbitmq 
} 

{% endfor %} 

Uygulamam gereken değişiklik, ana bilgisayar adına değil, sıraya göre olmalıdır, çünkü ansible "yalnızca" bilir ve "bilmez" kuyrukları "bilir".

Sırasıyla "RabbitMQ {{queue_name}} sıra boyutunu" belirleme seçeneğine ihtiyacımız var ve tüm geri kalan öğeler varsayılan değerlere sahip olacak. Yapmam beklenen değişiklik, şablon dosyasında yer almalıdır.

Örnek:

{% if special_queue_exists %} 
do .... 
{% else %} 
create it in the normal method 
{% endif %} 

Düzenleme # 2: Zaten bütün sıraları içeren dosya var, bunu diyelim :

Müdürüm beni bu andıran bir şekilde bunu yapmak isteyen dosya "queues_file". Ve belirli kontrol değerlerinin bir listesini içerecek başka bir dosya oluşturmamı istiyor (uyar ve kritik), bu dosyayı "specific_values" olarak adlandıralım.

Ve sonra böyle bir şey yapmak: o zaman

queues_with_specific_metrics: 
    - entities: 
    - warn: "1000" 
    - crit: "20000" 

Ve (döngü itibaren) üzerinde çalıştırıyorum kuyruk belirli tertibata sahip olursa "specific_values" dosya içinde ve eğer öyleyse kontrol etmek, daha sonra "specific_values" dosyasındaki ayarlar varsayılan olanları geçersiz kılar. Sonra böyle bir şey yapabilirsiniz:

{{ queues_with_specific_metrics.queue.warn | default(1000) }} 

Ben yanıtlayıcı 've Jinja acemi değilim ve ben değil bunun için üzgünüm, bu yüzden anlaşılabilir olmamın sebebi budur.

Edit # 3: Önerilerinizi yaptığınız gibi düzenledim, ancak if deyimini nasıl yazacağımı bilmiyorum ...

Varsayılanlar/main.yml, tüm sıra adlarının bir listesini içerir.

spec_params.yml adlı yeni bir dosya açtım ve varsayılan klasörde main.yml dosyası olarak bulunuyor.

spec_params.yml dosyası:

nagios_specific_queue_params: 
    queue1: {} 
    entities: 
    warn: 2000 
    crit: 20000 

Ve rabbitmq.cfg.j2 alakalı bölümü:

fatal: [monitoring] => {'msg': "TypeError: argument of type 'StrictUndefined' is not iterable", 'failed': True} 
fatal: [monitoring] => {'msg': 'One or more items failed.', 'failed': True, 'changed': False, 'results' 

herhangi bir fikir neden:

{% if queue_name in nagios_specific_queue_params %} 
define service { 
     use      rabbit-critical-service   ; Name of service template to use 
     service_description  RabbitMQ {{ queue_name }} queue size 
     check_command   check_graphite_data!{{ queues[queue_name] ['warn'] |default(1000) }}!{{ queues[queue_name] ['crit'] | default(15000) }}!rabbitmq._.rabbitmq_messages.{{ queue_name }}.value 
     host_name    {{ rabbitmq_server }} 
     notifications_enabled 1 
     servicegroups   rabbitmq 
} 
{% else %} 
define service { 
     use      rabbit-critical-service   ; Name of service template to use 
     service_description  RabbitMQ {{ queue_name }} queue size 
     check_command     check_graphite_data!1000!15000!rabbitmq._.rabbitmq_messages.{{ queue_name }}.value 
     host_name    {{ rabbitmq_server }} 
     notifications_enabled 1 
     servicegroups   rabbitmq 
} 
{% endif %} 

Ben şu hatayı olsun taktik kitabı çalıştırdığınızda başarısız? peşin

Teşekkür rolleri // varsayılan içinde

+0

Hala neye ulaşmaya çalıştığınızı anlamıyorum. Neden "special_queue_exists" yapıyorsun?Farklı olan ya da bu "farklı" sıra mevcut olduğunda ne olması gerektiğine dair bir örnek olacağını düşünüyorum. – shaps

+0

Düzenleme # 2'yi tekrar kontrol edin, tekrar teşekkürler! –

+0

Tam olarak söylediklerini yapabilirsin, ama 'queues_with_specific_metrics [queue] [' warn '] | varsayılan (1000) '(" Sıraya "yazılması, döngüden aldığınız sıra adıdır). Bu, queue_with_specific_metrics – shaps

cevap

0

Ben görevi tamamlamak amacıyla yaptığı adımları var:

yılında

, ben ekledim:

nagios_queue_size_default_values: 
    warn: 1000 
    crit: 15000 
nagios_queue_size_override_values: 
    entities_prod_whatever_2: 
    warn: 600 
    crit: 900 

Sonra rabbitmq.cfg.j2 doğrultusunda, bu bir onay komutu değiştirdik:

check_command  check_graphite_data!{{ nagios_queue_size_override_values.get(queue_name, nagios_queue_size_default_values).warn }}!{{ nagios_queue_size_override_values.get(queue_name, nagios_queue_size_default_values).crit }}!rabbitmq._.rabbitmq_messages.{{ queue_name }}.value 

oyun kitabı şimdi şablonu yaratır Running gerektiği gibi .

2

Değişkenler/(giriş/vars, group_vars, host_vars olanları ve envanter vars) Herhangi üst düzey değişkeni tarafından geçersiz kılınabilir.

queue_size değişkenini tanımlarsanız, varsayılan değerlerde bir grup/host_vars dosyasında üzerine yazabilirsiniz.

# file: roles/nagios/deaults/main.yml 
queue_size: "1000!15000" 

# file: host_vars/host1.yml 
queue_size: "2000!25000" 

# file: host_vars/host2.yml 
queue_size: "1000!5000" 

# file: roles/nagios/templates/check.j2 
     define service { 
      use      rabbit-critical-service   ; Name of service template to use 
      service_description  RabbitMQ {{ queue_name }} queue size 
      check_command     check_graphite_data!{{ queue_size }}!rabbitmq._.rabbitmq_messages.{{ queue_name }}.value 
      host_name    {{ rabbitmq_server }} 
      notifications_enabled 1 
      servicegroups   rabbitmq 
    } 

Bu, sorularınızı yanıtlamalıdır. Daha temiz bir değişken dosyasına sahip olmak istiyorsanız queue_size_min ve queue_size_max'u da belirtebilirsiniz.

Düzenleme: daha iyi ben yorumunda ne anlama geldiğini açıklamak için: (Aklıma O) iki yolu var

bu çözmek için:

İlk: değerleriyle, ayrı bir dosya kullanmak varsayılan olmayan kuyruklar. Bu temizleyici olabilir, ancak orijinal var dosyasında mevcut tüm sıraları tutmak zorunda kalacak:

# file vars/original_file.yml 
queues: 
    - queue1 
    - entities 

# file vars/specific.yml 
queue_with_specific_metrics: 
    queue1: {} 
    entities: 
     warn: 1000 
     crit: 15000 

İkincisi: In

queues: 
    queue1: {} 
    entities: 
     warn: 1000 
     crit: 2000 

gerektiğinde belirli değerler içerecek şekilde orijinal dosyasını düzenleme vaka ya sonra değerini almak veya varsayılan atamak şablonu değiştirecek: Burada

# case 1 
check_command check_graphite_data!{{ queue_with_specific_metrics[queue_name]['warn'] | default(1000) }}!{{ queue_with_specific_metrics[queue_name]['crit'] | default(800) }}!rabbitmq._.rabbitmq_messages.{{ queue_name }}.value} 

check_command check_graphite_data!{{ queues[queue_name]['warn'] | default(1000) }}!{{ queues[queue_name]['crit'] | default(800) }}!rabbitmq._.rabbitmq_messages.{{ queue_name }}.value} 
+0

Sorunuzdaki # 1 numarayı kontrol edin, teşekkürler. –

+0

Tüm sıralardan geçen bu döngü var ... gösterdiğiniz gibi her sıra adını yazmak zorunda mıyım? Jenerik olmasını isterim ... –

+0

queue_name hala for döngüsünde oluşturulan değişkendir. {{Queues_name for queues%}} – shaps