Update to 2020-12-14 16:00

master
Daniel Berteaud 4 years ago
parent 4789dd81ce
commit e83c6510b4
  1. 2
      roles/postfix/templates/main.cf.j2
  2. 4
      roles/repo_base/tasks/base_CentOS8.yml
  3. 3
      roles/seafile/tasks/install.yml
  4. 3
      roles/seafile/vars/CentOS-7.yml
  5. 5
      roles/seafile/vars/CentOS-8.yml
  6. 4
      roles/zabbix_lld_all_graph/README.md
  7. 5
      roles/zabbix_lld_all_graph/defaults/main.yml
  8. 561
      roles/zabbix_lld_all_graph/files/zabbix_lld_all_graph
  9. 4
      roles/zabbix_lld_all_graph/meta/main.yml
  10. 5
      roles/zabbix_lld_all_graph/tasks/conf.yml
  11. 26
      roles/zabbix_lld_all_graph/tasks/install.yml
  12. 5
      roles/zabbix_lld_all_graph/tasks/main.yml
  13. 8
      roles/zabbix_lld_all_graph/tasks/services.yml
  14. 9
      roles/zabbix_lld_all_graph/templates/zabbix-lld-all-graph.j2
  15. 9
      roles/zabbix_lld_all_graph/templates/zabbix-lld-all-graph.service.j2
  16. 8
      roles/zabbix_lld_all_graph/templates/zabbix-lld-all-graph.timer.j2

@ -16,7 +16,7 @@ inet_protocols = ipv4
mydestination = {{ postfix_mydestination | default(['$myhostname', 'localhost.$mydomain', 'localhost']) | join(', ') }} mydestination = {{ postfix_mydestination | default(['$myhostname', 'localhost.$mydomain', 'localhost']) | join(', ') }}
mynetworks = {{ postfix_mynetworks | default([ '127.0.0.0/8' ]) | join (', ') }} mynetworks = {{ postfix_mynetworks | default([ '127.0.0.0/8' ]) | join (', ') }}
smtpd_recipient_restrictions = permit_mynetworks smtpd_recipient_restrictions = permit_mynetworks,reject
{% if postfix_relay_host is defined %} {% if postfix_relay_host is defined %}
relayhost = {{ postfix_relay_host }} relayhost = {{ postfix_relay_host }}

@ -10,6 +10,7 @@
baseurl: http://mirror.centos.org/$contentdir/$releasever/{{ item.dir }}/$basearch/os/ baseurl: http://mirror.centos.org/$contentdir/$releasever/{{ item.dir }}/$basearch/os/
gpgcheck: True gpgcheck: True
gpgkey: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial gpgkey: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
enabled: "{{ item.enabled | default(True) }}"
loop: loop:
- name: baseos - name: baseos
file: CentOS-Linux-Base file: CentOS-Linux-Base
@ -20,6 +21,7 @@
- name: plus - name: plus
file: CentOS-Linux-Plus file: CentOS-Linux-Plus
dir: centosplus dir: centosplus
enabled: False
- name: extras - name: extras
file: CentOS-Linux-Extras file: CentOS-Linux-Extras
dir: extras dir: extras
@ -84,12 +86,14 @@
loop: loop:
- CentOS-Linux-AppStream - CentOS-Linux-AppStream
- CentOS-Linux-BaseOS - CentOS-Linux-BaseOS
- CentOS-Linux-Base
- CentOS-Linux-ContinuousRelease - CentOS-Linux-ContinuousRelease
- CentOS-Linux-Debuginfo - CentOS-Linux-Debuginfo
- CentOS-Linux-Devel - CentOS-Linux-Devel
- CentOS-Linux-Extras - CentOS-Linux-Extras
- CentOS-Linux-FastTrack - CentOS-Linux-FastTrack
- CentOS-Linux-centosplus - CentOS-Linux-centosplus
- CentOS-Linux-Plus
- CentOS-Linux-PowerTools - CentOS-Linux-PowerTools
# Waiting for the allowerasing args to dnf module, landing in ansible 2.10 # Waiting for the allowerasing args to dnf module, landing in ansible 2.10

