使用 Puppet 安装 Jenkins 无法导入 GPG 密钥

使用 Puppet 安装 Jenkins 无法导入 GPG 密钥

我正在尝试使用以下清单通过 Puppet 安装 Jenkins。

    # init.pp
    class jenkins {
      include jenkins::install, jenkins::service
    }

    # service.pp
    class jenkins::service {
      service { "jenkins":
        ensure     => running,
        hasstatus  => true,
        hasrestart => true,
        enable     => true,
        require    => Class["jenkins::install"],
      }
    }

    # install.pp
    class jenkins::install {
      include jenkins::install::repo
      include jenkins::install::java

      package { "jenkins":
        ensure  => present,
        require => Class['jenkins::install::repo','jenkins::install::java'],
      }
    }

    # install/repo.pp
    class jenkins::install::repo {
      file { "/etc/pki/rpm-gpg/jenkins-ci.org.key":
        owner  => root,
        group  => root,
        mode   => 0600,
        source => "puppet:///jenkins/jenkins-ci.org.key"
      }

      yumrepo { "jenkins":
        baseurl  => "http://pkg.jenkins-ci.org/redhat",
        descr    => "Jenkins",
        enabled  => 1,
        gpgcheck => 1,
        gpgkey   => "file:///etc/pki/rpm-gpg/jenkins-ci.org.key",
        require  => File["/etc/pki/rpm-gpg/jenkins-ci.org.key"]
      }
    }

    # install/java.pp
    class jenkins::install::java {
      package { "java-1.6.0-openjdk":
        ensure => present,
      }
    }

已添加 repo 并将密钥写入文件系统。但是,我收到以下错误。

    err: /Stage[main]/Jenkins::Install/Package[jenkins]/ensure: change from absent to present failed: Execution of '/usr/bin/yum -d 0 -e 0 -y install jenkins' returned 1: warning: rpmts_HdrFromFdno: Header V4 DSA signature: NOKEY, key ID d50582e6
    Traceback (most recent call last):
      File "/usr/bin/yum", line 29, in ?
        yummain.user_main(sys.argv[1:], exit_code=True)
      File "/usr/share/yum-cli/yummain.py", line 309, in user_main
        errcode = main(args)
      File "/usr/share/yum-cli/yummain.py", line 261, in main
        return_code = base.doTransaction()
      File "/usr/share/yum-cli/cli.py", line 410, in doTransaction
        if self.gpgsigcheck(downloadpkgs) != 0:
      File "/usr/share/yum-cli/cli.py", line 510, in gpgsigcheck
        self.getKeyForPackage(po, lambda x, y, z: self.userconfirm())
      File "/usr/lib/python2.4/site-packages/yum/__init__.py", line 3519, in getKeyForPackage
        keys = self._retrievePublicKey(keyurl, repo)
      File "/usr/lib/python2.4/site-packages/yum/__init__.py", line 3484, in _retrievePublicKey
        keys_info = misc.getgpgkeyinfo(rawkey, multiple=True)
      File "/usr/lib/python2.4/site-packages/yum/misc.py", line 375, in getgpgkeyinfo
        raise ValueError(str(e))
    ValueError: unknown pgp packet type 17 at 706

这说明密钥未成功导入,并且rpm -qa gpg-pubkey不显示密钥。如果我手动yum install jenkins导入密钥而不导入密钥,则会出现同样的错误。导入密钥后,手动安装成功。

我已经成功安装了其他 yum 存储库和独立密钥(基本上是install/repo.pp清单作为其自己的模块),例如 EPEL,但由于此存储库仅适用于 Jenkins,所以我想将其包含在我的 Jenkins 模块中。

我的清单有问题吗?还是有其他问题?

更新

以下清单导致安装了 jenkins 和 epel repos,rpm -qa gpg-pub*显示了 epel 密钥但没有显示 jenkins 密钥,并且安装了 git 但没有安装 jenkins。

    class jenkins { 
      yumrepo {"jenkins":
        baseurl  => "http://pkg.jenkins-ci.org/redhat",
        descr    => "Jenkins",
        enabled  => 1,
        gpgcheck => 1,
        gpgkey   => "http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key",
      }
      package {"jenkins":
        ensure  => latest,
        require => Yumrepo["jenkins"]
      }
    }

    class git { 
      yumrepo {"epel":
        baseurl  => "http://mirror.aarnet.edu.au/pub/epel/5/i386",
        descr    => "Extra Packages for Enterprise Linux (EPEL)",
        enabled  => 1,
        gpgcheck => 1,
        gpgkey   => "http://keys.gnupg.net:11371/pks/lookup?search=0x217521F6&op=get",
      }
      package {"git":
        ensure  => latest,
        require => Yumrepo["epel"]
      }
    }

    include jenkins
    include git

更新

应包括软件版本:

  • CentOS 5.7
  • ruby 1.8.5(2006-08-25)
  • Puppet v2.7.9
  • yum-3.2.22
  • rpm-4.4.2.3

答案1

看来 rpm 在导入 Jenkins 密钥时遇到了问题,因为它包含 JPEG 图像。

https://www.rfc-editor.org/rfc/rfc4880

数据包类型 17 是一张图片:

https://www.rfc-editor.org/rfc/rfc4880#section-5.12

> gpg --list-keys D50582E6
出版 1024D/D50582E6 2009-02-01
uid川口浩介
uid川口浩介
uid [尺寸为 3704 的 jpeg 图像]
子 2048g/10AF40FE 2009-02-01

RPM 似乎不知道如何处理它。

> sudo rpm --import jenkins-ci.org.key
我的[sudo]密码是:
错误:jenkins-ci.org.key:导入读取失败(-1)。

在 Google 上搜索有关 RPM 的任何已知问题并没有发现任何明显的结果,但也许这会给你一个方向。

答案2

我测试了您的简化清单:

  • CentOS 6.2
  • ruby 1.8.7(2011-06-30 补丁级别 352)
  • Puppet v2.7.9
  • yum-3.2.29-22.el6
  • rpm-4.8.0-19.el6

两个 repos 均已成功添加。

从错误信息来看,错误信息确实来自 yum,而不是 puppet 或其他任何东西。

您能对您的环境提供类似的描述吗?可能最重要的是 yum 的版本。

尝试将其升级到至少 3.2.29(最新稳定版本 3.2.x)。变更日志是这里,引用一些重大修复与 GPG 密钥相关。

答案3

这是非常事后的事情,但这就是我最终的结果:

if ($::operatingsystemmajrelease == '5'){
  exec { 'EL5 Jenkins Key Workaround':
    command  => 'rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key',
    unless   => "rpm -qa --nodigest --nosignature --qf '%{VERSION}-%{RELEASE} %{SUMMARY}\n' | grep d50582e6",
    path     => ['/bin', '/usr/bin'],
  }
}

我添加了一个 PR,将此解决方法添加到官方模块:

https://github.com/jenkinsci/puppet-jenkins/pull/344/files

更详细的分解如下:

http://dan.carley.co/blog/2012/05/22/yum-gpg-keys-for-jenkins/

答案4

您可能需要rpm --import <PUBKEY>在清单中添加命令。

Exec 类型参考文档是这里

也许您可以尝试将其添加assumeyes=1到 repo 文件中,并与 gpgkey 选项一起自动添加密钥。

相关内容