为 puppetmaster 上的客户端生成 ssh 主机密钥

为 puppetmaster 上的客户端生成 ssh 主机密钥

我正在寻找一种解决方案来为 puppetmaster 上的 puppet 客户端创建 ssh 主机密钥。我做了一些研究,发现 http://jsosic.wordpress.com/2012/12/04/managing-ssh-host-keys-with-puppet/,但我无法让它工作。有没有更优雅的解决方案来处理这个问题或者完整的例子?

我知道可以在客户端上生成主机密钥并将其备份到 puppetmaster,但我真的更喜欢直接在主机上生成它们。

编辑:

我创建了一个模块“ssh”。

init.pp的内容为:

类 ssh::服务器 {
  如果生成('/etc/puppet/modules/ssh/scripts/generate_host_keys.sh',
$keys_dir) {
    包括 ssh::server::keys
  }
}

类 ssh::服务器::密钥 {
  文件 {'/etc/ssh/ssh_host_rsa_key.pub':
    确保 => 文件,
    所有者 => 根,
    组 => 根,
    模式 => '0644',
    来源 => [
      “puppet:///private/ssh/ssh_host_rsa_key.pub”,
      “puppet:///modules/ssh/ssh_host_rsa_key.pub”,
    ],
    需要 => 包['openssh-server'],
    通知 => 服务[$service_name],
  }
}

generate_host_keys.sh的内容如下:

/bin/bash #!/bin/bash

# 检查 arg0:目录中的密钥
[ -z "$1" ] && echo "请指定密钥生成目录" && exit 1
KEYSDIR="$1"

# 设置 umask
umask 0022

# 如果不存在则创建目录树
[ !-d “$KEYSDIR” ] && mkdir -p $KEYSDIR

#
# 从 CentOS 6 sshd init 脚本中窃取的功能
#

# 一些函数使下面的内容更具可读性
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

# 源函数库
。 /etc/rc.d/init.d/functions

fips_enabled(){
  如果 [ -r /proc/sys/crypto/fips_enabled ]; 那么
    cat /proc/sys/crypto/fips_enabled
  别的  
    回显 0
}

do_rsa1_keygen(){
  如果 [ !-s $RSA1_KEY -a `fips_enabled` -eq 0 ]; 然后
    echo -n $“生成 SSH1 RSA 主机密钥:”
    rm -f $RSA1_KEY
    如果测试!-f $RSA1_KEY && $KEYGEN -q -t rsa1 -f $RSA1_KEY -C''-N''>&/dev/null;然后
      chmod 600 $RSA1_KEY
      chmod 644 $RSA1_KEY.pub
      成功 $"RSA1 密钥生成"
      回声
    别的  
      失败$“RSA1 密钥生成”
      回声
      出口 1
}

执行rsa_keygen(){
  如果 [ !-s $RSA_KEY ]; 那么
    echo -n $“生成 SSH2 RSA 主机密钥:”
    rm -f $RSA_KEY
    如果测试!-f $RSA_KEY && $KEYGEN -q -t rsa -f $RSA_KEY -C''-N''>&/dev/null;然后
      chmod 600 $RSA_KEY
      chmod 644 $RSA_KEY.pub
      成功 $"RSA 密钥生成"
      回声
    别的
      失败 $“RSA 密钥生成”
      回声
      出口 1
}

执行 dsa_keygen() {
  如果 [ !-s $DSA_KEY ]; 那么
    echo -n $"生成 SSH2 DSA 主机密钥:"
    rm -f $DSA_KEY
    如果测试!-f $DSA_KEY && $KEYGEN -q -t dsa -f $DSA_KEY -C''-N''>&/dev/null;然后
      chmod 600 $DSA_KEY
      chmod 644 $DSA_KEY.pub
      成功 $"DSA 密钥生成"
      回声
    别的
      失败 $“DSA 密钥生成”
      回声
      出口 1
}

# 主要的
do_rsa1_keygen
执行rsa密钥生成
密钥生成
chmod -R 644 $KEYSDIR/*
出口 0

manifests/site.pp 看起来像这样

节点 {'mynode':
  包括 ssh::server
}

在客户端上运行 puppet agent --test 会产生以下输出:

信息:正在检索插件
错误:无法从远程服务器检索目录:服务器上出现错误 400:无法执行生成器 /etc/puppet/modules/ssh/scripts/generate_host_keys.sh:在节点 nodename 上的 /etc/puppet/modules/ssh/manifests/init.pp:2 处执行“/etc/puppet/modules/ssh/scripts/generate_host_keys.sh”返回 1:
警告:未在失败的目录上使用缓存
错误:无法检索目录;跳过运行

谢谢,

保罗

答案1

  1. 尝试添加/usr/bin/env作为生成函数的第一个参数:
    if generate('/usr/bin/env','/etc/puppet/modules/ssh/scripts/generate_host_keys.sh', $keys_dir) {

  2. 验证脚本在退出时返回 0,非零返回代码将使解析器抛出错误 400

相关内容