@ -135,8 +135,7 @@
# Needed since CentOS 7.5 so ldaps can be used # Needed since CentOS 7.5 so ldaps can be used
- name: Remove bundled libs - name: Remove bundled libs
file: path={{ seafile_root_dir }}/seafile-server/seafile/lib/{{ item }} state=absent file: path={{ seafile_root_dir }}/seafile-server/seafile/lib/{{ item }} state=absent
with_items: loop: "{{ seafile_rm_libs }}"
- libnssutil3.so
notify: restart seafile notify: restart seafile
tags: seafile tags: seafile

@ -19,3 +19,6 @@ seafile_packages:
- poppler-utils # For seafile-pro - poppler-utils # For seafile-pro
- unoconv # For seafile-pro - unoconv # For seafile-pro
- python-setuptools # needed for ansible to create the venv - python-setuptools # needed for ansible to create the venv
seafile_rm_libs:
- libnssutil3.so

@ -19,3 +19,8 @@ seafile_packages:
- poppler-utils # For seafile-pro - poppler-utils # For seafile-pro
- unoconv # For seafile-pro - unoconv # For seafile-pro
- python3-setuptools # needed for ansible to create the venv - python3-setuptools # needed for ansible to create the venv
seafile_rm_libs:
- liblber-2.4.so.2
- libldap-2.4.so.2
- libsasl2.so.3

@ -0,0 +1,4 @@
Simple role which deploy a script to update specific hosts' graphs with multiple items from lld discovery rules
This script is quite specific to FWS and will probably not be useful as is to anyone else.
It's there to workaround the lack of support for this natively in Zabbix
See https://support.zabbix.com/browse/ZBXNEXT-927

@ -0,0 +1,5 @@
---
#zabbix_lld_all_graph_api_user: zabbixapi
#zabbix_lld_all_graph_api_pass: secret
#zabbix_lld_all_graph_api_url: https://zbxapi.example.org/json_rpc.php

