Puppet Plan: complyadm::support_bundle::collect_target_info
- Defined in:
- plans/support_bundle/collect_target_info.pp
Summary
Collects info from all Comply targetsOverview
This plan gathers data from all Comply targets so it can be included in the support bundle. A large portion of the data is collected by the ‘collect_target_info’ task which is done to optimize the number of SSH sessions we use as a consequence of data collection. It allows us to have one task collect most of the target specific data. The plan also collects facter data from each target. Log volumes for each container service are downloaded as well.
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 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
# File 'plans/support_bundle/collect_target_info.pp', line 13
plan complyadm::support_bundle::collect_target_info(
Complyadm::Config $config,
String[1] $root_dir,
) {
$roles_for_targets = $config['all_targets'].reduce({}) |$memo, $target| {
$matching_roles = $config['roles'].filter |$role_name, $role_value| {
$role_value['targets'].any |$found_target| { $target == $found_target }
}
$memo + { $target => $matching_roles }
}
$target_data_dest = file::join($root_dir, 'targets')
without_default_logging() || {
run_command("mkdir ${target_data_dest}", 'localhost')
$config['all_targets'].each |$target| {
run_command("mkdir ${file::join($target_data_dest, $target.name)}", 'localhost')
}
}
$collect_info_results = run_task_with(
'complyadm::collect_target_info',
$config['all_targets'],
'_run_as' => 'root',
'_catch_errors' => true,
) |$target| {
$roles = $roles_for_targets[$target]
# Calculate what Journald logs should be collected
$journald_services = $roles.map |$role_name, $role_value| {
Complyadm::Support_bundle::Journald_services.new({
'role_name' => $role_name,
'services' => $role_value['services'].keys,
})
}
# If applicable, provides the info needed by the task to connect to the database in order to run diagnostic queries.
# This works for AIO, but when we have multiple targets that can have the DB role, we'll just want the task to run on the main DB
# target.
if $roles['database'] != undef {
$database_info = Complyadm::Support_bundle::Database_info.new({
'container_name' => $roles['database']['services']['comply_postgres']['container']['name'],
'database_user' => $roles['database']['services']['comply_postgres']['comply_db_username'],
})
}
$target_params = {
'runtime' => $config['runtime'],
'journald_services' => $journald_services,
'database_info' => $database_info,
}
$target_params
}
without_default_logging() || {
# Download the tmp dir from the target
$collect_info_results.each |$result| {
$src_tmpdir = $result.value['tmpdir']
complyadm::download_file(
$src_tmpdir,
file::join($target_data_dest, $result.target.name),
$result.target,
{ '_run_as' => 'root' },
true
)
run_command("rm -r ${result.value['tmpdir']}", $result.target, '_run_as' => 'root', '_catch_errors' => true)
}
# Collect facts
$facter_keys = [
'load_averages',
'memory',
'disks',
'mountpoints',
'os',
'partitions',
'processors',
]
out::message('Gathering facts from targets...')
# Needed so facts are pulled from the target
apply_prep($config['all_targets'], { '_run_as' => 'root' })
$config['all_targets'].each |$target| {
$facts_hash = $target.facts
$facter_result = $facter_keys.reduce({}) |$fact_memo, $key| {
if($key in $facts_hash) {
$fact_memo + { $key => $facts_hash[$key] }
} else {
$fact_memo
}
}
$facts_dest_path = file::join($target_data_dest, $target.name, 'system')
file::write(file::join($facts_dest_path, 'facter.json'), stdlib::to_json_pretty($facter_result))
}
}
}
|