更改 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" 的正常警告。它的官方文档基本上没有用。
根据 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" 的正常警告。它的官方文档基本上没有用。