@ -0,0 +1,561 @@
#!/usr/bin/perl
use JSON;
use utf8;
use Getopt::Long;
use open ':encoding(utf8)';
binmode(STDOUT, ":utf8");
use Time::HiRes qw(usleep);
# version 2020.12.13
# read param from ENV or Getopt
#version 2012.06.26
#added item prototype exclusion by item key
#now 42 colors available
#version 2012.06.14
#added drawtype parameter
#added calcfunction parameter
#showtriggers now defaults to true
#version 2012.06.13.1
#added showtriggers parameter
my $user = $ENV{ZBX_API_USER};
my $pass = $ENV{ZBX_API_PASS};
my $url = $ENV{ZBX_API_URL};
GetOptions(
'user=s' => \$user,
'password=s' => \$pass,
'url=s' => \$url
);
if (not defined $user){
die "Zabbix API user not provided\n";
}
if (not defined $pass){
die "Zabbix API passwordnot provided\n";
}
if (not defined $url){
die "Zabbix API URL not provided\n";
}
# internal
$header = "Content-Type:application/json";
our @conf = ();
%{$conf[0]} = ();
# DIsk space, % used
# only add graphs to hosts linked to this template
$conf[0]{"template"} = qr{^Template_OS_((Linux_(Server|minimal)|iPasserelle)|Windows_(Minimal|Serveu?r)|PfSense(2)?)$};
# create a graph with this name in each host
$conf[0]{"graph"} = 'System: Filesystem usage';
$conf[0]{"graphtype"} = 1; ### 0=normal, 1=stacked
$conf[0]{"mintype"} = 1; ### 0=calculated, 1=fixed
$conf[0]{"maxtype"} = 1; ### 0=calculated, 1=fixed
$conf[0]{"minvalue"} = 0;
$conf[0]{"maxvalue"} = 100;
$conf[0]{"showtriggers"} = 1;
$conf[0]{"drawtype"} = 2; ### 0=line, 1=filled, 2=boldline, 3=dot, 4=dashed, 5=gradient
$conf[0]{"calcfunction"} = 2; ### 1=min, 4=max, 2=avg, 7=all
$conf[0]{"regexes"}[0] = '^Used space on\s.*\(%\)';
# Temp sensors
$conf[1]{"template"} = qr{^Template_OS_(Linux_(Server|minimal)|iPasserelle)$};
$conf[1]{"graph"} = 'Hardware: Temperatures';
$conf[1]{"graphtype"} = 1; ### 0=normal, 1=stacked
$conf[1]{"mintype"} = 0; ### 0=calculated, 1=fixed
$conf[1]{"maxtype"} = 0; ### 0=calculated, 1=fixed
$conf[1]{"minvalue"} = 0;
$conf[1]{"maxvalue"} = 100;
$conf[1]{"showtriggers"} = 1;
$conf[1]{"drawtype"} = 2; ### 0=line, 1=filled, 2=boldline, 3=dot, 4=dashed, 5=gradient
$conf[1]{"calcfunction"} = 2; ### 1=min, 4=max, 2=avg, 7=all
$conf[1]{"regexes"}[0] = '^Temperature\s.*';
# Disk I/O, bps
$conf[2]{"template"} = qr{^Template_OS_((Linux_(Server|minimal)|iPasserelle)|Windows_(Minimal|Serveu?r))$};
$conf[2]{"graph"} = 'System: Disks: I/O';
$conf[2]{"graphtype"} = 1; ### 0=normal, 1=stacked
$conf[2]{"mintype"} = 0; ### 0=calculated, 1=fixed
$conf[2]{"maxtype"} = 0; ### 0=calculated, 1=fixed
$conf[2]{"minvalue"} = 0;
$conf[2]{"maxvalue"} = 100;
$conf[2]{"showtriggers"} = 1;
$conf[2]{"drawtype"} = 2; ### 0=line, 1=filled, 2=boldline, 3=dot, 4=dashed, 5=gradient
$conf[2]{"calcfunction"} = 2; ### 1=min, 4=max, 2=avg, 7=all
$conf[2]{"regexes"}[0] = '^Writes\son\s(?!(\/dev|sd[e-z]))';
$conf[2]{"regexes"}[1] = '^Reads\son\s(?!(\/dev|sd[e-z]))';
# Disk I/O, iops
$conf[3]{"template"} = qr{^Template_OS_((Linux_(Server|minimal)|iPasserelle)|Windows_(Minimal|Serveu?r))$};
$conf[3]{"graph"} = 'System: Disks: I/O (iops)';
$conf[3]{"graphtype"} = 1; ### 0=normal, 1=stacked
$conf[3]{"mintype"} = 0; ### 0=calculated, 1=fixed
$conf[3]{"maxtype"} = 0; ### 0=calculated, 1=fixed
$conf[3]{"minvalue"} = 0;
$conf[3]{"maxvalue"} = 100;
$conf[3]{"showtriggers"} = 1;
$conf[3]{"drawtype"} = 2; ### 0=line, 1=filled, 2=boldline, 3=dot, 4=dashed, 5=gradient
$conf[3]{"calcfunction"} = 2; ### 1=min, 4=max, 2=avg, 7=all
$conf[3]{"regexes"}[0] = '^Write\soperations\son\s(?!(\/dev|sd[e-z]))';
$conf[3]{"regexes"}[1] = '^Read\soperations\son\s(?!(\/dev|sd[e-z]))';
# Fan and power sensors
$conf[4]{"template"} = qr{^Template_OS_(Linux_(Server|minimal)|iPasserelle)$};
$conf[4]{"graph"} = 'Hardware: Fan';
$conf[4]{"graphtype"} = 1; ### 0=normal, 1=stacked
$conf[4]{"mintype"} = 0; ### 0=calculated, 1=fixed
$conf[4]{"maxtype"} = 0; ### 0=calculated, 1=fixed
$conf[4]{"minvalue"} = 0;
$conf[4]{"maxvalue"} = 100;
$conf[4]{"showtriggers"} = 1;
$conf[4]{"drawtype"} = 2; ### 0=line, 1=filled, 2=boldline, 3=dot, 4=dashed, 5=gradient
$conf[4]{"calcfunction"} = 2; ### 1=min, 4=max, 2=avg, 7=all
$conf[4]{"regexes"}[0] = '^Rotation speed for\s.*';
$conf[5]{"template"} = qr{^Template_OS_(Linux_(Server|minimal)|iPasserelle)$};
$conf[5]{"graph"} = 'Hardware: Power';
$conf[5]{"graphtype"} = 1; ### 0=normal, 1=stacked
$conf[5]{"mintype"} = 0; ### 0=calculated, 1=fixed
$conf[5]{"maxtype"} = 0; ### 0=calculated, 1=fixed
$conf[5]{"minvalue"} = 0;
$conf[5]{"maxvalue"} = 100;
$conf[5]{"showtriggers"} = 1;
$conf[5]{"drawtype"} = 2; ### 0=line, 1=filled, 2=boldline, 3=dot, 4=dashed, 5=gradient
$conf[5]{"calcfunction"} = 2; ### 1=min, 4=max, 2=avg, 7=all
$conf[5]{"regexes"}[0] = '^Power consumption\s.*';
# load a json string from a file
sub loadjson {
$result = "";
# open file
open(FILE, "<", $_[0]);
# read whole file
while (<FILE>) {
$result = $result . $_;
}
close(FILE);
return $result;
}
# send json and get result (jsonstr):jsonstr
sub sendjson {
$jsonstr = $_[0];
# send json to zabbix and get result
$res = `curl -s -i -X POST -H $header -d '$data' $url`;
# find start of json
$i = index($res, "{");
# get json only
$res_out = substr($res, $i);
return $res_out;
}
# authenticate with zabbix, returns the auth token
sub authenticate {
# load auth json
$data = '{"jsonrpc":"2.0","method":"user.login","params":{"user":"'.$user.'","password":"'.$pass.'"},"id": 1,"auth":null}';
# send json
$res = sendjson($data);
# decode json
$dec = decode_json($res);
# get auth key
$auth_out = $dec->{"result"};
return $auth_out;
}
# get hostgroups from zabbix (auth)
sub gethostgroups {
$auth_in = $_[0];
# load hostgroups json
$data = '{ "jsonrpc": "2.0", "method": "hostgroup.get", "params": { "output": "extend", "sortfield": "name" }, "id": 1, "auth": "" }';
# decode json
$dec = decode_json($data);
# set auth
$dec->{"auth"} = $auth_in;
# encode back to data
$data = encode_json($dec);
# send json
$res = sendjson($data);
# decode json
$dec_out = decode_json($res);
return $dec_out
}
# get hosts from zabbix (auth, groupid)
sub gethosts {
$auth_in = $_[0];
$groupid_in = $_[1];
# load items json
$data = '{ "jsonrpc": "2.0", "method": "host.get", "params": { "output": "extend", "sortfield": "name", "selectParentTemplates": "extend", "groupids": [ "" ] }, "id": 2, "auth": "" }';
# decode json
$dec = decode_json($data);
# set auth
$dec->{"auth"} = $auth_in;
# set groupid filter (outside filter)
$dec->{"params"}->{"groupids"}[0] = $groupid_in;
# encode back to data
$data = encode_json($dec);
# send json
$res = sendjson($data);
# decode json
$dec_out = decode_json($res);
return $dec_out;
}
# get items from zabbix (auth, hostid)
sub getitems {
$auth_in = $_[0];
$hostid_in = $_[1];
# load items json
$data = '{ "jsonrpc": "2.0", "method": "item.get", "params": { "output": "extend", "sortfield": "name", "filter": { "hostid": "" } }, "id": 1, "auth": "" }';
# decode json
$dec = decode_json($data);
# set auth
$dec->{"auth"} = $auth_in;
# set hostid filter
$dec->{"params"}->{"filter"}->{"hostid"} = $hostid_in;
# encode back to data
$data = encode_json($dec);
# send json
$res = sendjson($data);
# decode json
$dec_out = decode_json($res);
return $dec_out
}
# get graphs from zabbix (auth, hostid, graphname)
sub getgraphs {
$auth_in = $_[0];
$hostid_in = $_[1];
$graph_in = $_[2];
# load graphs json
$data = '{ "jsonrpc": "2.0", "method": "graph.get", "params": { "output": "extend", "sortfield": "name", "hostids": [ "" ], "filter": { "name": "" } }, "id": 3, "auth": "" }';
# decode json
$dec = decode_json($data);
# set auth
$dec->{"auth"} = $auth_in;
# set name filter
$dec->{"params"}->{"filter"}->{"name"} = $graph_in;
# set hostid filter (outside filter)
$dec->{"params"}->{"hostids"}[0] = $hostid_in;
# encode back to data
$data = encode_json($dec);
# send json
$res = sendjson($data);
# decode json
$dec_out = decode_json($res);
return $dec_out;
}
# delete graph from zabbix (auth, graphid)
sub deletegraph {
$auth_in = $_[0];
$graphid_in = $_[1];
# load graphs json
$data = '{ "jsonrpc": "2.0", "method": "graph.delete", "params": [ "" ], "id": 4, "auth": "" }';
# decode json
$dec = decode_json($data);
# set auth
$dec->{"auth"} = $auth_in;
# set graphid
$hash[0] = $graphid_in;
$dec->{"params"} = \@hash;
# encode back to data
$data = encode_json($dec);
# send json
$res = sendjson($data);
# decode json
$dec_out = decode_json($res);
print " "." "." "."Graph deleted."."\n";
return $dec_out;
}
# search and delete existing graphs from zabbix (auth, hostid, graphname)
sub deletegraphs {
$auth_in = $_[0];
$hostid_in = $_[1];
$graph_in = $_[2];
# get graph with name
$graphs = getgraphs($auth_in, $hostid_in, $graph_in);
# each graph in list
# filter graphs that do not belong to our hostid
foreach $graphi(@{$graphs->{result}}) {
# get graph id
$graphid = $graphi->{graphid};
# get graph name
$graph_name = $graphi->{name};
print " "." "." "."Graph found: ".$graph_name." (".$graphid.")"."\n";
# delete the graph
deletegraph($auth_in, $graphid);
}
}
# create graph in zabbix (auth, graphname, graphtype, mintype, maxtype, minvalue, maxvalue, showtriggers, graphitems, hostid)
sub creategraph {
#ymin_type = 0 -> calculated
#ymin_type = 1 -> fixed
#graphtype = 0 -> normal
#graphtype = 1 -> stack
#auth
$auth_in = $_[0];
#graph name
$graph_in = $_[1];
#graphtype, mintype, maxtype, minvalue, maxvalue
$graphtype_in = $_[2];
$mintype_in = $_[3];
$maxtype_in = $_[4];
$minvalue_in = $_[5];
$maxvalue_in = $_[6];
$showtriggers_in = $_[7];
#graphitems
$graphitems_in = $_[8];
#hostid
$hostid_in = $_[9];
# load graphs json
$data = '{ "jsonrpc": "2.0", "method": "graph.create", "params": { "gitems": [ "" ], "name": "", "width": "900", "height": "300", "yaxismin": "0", "yaxismax": "100",
"show_work_period": "1", "show_triggers": "1", "graphtype": "0", "show_legend": "1", "show_3d": "0", "percent_left": "0", "percent_right": "0", "ymin_type": "0",
"ymax_type": "0", "ymin_itemid": "0", "ymax_itemid": "0" }, "id": 4, "auth": "" }';
# decode json
$dec = decode_json($data);
# set auth
$dec->{"auth"} = $auth_in;
# set graph name
$dec->{"params"}->{"name"} = $graph_in;
# set graphtype, mintype, maxtype, minvalue, maxvalue
$dec->{"params"}->{graphtype} = $graphtype_in;
$dec->{"params"}->{ymin_type} = $mintype_in;
$dec->{"params"}->{ymax_type} = $maxtype_in;
$dec->{"params"}->{yaxismin} = $minvalue_in;
$dec->{"params"}->{yaxismax} = $maxvalue_in;
$dec->{"params"}->{show_triggers} = $showtriggers_in;
# set graph gitems
$dec->{"params"}->{gitems} = $graphitems_in;
# encode back to data
$data = encode_json($dec);
# send json
$res = sendjson($data);
# decode json
$dec_out = decode_json($res);
print " "." "." "."Graph created: ".$graph_in."\n";
return $dec_out;
}
##########
# 42 total items
##########
# dark colors
$colors[0][0] = "5299AD"; # blue1
$colors[0][1] = "5D549A"; # violet
$colors[0][2] = "87B457"; # green
$colors[0][3] = "CF545E"; # red
$colors[0][4] = "CDDA13"; # lemon
$colors[0][5] = "5DAE99"; # turquise
$colors[0][6] = "DD844C"; # orange
$colors[0][7] = "AE5C8A"; # mauve
$colors[0][8] = "BD9F83"; # ltbrown
$colors[0][9] = "6B9BD4"; # blue2
$colors[0][10] = "B75F73"; #red-brown
$colors[0][11] = "646560"; # kaky
$colors[0][12] = "335098"; # deepblue
$colors[0][13] = "5FBFDB"; # bleu
$colors[0][14] = "D1CE85"; # yellow
$colors[0][15] = "909090"; # grey
$colors[0][16] = "A16254"; # brown
$colors[0][17] = "E8678D"; # pink
$colors[0][18] = "62B55A"; # deepgreen
$colors[0][19] = "A599AD"; # greypurple
$colors[0][20] = "6A5DD9"; # violet2
# light colors
$colors[1][0] = "98D6E7"; # blue1
$colors[1][1] = "9E7EDF"; # violet
$colors[1][2] = "BDDA83"; # green
$colors[1][3] = "EF747E"; # red
$colors[1][4] = "EDFA33"; # lemon
$colors[1][5] = "7EC392"; # tuquise
$colors[1][6] = "EDA46C"; # orange
$colors[1][7] = "DF93D7"; # mauve
$colors[1][8] = "E2BB91"; # ltbrown
$colors[1][9] = "A0CBEA"; # blue2
$colors[1][10] = "CB868B"; # red-brown
$colors[1][11] = "77897D"; # kaky
$colors[1][12] = "5370B8"; #deepblue
$colors[1][13] = "76DAF7"; # bleu
$colors[1][14] = "EAD770"; # yellow
$colors[1][15] = "AEAEAE"; # grey
$colors[1][16] = "B97A6F"; # brown
$colors[1][17] = "E8849D"; # pink
$colors[1][18] = "95D36E"; # deepgreen
$colors[1][19] = "B7AACF"; # greypurple
$colors[1][20] = "8A7DF9"; # violet2
print "\n";
# authenticate with zabbix
$auth = authenticate();
# get hostgroup list
$hostgroups = gethostgroups($auth);
# each hostgroup in list
foreach $hostgroup(@{$hostgroups->{result}}) {
# get groupid and name
$groupid = $hostgroup->{groupid};
$name = $hostgroup->{name};
# not templates or discovered hosts
next if ((lc($name) eq "templates") || (lc($name) eq "discovered hosts") || (lc($name) eq "modèles"));
# get hosts list
$hosts = gethosts($auth, $groupid);
print "HOSTGROUP: ".$name." (".$groupid.")"."\n";
# each host in list
foreach $host(@{$hosts->{result}}) {
sleep(1);
# get parent templates
$templates = $host->{parentTemplates};
for (my $i = 0; $i < @conf; ++$i){
my $template = $conf[$i]{"template"};
my $graph = $conf[$i]{"graph"};
my $graphtype = $conf[$i]{"graphetype"};
my $mintype = $conf[$i]{"mintype"};
my $maxtype = $conf[$i]{"maxtype"};
my $minvalue = $conf[$i]{"minvalue"};
my $maxvalue = $conf[$i]{"maxvalue"};
my $showtriggers = $conf[$i]{"showtriggers"};
my $drawtype = $conf[$i]{"drawtype"};
my $calcfunction = $conf[$i]{"calcfunction"};
my @regexes = ();
$regexes[0] = $conf[$i]{"regexes"}[0];
$regexes[1] = $conf[$i]{"regexes"}[1] if (defined $conf[$i]{"regexes"}[1]);
# match results
$templatematch = 0;
# each template in list
# filter hosts that do not belong to our template
foreach $templatei(@{$templates}) {
# template name match
$templatematch = 1 if ($templatei->{name} =~ m/$template/i);
}
# template match
next unless ($templatematch);
# get host id and name
$name = $host->{name};
print "host $name matches $template\n";
$hostid = $host->{hostid};
# reset graph item array
@graph_item = ();
print " "."HOST: ".$name." (".$hostid.")"."\n";
#########
# search for existing graphs and delete if found
#########
deletegraphs($auth, $hostid, $graph);
# get item list
$items = getitems($auth, $hostid);
$count = 0;
# reset colorbase;
$colorbase = 0;
# reset colorindexes;
@colorindex = 0;
# each item in list
foreach $item(@{$items->{result}}) {
# get item name
$item_name = $item->{name};
#get item id
$item_id = $item->{itemid};
#get item key
$item_key = $item->{key_};
# reset regex index
$regexindex = 0;
# reset host item array
@host_item = ();
# each regex in list
foreach $regex(@regexes) {
# item name match regex and item key is not prototype
next unless (($item_name =~ m/$regex/) && ($item_key !~ m/.*{#.*}/) && (@graph_item < 19));
print " "." "."ITEM: ".$item_name." (".$item_id.")"."\n";
# we may have exceeded color count, if so, use other base (light, ultralight)
if ($colorindex[$regexindex] > @{$colors[0]}) {
# move to next color base
$colorbase++;
# reset color index;
$colorindex[$regexindex] = 0;
print " "." "."WARNING: Not enough colors, switched to another color base"."\n";
}
$graph_item[$count]->{itemid} = $item_id;
$graph_item[$count]->{drawtype} = $drawtype;
$graph_item[$count]->{sortorder} = $count;
$graph_item[$count]->{color} = $colors[$colorbase + $regexindex][$colorindex[$regexindex]];
$graph_item[$count]->{yaxisside} = "0"; ### 0=left, 1=right;
$graph_item[$count]->{type} = "0";
$graph_item[$count]->{calc_fnc} = $calcfunction;
# inc count;
$count++;
# inc colorindex;
$colorindex[$regexindex]++;
# inc regexindex
$regexindex++;
}
}
#########
# create a new graph
#########
creategraph($auth, $graph, $graphtype, $mintype, $maxtype, $minvalue, $maxvalue, $showtriggers, \@graph_item, $hostid);
}
}
}
print "\n";

@ -0,0 +1,4 @@
---
dependencies:
- role: mkdir

@ -0,0 +1,5 @@
---
- name: Deploy lld graphs config
template: src=zabbix-lld-all-graph.j2 dest=/etc/sysconfig/zabbix-lld-all-graph mode=600 owner=zabbix
tags: zabbix

@ -0,0 +1,26 @@
---
- name: Install packages
package:
name:
- curl
- perl-Getopt-Long
- perl-Time-HiRes
tags: zabbix
- name: Install zabbix_lld_all_graph script
copy: src=zabbix_lld_all_graph dest=/usr/local/bin/zabbix_lld_all_graph mode=755
tags: zabbix
- name: Install lld_all_graph systemd units
template: src={{ item }}.j2 dest=/etc/systemd/system/{{ item }}
loop:
- zabbix-lld-all-graph.service
- zabbix-lld-all-graph.timer
register: zabbix_lld_all_graph_units
tags: zabbix
- name: Reload systemd
systemd: daemon_reload=True
when: zabbix_lld_all_graph_units.results | selectattr('changed','equalto',True) | list | length > 0
tags: zabbix

@ -0,0 +1,5 @@
---
- include: install.yml
- include: conf.yml
- include: services.yml

@ -0,0 +1,8 @@
---
- name: Handle zabbix-lld-all-graph timer
systemd:
name: zabbix-lld-all-graph.timer
state: "{{ (zabbix_lld_all_graph_api_user is defined and zabbix_lld_all_graph_api_pass is defined and zabbix_lld_all_graph_api_url is defined) | ternary('started','stopped') }}"
enabled: "{{ (zabbix_lld_all_graph_api_user is defined and zabbix_lld_all_graph_api_pass is defined and zabbix_lld_all_graph_api_url is defined) | ternary(True,False) }}"
tags: zabbix

@ -0,0 +1,9 @@
{% if zabbix_lld_all_graph_api_user is defined %}
ZBX_API_USER={{ zabbix_lld_all_graph_api_user | quote }}
{% endif %}
{% if zabbix_lld_all_graph_api_pass is defined %}
ZBX_API_PASS={{ zabbix_lld_all_graph_api_pass | quote }}
{% endif %}
{% if zabbix_lld_all_graph_api_url is defined %}
ZBX_API_URL={{ zabbix_lld_all_graph_api_url | quote }}
{% endif %}

@ -0,0 +1,9 @@
[Unit]
Description=Update graphs with multiple lld items
[Service]
Type=oneshot
EnvironmentFile=/etc/sysconfig/zabbix-lld-all-graph
ExecStart=/usr/local/bin/zabbix_lld_all_graph
User=zabbix
Group=zabbix

@ -0,0 +1,8 @@
[Unit]
Description=Update graphs with multiple lld items
[Timer]
OnCalendar=daily
[Install]
WantedBy=timers.target
Loading…
Cancel
Save