Eu procuro uma solução para criar as chaves do host ssh para meus clientes de marionetes no mestre de fantoches.
Eu fiz alguma pesquisa e encontrei o link , mas eu pude não funciona. Existe uma solução mais elegante para lidar com isso ou um exemplo completo disso?
Eu sei que é possível gerar as chaves do host nos clientes e fazer o backup delas até o mestre de bonecos, mas eu realmente prefiro gerá-las diretamente no mestre.
Editar:
Eu criei um módulo 'ssh'.
O conteúdo do init.pp é:
class ssh::server {
if generate('/etc/puppet/modules/ssh/scripts/generate_host_keys.sh',
$keys_dir) {
include ssh::server::keys
}
}
class ssh::server::keys {
file { '/etc/ssh/ssh_host_rsa_key.pub':
ensure => file,
owner => root,
group => root,
mode => '0644',
source => [
'puppet:///private/ssh/ssh_host_rsa_key.pub',
'puppet:///modules/ssh/ssh_host_rsa_key.pub',
],
require => Package['openssh-server'],
notify => Service[$service_name],
}
}
O conteúdo do generate_host_keys.sh é o seguinte:
#!/bin/bash
# check arg0: dir for keys
[ -z "$1" ] && echo "Please specify directory for key generation" && exit 1
KEYSDIR="$1"
# set umask
umask 0022
# create directory tree if it does not exist
[ ! -d "$KEYSDIR" ] && mkdir -p $KEYSDIR
#
# functions stolen from CentOS 6 sshd init script
#
# Some functions to make the below more readable
KEYGEN=/usr/bin/ssh-keygen
RSA1_KEY=$1/ssh_host_key
RSA_KEY=$1/ssh_host_rsa_key
DSA_KEY=$1/ssh_host_dsa_key
# source function library
. /etc/rc.d/init.d/functions
fips_enabled() {
if [ -r /proc/sys/crypto/fips_enabled ]; then
cat /proc/sys/crypto/fips_enabled
else
echo 0
fi
}
do_rsa1_keygen() {
if [ ! -s $RSA1_KEY -a 'fips_enabled' -eq 0 ]; then
echo -n $"Generating SSH1 RSA host key: "
rm -f $RSA1_KEY
if test ! -f $RSA1_KEY && $KEYGEN -q -t rsa1 -f $RSA1_KEY -C '' -N '' >&/dev/null; then
chmod 600 $RSA1_KEY
chmod 644 $RSA1_KEY.pub
success $"RSA1 key generation"
echo
else
failure $"RSA1 key generation"
echo
exit 1
fi
fi
}
do_rsa_keygen() {
if [ ! -s $RSA_KEY ]; then
echo -n $"Generating SSH2 RSA host key: "
rm -f $RSA_KEY
if test ! -f $RSA_KEY && $KEYGEN -q -t rsa -f $RSA_KEY -C '' -N '' >&/dev/null; then
chmod 600 $RSA_KEY
chmod 644 $RSA_KEY.pub
success $"RSA key generation"
echo
else
failure $"RSA key generation"
echo
exit 1
fi
fi
}
do_dsa_keygen() {
if [ ! -s $DSA_KEY ]; then
echo -n $"Generating SSH2 DSA host key: "
rm -f $DSA_KEY
if test ! -f $DSA_KEY && $KEYGEN -q -t dsa -f $DSA_KEY -C '' -N '' >&/dev/null; then
chmod 600 $DSA_KEY
chmod 644 $DSA_KEY.pub
success $"DSA key generation"
echo
else
failure $"DSA key generation"
echo
exit 1
fi
fi
}
# main
do_rsa1_keygen
do_rsa_keygen
do_dsa_keygen
chmod -R 644 $KEYSDIR/*
exit 0
manifests / site.pp parece com isso
node { 'mynode':
include ssh::server
}
A execução do teste de agente de marionetes no cliente produz a seguinte saída:
Info: Retrieving plugin
Error: Could not retrieve catalog from remote server: Error 400 on SERVER: Failed to execute generator /etc/puppet/modules/ssh/scripts/generate_host_keys.sh: Execution of '/etc/puppet/modules/ssh/scripts/generate_host_keys.sh ' returned 1: at /etc/puppet/modules/ssh/manifests/init.pp:2 on node nodename
Warning: Not using cache on failed catalog
Error: Could not retrieve catalog; skipping run
Obrigado,
Paul