forked from chef-boneyard/cookbooks
-
Notifications
You must be signed in to change notification settings - Fork 1
/
zenbatchload.rb
83 lines (82 loc) · 3.16 KB
/
zenbatchload.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#loads the hash into a file for zenbatchload and loads it
action :run do
devices = new_resource.devices
locations = new_resource.locations
groups = new_resource.groups
batch = ""
Chef::Log.debug "zenbatchload devices:#{devices}"
Chef::Log.debug "zenbatchload locations:#{locations}"
Chef::Log.debug "zenbatchload groups:#{groups}"
#sort the hash and construct the batchload file
devices.keys.sort!.each do |dclass|
batch += "#{dclass}\n"
devices[dclass].sort_by {|n| n.ipaddress}.each do |device|
#set for hybrid clouds
if device.attribute["cloud"] and device.attribute["cloud"]["public_ips"]
batch += "#{device.cloud.public_ips[0]} "
else
batch += "#{device.ipaddress} "
end
#set the ID to the ec2 public name or fqdn
if device.attribute["ec2"]
batch += "setTitle='#{device["ec2"]["public_hostname"]}', "
else
batch += "setTitle='#{device["fqdn"]}', "
end
#set the Location & Groups
devlocation = ""
devgroups = "setGroups=[["
device.roles.each do |role|
if locations.member?(role)
devlocation = "setLocation='#{role}', "
elsif groups.member?(role)
devgroups += "'#{role}',"
end
#ignore deviceclass roles
end
devgroups += "]], "
batch += "#{devlocation}#{devgroups}"
#set the Systems
devsystems = "setSystems=[["
systems = device.expand!.recipes
systems.collect! {|sys| sys.gsub('::', '/')}
systems.each {|sys| devsystems += "'#{sys}',"}
devsystems += "]], "
batch += "#{devsystems}"
#only use device.attribute["zenoss"]["device"].current_normal for node-specific templates, modeler_plugins and properties
if node.attribute["zenoss"] and node.attribute["zenoss"]["device"] and node.attribute["zenoss"]["device"].current_normal
if node.attribute["zenoss"]["device"].current_normal["modeler_plugins"]
plugins = node.attribute["zenoss"]["device"].current_normal["modeler_plugins"]
batch += "zCollectorPlugins=#{plugins}, "
end
if node.attribute["zenoss"]["device"].current_normal["templates"]
templates = node.attribute["zenoss"]["device"].current_normal["templates"]
batch += "zDeviceTemplates=#{templates}, "
end
if node.attribute["zenoss"]["device"].current_normal["properties"]
node.attribute["zenoss"]["device"].current_normal["properties"].each {|k, v| batch += "#{k}='#{v}', " }
end
end
batch += "\n"
end
end
Chef::Log.debug batch
#write the content to a temp file
file "/tmp/chefzenbatch.batch" do
owner "zenoss"
mode "0600"
content batch
action :create
end
#run the command as the zenoss user
execute "zenbatchload" do
user "zenoss"
environment ({
'LD_LIBRARY_PATH' => "#{node[:zenoss][:server][:zenhome]}/lib",
'PYTHONPATH' => "#{node[:zenoss][:server][:zenhome]}/lib/python",
'ZENHOME' => node[:zenoss][:server][:zenhome]
})
command "#{node[:zenoss][:server][:zenhome]}/bin/zenbatchload /tmp/chefzenbatch.batch"
action :run
end
end