我正在寻找一种解决方案来为 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
尝试添加
/usr/bin/env
作为生成函数的第一个参数:
if generate('/usr/bin/env','/etc/puppet/modules/ssh/scripts/generate_host_keys.sh', $keys_dir) {
验证脚本在退出时返回 0,非零返回代码将使解析器抛出错误 400