cookbooks/aws-parallelcluster-slurm/resources/munge_key_manager.rb (74 lines of code) (raw):
# frozen_string_literal: true
#
# Cookbook:: aws-parallelcluster-slurm
# Recipe:: config_head_node
#
# Copyright:: 2013-2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance with the
# License. A copy of the License is located at
#
# http://aws.amazon.com/apache2.0/
#
# or in the "LICENSE.txt" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
# OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions and
# limitations under the License.
resource_name :munge_key_manager
provides :munge_key_manager
unified_mode true
property :munge_key_secret_arn, String
default_action :setup_munge_key
def restart_munge_service
declare_resource(:service, "munge") do
supports restart: true
action :restart
retries 5
retry_delay 10
end unless on_docker?
end
def enable_munge_service
declare_resource(:service, "munge") do
supports restart: true
action :enable
retries 5
retry_delay 10
end unless on_docker?
end
def share_munge_key_to_dir(shared_dir)
declare_resource(:bash, 'share_munge_key') do
user 'root'
group 'root'
code <<-SHARE_MUNGE_KEY
set -e
mkdir -p #{shared_dir}/.munge
# Copy key to shared dir
cp /etc/munge/munge.key #{shared_dir}/.munge/.munge.key
chmod 0700 #{shared_dir}/.munge
chmod 0600 #{shared_dir}/.munge/.munge.key
SHARE_MUNGE_KEY
end
end
def share_munge
share_munge_key_to_dir(node['cluster']['shared_dir'])
share_munge_key_to_dir(node['cluster']['shared_dir_login_nodes'])
end
# TODO: Consider renaming 'generate_munge_key' and 'fetch_and_decode_munge_key' to more descriptive names that better convey their functionalities.
def fetch_and_decode_munge_key
declare_resource(:execute, 'fetch_and_decode_munge_key') do
user 'root'
group 'root'
command "/#{node['cluster']['scripts_dir']}/slurm/update_munge_key.sh -d"
end
end
def generate_munge_key
declare_resource(:bash, 'generate_munge_key') do
user node['cluster']['munge']['user']
group node['cluster']['munge']['group']
cwd '/tmp'
code <<-GENERATE_KEY
set -e
/usr/sbin/mungekey --verbose --force
chmod 0600 /etc/munge/munge.key
GENERATE_KEY
end
# This function randomly generates a new munge key.
# After generating the key, it is essential to restart the munge service so that it starts using the new key.
# Moreover, the new key has to be shared across relevant directories to ensure consistent authentication across the cluster.
# We're restarting the munge service and sharing the munge key here within the `generate_munge_key` method,
# and not within the `fetch_and_decode_munge_key` method because the `update_munge_key.sh` script,
# which is called by `fetch_and_decode_munge_key`, already includes these two operations.
restart_munge_service
enable_munge_service
share_munge
end
action :setup_munge_key do
if new_resource.munge_key_secret_arn
# This block will fetch the munge key from Secrets Manager
fetch_and_decode_munge_key
else
# This block will randomly generate a munge key
generate_munge_key
end
end
action :update_munge_key do
if new_resource.munge_key_secret_arn
# This block will fetch the munge key from Secrets Manager and replace the previous munge key
fetch_and_decode_munge_key
else
# This block will randomly generate a munge key and replace the previous munge key
generate_munge_key
end
end