resources/google_cloud_ops_agents.rb (142 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. # To learn more about Custom Resources, see https://docs.chef.io/custom_resources/ # Use upgrade because it'll fall back to install if software isn't installed already # By using upgrade as the default action, if the admin changes the version attribute, # then the software will update. If this was set to just install, changing the version # attribute would not result in servers being upgraded. default_action :upgrade resource_name :google_cloud_ops_agents provides :google_cloud_ops_agents unified_mode true # Install software, at the specified version action :install do case node['platform_family'] when 'rhel', 'debian', 'suse', 'amazon' bash node['file_url_name'] do cwd node['tmp_file_path'] code "./#{node['file_url_name']} --also-install --version=#{node['version']}" only_if "./#{node['file_url_name']} --also-install --version=#{node['version']} --dry-run | grep -qi 'installation succeeded'" == 0 user 'root' end case node['agent_type'] when 'ops-agent' servicename = 'google-cloud-ops-agent' when 'monitoring' servicename = 'stackdriver-agent' when 'logging' servicename = 'google-fluentd' end service servicename do action [:start, :enable] # TODO: When CINC fixes the bug related to this, uncomment the below line # user 'root' end # The user parameter for service isn't working, hack to bypass # TODO: once the service command above has the bug fixed and can # specify user properly, remove this. bash 'hack service' do user 'root' code "systemctl enable #{servicename}" end when 'windows' powershell_script node['file_url_name'] do cwd node['tmp_file_path'] code "#{node['tmp_file_path']}/#{node['file_url_name']} -AlsoInstall -Version #{node['version']}" only_if "#{node['file_url_name']} -AlsoInstall -Version #{node['version']} -WhatIf | findstr /i \"Verification of google-cloud-ops-agent.x86_64.${version} completed\"" == 0 end end end # Upgrade software to the specified version, or install if it software # isn't already present. action :upgrade do case node['platform_family'] when 'rhel', 'debian', 'suse', 'amazon' bash node['file_url_name'] do cwd node['tmp_file_path'] code "./#{node['file_url_name']} --also-install --version=#{node['version']}" only_if "./#{node['file_url_name']} --also-install --version=#{node['version']} --dry-run | grep -qi 'installation succeeded'" == 0 user 'root' end case node['agent_type'] when 'ops-agent' servicename = 'google-cloud-ops-agent' when 'monitoring' servicename = 'stackdriver-agent' when 'logging' servicename = 'google-fluentd' end service servicename do action [:start, :enable] # TODO: When CINC fixes the bug related to this, uncomment the below line # user 'root' end # The user parameter for service isn't working, hack to bypass # TODO: once the service command above has the bug fixed and can # specify user properly, remove this. bash 'hack service' do user 'root' code "systemctl enable #{servicename}" end when 'windows' powershell_script node['file_url_name'] do cwd node['tmp_file_path'] code "#{node['tmp_file_path']}/#{node['file_url_name']} -AlsoInstall -Version #{node['version']}" only_if "#{node['file_url_name']} -AlsoInstall -Version #{node['version']} -WhatIf | findstr /i \"Verification of google-cloud-ops-agent.x86_64.${version} completed\"" == 0 end end end # Uninstall the software, and remove the repository action :uninstall do # Run the appropriate uninstaller case node['platform_family'] when 'rhel', 'debian', 'suse', 'amazon' bash node['file_url_name'] do cwd node['tmp_file_path'] code "./#{node['file_url_name']} --uninstall --remove-repo" only_if "./#{node['file_url_name']} --uninstall --remove-repo --dry-run | grep -qi 'uninstallation succeeded'" == 0 unless node['file_url_name'].include? 'ops-agent' action :nothing end user 'root' notifies :run, 'bash[daemon-reload]', :immediately end # Script does not stop logging or monitoring services # So we must do it manually case node['agent_type'] when 'ops-agent' servicename = 'google-cloud-ops-agent' when 'monitoring' servicename = 'stackdriver-agent' when 'logging' servicename = 'google-fluentd' end service servicename do action :disable # TODO: When CINC fixes the bug related to this, uncomment the below line # user 'root' end service servicename do action :stop notifies :run, "bash[#{node['file_url_name']}]", :immediately # TODO: When CINC fixes the bug related to this, uncomment the below line # user 'root' end bash 'daemon-reload' do code 'systemctl daemon-reload && systemctl reset-failed' user 'root' action :nothing end # Uninstall is not properly removing these files, so we do it here if node['agent_type'] == 'monitoring' svc_file = '/etc/rc.d/init.d/stackdriver-agent' unit_file = '/run/systemd/generator.late/stackdriver-agent.service' elsif node['agent_type'] == 'logging' svc_file = '/etc/rc.d/init.d/google-fluentd' unit_file = '/run/systemd/generator.late/google-fluentd.service' end unless svc_file.nil? || unit_file.nil? file svc_file do action :delete only_if { ::File.exist?(svc_file) } end file unit_file do action :delete only_if { ::File.exist?(unit_file) } end end when 'windows' powershell_script node['file_url_name'] do cwd node['tmp_file_path'] code "#{node['tmp_file_path']}/#{node['file_url_name']} -Uninstall -RemoveRepo -Version #{node['version']}" only_if "#{node['file_url_name']} -Uninstall -RemoveRepo -Version #{node['version']} -WhatIf | findstr /i \"Verification of google-cloud-ops-agent.x86_64.${version} completed\"" == 0 end end end # Download the file(s) needed to install the software action :download do # Create the temp directory if it doesn't exist directory node['tmp_file_path'] do unless platform_family?('windows') owner 'root' group 'root' end mode '0777' action :create end # Download our target file remote_file 'Download Installer Script' do source node['file_url'] mode '0755' action :create path "#{node['tmp_file_path']}/#{node['file_url_name']}" end end