recipes/default.rb (86 lines of code) (raw):
# Copyright:: 2021 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Validate the agent type
unless %w(ops-agent monitoring logging).include? node['agent_type']
Chef::Log.fatal("Received invalid agent type: '#{node['agent_type']}'. The Cloud Ops Chef cookbook supports the following agents: 'monitoring', 'logging' and 'ops-agent'.")
end
# For windows, only the ops-agent is supported
if platform_family?('windows') && (%w(monitoring logging).include? node['agent_type'])
Chef::Log.fatal("The agent type was specified as '#{node['agent_type']}', but only 'ops-agent' is supported on Windows")
end
# Validate the package state
unless %w(present absent).include? node['package_state']
Chef::Log.fatal("Received invalid package state: '#{node['package_state']}'. The Cloud Ops Chef cookbook supports the following package states: 'present' and 'absent'.")
end
if (%w(ops-agent).include? node['agent_type']) && !node['additional_config_dir'].empty?
Chef::Log.fatal("The ops agent does not support additional configurations. additional_config_dir must be empty when the agent_type is 'ops-agent'.")
end
# Work out what the OS family is.
# Error for unsupported OS
unless platform_family?('rhel', 'debian', 'suse', 'amazon', 'windows')
Chef::Log.fatal("Received invalid Operating System Platform Family: '#{node['platform_family']}'. The Cloud Ops Chef cookbook supports the following OSs: Debian, Ubuntu, RedHat,
CentOS, Amazon, SLES, openSUSE, SuSE, SLES_SAP and Windows via the Chef 'platform_family' attribute.")
end
# If the package_state specifies present, we should be doing install or upgrade
if node['package_state'] == 'present'
google_cloud_ops_agents 'Download Software' do
action :download
end
google_cloud_ops_agents 'Install Software' do
action :install
end
# Config File and Plugins Dir Variables
config_path = 'C:/Program Files/Google/Cloud Operations/Ops Agent/config/config.yaml'
plugins_path = ''
unless platform_family?('windows')
if node['agent_type'] == 'ops-agent'
config_path = '/etc/google-cloud-ops-agent/config.yaml'
elsif node['agent_type'] == 'monitoring'
config_path = '/etc/stackdriver/collectd.conf'
plugins_path = '/etc/stackdriver/collectd.d'
elsif node['agent_type'] == 'logging'
config_path = '/etc/google-fluentd/google-fluentd.conf'
plugins_path = '/etc/google-fluentd/plugin'
end
end
# Main Config File
# rubocop:disable Metrics/BlockNesting
unless node['main_config'].empty?
if node['main_config'].end_with?('.yaml.erb') || node['main_config'].end_with?('.conf.erb')
# Template
template config_path do
source node['main_config']
unless platform_family?('windows')
owner 'root'
group 'root'
mode '0644'
end
end
elsif node['main_config'].end_with?('.yaml') || node['main_config'].end_with?('.conf')
# Remote File
remote_file config_path do
source node['main_config']
unless platform_family?('windows')
owner 'root'
group 'root'
mode '0644'
end
end
else
# Failure due to incorrect file type
Chef::Log.fatal('The `main_config` attribute was set to an invalid value. It must either be a Chef template or a file ending in .yaml or .conf')
end
end
# Additional config dir for plugins
unless node['additional_config_dir'].empty?
# Create the plugins dir if needed
directory plugins_path do
action :create
recursive true
unless platform_family?('windows')
owner 'root'
group 'root'
mode '0644'
end
end
# Recursively copy the files
node['additional_config_dir'].split(',').each do |plugin_file|
Chef::Log.info("Evaluating Plugin File: #{plugin_file} from #{node['additional_config_dir']}")
remote_file "#{plugins_path}/#{File.basename(plugin_file)}" do
source "file://#{plugin_file}"
owner 'root'
group 'root'
mode '0644'
end
end
end
# rubocop:enable Metrics/BlockNesting
# If it specifies absent, we should be doing uninstall
elsif node['package_state'] == 'absent'
google_cloud_ops_agents 'Uninstall Software' do
action :uninstall
end
# Otherwise, we need to display an error
else
Chef::Log.fatal("Unknown option for package_state. Allowed options are 'present' and 'absent'")
end