更改 repo 后 Puppet 不更新包

Puppet does not update package after changing the repo

根据 https://docs.gitlab.com/runner/install/linux-repository.html#upgrading-to-gitlab-runner-10 回购协议发生了变化,因此我们正在尝试更新所有节点的 gitlab-运行ner。 我们需要删除旧的 repo 并添加新的,然后更新包。

在我们的 puppet 清单[1] 上,我们更新了 repo,确保包的最新版本,并且在这次更新之后我们必须 运行 一个脚本,然后才能确保服务 运行ning . 我们的问题是我们应该只在更新后 运行 这个脚本。

现在,即使更新了 repo,也没有更新包。软件包仅在 distro_sync 运行s 或我们 运行 "yum update gitlab-运行ner" 时更新,永远不会通过一个木偶 运行。似乎该软件包从未更新过,就好像它正在检查旧版本的最新版本,而不是与最近添加的仓库进行比较。

[1]

# Installs a GitLab-CI runner for CERN GitLab
class gitlab::gitlab_ci_runner (
  String $ensure = 'latest', # passed to the gitlab-runner package. Can be used to force a version
) {
  ensure_resource('yumrepo', 'gitlab-runner', {
      descr    => 'gitlab-runner for EL6/7',
      baseurl  => "http://packages.gitlab.com/runner/gitlab-runner/el/${::operatingsystemmajorrelease}/${::architecture}",
      gpgcheck => 0,
      enabled  => 1,
      exclude  => absent,
  })

  ensure_packages(['gitlab-runner'], {
    ensure  => $ensure,
    require => Yumrepo['gitlab-runner'],
  })

  exec {"post-install":
    command => 'sudo /usr/share/gitlab-runner/post-install',
    provider => shell,
    onlyif  => 'test -e /usr/share/gitlab-runner/post-install',
    refreshonly => true,
    subscribe => Package['gitlab-runner'],
  }

  service { 'gitlab-runner':
    ensure  => running,
    enable  => true,
    require => [Package['gitlab-runner'], Exec["post-install"]]
  }

}

您遇到此行为的原因是 Puppet 在对资源进行目录应用之前预取包资源的存储库元数据。通用provider的源码here for yum and here当前状态请注意相关源码。请注意,链接代码的广泛功能并没有随着时间的推移而改变,因此虽然细微之处可能会改变,但整体行为 has/will 不会。

因此,包的 latest 版本的确定发生在资源的应用之前。因此,在您的情况下,您在目录编译时订阅的存储库将决定包的 latest 版本。您在目录应用期间更改存储库订阅不会影响 ensure => latest.

的行为

正如您可能猜到的那样,确保特定版本仍将具有预期的效果,因为它将利用新存储库并且不会发生关于 latest 的资源预取(其他预取仍会发生)。或者,连续的目录应用程序将对 ensure => latest 产生预期的效果。总而言之,此处的解决方法选项是:

  • 连续两次应用Puppet目录。
  • ensure => <version> 指定确切版本或 version-release,例如 10.0.5-el7.

如您所料,Gary 的博客文章 here 是有关资源预取的重要信息来源。向下滚动到以 "Prefetching, flushing, caching, and other" 开头的标题。请注意关于 Gary 的博客 "strong language" 的正常警告。它的官方文档基本上没有用。