diff --git a/lib/puppet/provider/zabbix.rb b/lib/puppet/provider/zabbix.rb index 766071126..02788ca40 100644 --- a/lib/puppet/provider/zabbix.rb +++ b/lib/puppet/provider/zabbix.rb @@ -61,6 +61,32 @@ def self.check_template_in_host(host,template,zabbix_url,zabbix_user,zabbix_pass template_array.include?("#{template_id}") end + def self.check_template_exist(template,template_source,zabbix_url,zabbix_user,zabbix_pass,apache_use_ssl) + begin + zbx = create_connection(zabbix_url,zabbix_user,zabbix_pass,apache_use_ssl) + zbx.templates.get_id( :host => template ) + rescue Puppet::ExecutionFailure => e + false + end + end + + def self.check_template_is_equal(template,template_source,zabbix_url,zabbix_user,zabbix_pass,apache_use_ssl) + begin + zbx = create_connection(zabbix_url,zabbix_user,zabbix_pass,apache_use_ssl) + exported = zbx.configurations.export( + :format => "xml", + :options => { + :templates => [zbx.templates.get_id(:host => template)] + } + ) + exported_clean = exported.gsub(/>\s*/, ">").gsub(/\s*.*<\/date>/,"DATEWASHERE") + template_source_clean = template_source.gsub(/>\s*/, ">").gsub(/\s*.*<\/date>/,"DATEWASHERE") + exported_clean.eql? template_source_clean + rescue Puppet::ExecutionFailure => e + false + end + end + # Is it an number? def self.is_a_number?(s) s.to_s.match(/\A[+-]?\d+?(\.\d+)?\Z/) == nil ? false : true diff --git a/lib/puppet/provider/zabbix_host/ruby.rb b/lib/puppet/provider/zabbix_host/ruby.rb index cdd6985e5..13024c4e1 100644 --- a/lib/puppet/provider/zabbix_host/ruby.rb +++ b/lib/puppet/provider/zabbix_host/ruby.rb @@ -14,6 +14,7 @@ def create use_ip = @resource[:use_ip] port = @resource[:port] hostgroup = @resource[:group] + hostgroup_create = @resource[:group_create] templates = @resource[:templates] proxy = @resource[:proxy] zabbix_url = @resource[:zabbix_url] @@ -46,10 +47,19 @@ def create if ipaddress.nil? and use_ip == 0 ipaddress = '' end + + if hostgroup_create == true + hostgroup_create = 1 + else + hostgroup_create = 0 + end # First check if we have an correct hostgroup and if not, we raise an error. search_hostgroup = zbx.hostgroups.get_id(:name => hostgroup) - if search_hostgroup.nil? + if search_hostgroup.nil? and hostgroup_create == 1 + zbx.hostgroups.create(:name => hostgroup) + search_hostgroup = zbx.hostgroups.get_id(:name => hostgroup) + elsif search_hostgroup.nil? and hostgroup_create == 0 raise Puppet::Error, "The hostgroup (" + hostgroup + ") does not exist in zabbix. Please use the correct one." end diff --git a/lib/puppet/provider/zabbix_template/ruby.rb b/lib/puppet/provider/zabbix_template/ruby.rb new file mode 100644 index 000000000..5e2827d3d --- /dev/null +++ b/lib/puppet/provider/zabbix_template/ruby.rb @@ -0,0 +1,94 @@ +require File.expand_path(File.join(File.dirname(__FILE__), '..', 'zabbix')) +Puppet::Type.type(:zabbix_template).provide(:ruby, :parent => Puppet::Provider::Zabbix) do + + def create + zabbix_url = @resource[:zabbix_url] + + if zabbix_url != '' + self.class.require_zabbix + end + + # Set some vars + template_name = @resource[:template_name] + template_source = @resource[:template_source] + zabbix_url = @resource[:zabbix_url] + zabbix_user = @resource[:zabbix_user] + zabbix_pass = @resource[:zabbix_pass] + apache_use_ssl = @resource[:apache_use_ssl] + + # Connect to zabbix api + zbx = self.class.create_connection(zabbix_url,zabbix_user,zabbix_pass,apache_use_ssl) + + zbx.configurations.import( + :format => "xml", + :rules => { + :applications => { + :createMissing => true, + :updateExisting => true + }, + :discoveryRules => { + :createMissing => true, + :updateExisting => true + }, + :graphs =>{ + :createMissing => true, + :updateExisting => true + }, + :groups => { + :createMissing => true + }, + :image => { + :createMissing => true, + :updateExisting => true + }, + :items => { + :createMissing => true, + :updateExisting => true + }, + :maps => { + :createMissing => true, + :updateExisting => true + }, + :screens => { + :createMissing => true, + :updateExisting => true + }, + :templateLinkage => { + :createMissing => true + }, + :templates => { + :createMissing => true, + :updateExisting => true + }, + :templateScreens => { + :createMissing => true, + :updateExisting => true + }, + :triggers => { + :createMissing => true, + :updateExisting => true + } + }, + :source => template_source + ) + end + + def exists? + zabbix_url = @resource[:zabbix_url] + + if zabbix_url != '' + self.class.require_zabbix + end + + template_name = @resource[:template_name] + template_source = @resource[:template_source] + zabbix_user = @resource[:zabbix_user] + zabbix_pass = @resource[:zabbix_pass] + apache_use_ssl = @resource[:apache_use_ssl] + + zbx = self.class.create_connection(zabbix_url,zabbix_user,zabbix_pass,apache_use_ssl) + self.class.check_template_is_equal(template_name,template_source,zabbix_url,zabbix_user,zabbix_pass,apache_use_ssl) + + end + +end diff --git a/lib/puppet/type/zabbix_host.rb b/lib/puppet/type/zabbix_host.rb index b7a45dc48..b23a19783 100644 --- a/lib/puppet/type/zabbix_host.rb +++ b/lib/puppet/type/zabbix_host.rb @@ -25,6 +25,10 @@ desc 'Name of the hostgroup.' end + newparam(:group_create) do + desc 'Create hostgroup if missing.' + end + newparam(:templates) do desc 'List of templates which should be loaded for this host.' end diff --git a/lib/puppet/type/zabbix_template.rb b/lib/puppet/type/zabbix_template.rb new file mode 100644 index 000000000..0fa919c76 --- /dev/null +++ b/lib/puppet/type/zabbix_template.rb @@ -0,0 +1,32 @@ +Puppet::Type.newtype(:zabbix_template) do + + ensurable do + defaultvalues + defaultto :present + end + + newparam(:template_name, :namevar => true) do + desc 'The name of template.' + end + + newparam(:template_source) do + desc 'Template source file.' + end + + newparam(:zabbix_url) do + desc 'The url on which the zabbix-api is available.' + end + + newparam(:zabbix_user) do + desc 'Zabbix-api username.' + end + + newparam(:zabbix_pass) do + desc 'Zabbix-api password.' + end + + newparam(:apache_use_ssl) do + desc 'If apache is uses with ssl' + end +end + diff --git a/manifests/agent.pp b/manifests/agent.pp index 211438e0a..ed38c2466 100644 --- a/manifests/agent.pp +++ b/manifests/agent.pp @@ -172,6 +172,7 @@ $monitored_by_proxy = $zabbix::params::monitored_by_proxy, $agent_use_ip = $zabbix::params::agent_use_ip, $zbx_group = $zabbix::params::agent_zbx_group, + $zbx_group_create = $zabbix::params::agent_zbx_group_create, $zbx_templates = $zabbix::params::agent_zbx_templates, $agent_configfile_path = $zabbix::params::agent_configfile_path, $pidfile = $zabbix::params::agent_pidfile, @@ -239,13 +240,14 @@ } class { 'zabbix::resources::agent': - hostname => $::fqdn, - ipaddress => $listen_ip, - use_ip => $agent_use_ip, - port => $listenport, - group => $zbx_group, - templates => $zbx_templates, - proxy => $use_proxy, + hostname => $::fqdn, + ipaddress => $listen_ip, + use_ip => $agent_use_ip, + port => $listenport, + group => $zbx_group, + group_create => $zbx_group_create, + templates => $zbx_templates, + proxy => $use_proxy, } } diff --git a/manifests/params.pp b/manifests/params.pp index d8e2b2492..8e2be0615 100644 --- a/manifests/params.pp +++ b/manifests/params.pp @@ -134,6 +134,7 @@ $monitored_by_proxy = undef $agent_use_ip = true $agent_zbx_group = 'Linux servers' + $agent_zbx_group_create = true $agent_zbx_templates = [ 'Template OS Linux', 'Template App SSH Service' ] $agent_pidfile = '/var/run/zabbix/zabbix_agentd.pid' $agent_logfile = '/var/log/zabbix/zabbix_agentd.log' diff --git a/manifests/resources/agent.pp b/manifests/resources/agent.pp index de5137a15..4aa53cd58 100644 --- a/manifests/resources/agent.pp +++ b/manifests/resources/agent.pp @@ -14,13 +14,14 @@ # # class zabbix::resources::agent ( - $hostname = undef, - $ipaddress = undef, - $use_ip = undef, - $port = undef, - $group = undef, - $templates = undef, - $proxy = undef, + $hostname = undef, + $ipaddress = undef, + $use_ip = undef, + $port = undef, + $group = undef, + $group_create = undef, + $templates = undef, + $proxy = undef, ) { @@zabbix_host { $hostname: @@ -28,6 +29,7 @@ use_ip => $use_ip, port => $port, group => $group, + group_create => $group_create, templates => $templates, proxy => $proxy, zabbix_url => '', diff --git a/manifests/resources/template.pp b/manifests/resources/template.pp new file mode 100644 index 000000000..711a9bd22 --- /dev/null +++ b/manifests/resources/template.pp @@ -0,0 +1,28 @@ +# == Class zabbix::resources::template +# +# This will create an resources into puppetdb +# for automatically configuring agent into +# zabbix front-end. +# +# === Requirements +# +# Nothing. +# +# When manage_resource is set to true, this class +# will be loaded from 'zabbix::template'. So no need +# for loading this class manually. +# +# +define zabbix::resources::template ( + $template_name = $title, + $template_source, +) { + + @@zabbix_template { "${template_name}": + template_source => $template_source, + zabbix_url => '', + zabbix_user => '', + zabbix_pass => '', + apache_use_ssl => '', + } +} diff --git a/manifests/resources/web.pp b/manifests/resources/web.pp index 1f10c1a12..b24c9b04d 100644 --- a/manifests/resources/web.pp +++ b/manifests/resources/web.pp @@ -29,6 +29,12 @@ Package['zabbixapi'], ], } -> + Zabbix_template <<| |>> { + zabbix_url => $zabbix_url, + zabbix_user => $zabbix_user, + zabbix_pass => $zabbix_pass, + apache_use_ssl => $apache_use_ssl, + } -> Zabbix_host <<| |>> { zabbix_url => $zabbix_url, zabbix_user => $zabbix_user, diff --git a/manifests/template.pp b/manifests/template.pp new file mode 100644 index 000000000..08ffd612b --- /dev/null +++ b/manifests/template.pp @@ -0,0 +1,10 @@ +define zabbix::template ( + $templ_name = $title, + $templ_source = '', +) { + + zabbix::resources::template { "${templ_name}": + template_name => $templ_name, + template_source => $templ_source, + } +} \ No newline at end of file