首页 > 解决方案 > 如何使用 Puppet 正确安装存储库

问题描述

我正在努力使用 Puppet 安装存储库,特别是 zabbix 存储库。我从这里获得了 CentOS 7 的 zabbix 存储库,并且正在使用以下内容:

http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm

我尝试使用以下 Puppet 代码将其安装在我的节点上,但它似乎不起作用:

node 'puppet-agent' {
    include importRepos
    package { 'php':
        ensure => "installed",
    }
    package { 'zabbix-agent':
        ensure => "installed", 
    }

}

class importRepos {
    yumrepo { "zabbix":
        baseurl => "http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm",
        descr => "Zabbix repo to install Zabbix client on CentOS 7",
        enabled => 1,
        gpgcheck => 1
        }
}

我得到的错误是:

...
Execution of '/usr/bin/yum -d 0 -e 0 -y install zabbix-agent' returned 1: Delta RPMs disabled because /usr/bin/applydeltarpm not installed.


Error downloading packages:
  zabbix-agent-3.4.15-1.el7.x86_64: [Errno 256] No more mirrors to try.

我尝试安装 deltarpm 包,现在我收到此错误:

...
Error downloading packages:
  zabbix-agent-3.4.15-1.el7.x86_64: [Errno 256] No more mirrors to try.
Error: /Stage[main]/Main/Node[puppet-agent]/Package[zabbix-agent]/ensure: change from purged to present failed: Execution of '/usr/bin/yum -d 0 -e 0 -y install zabbix-agent' returned 1: No Presto metadata available for zabbix


Error downloading packages:
  zabbix-agent-3.4.15-1.el7.x86_64: [Errno 256] No more mirrors to try.

然后我做了一个 yum clean all 并再次尝试,现在我得到了这个错误:

Error: Execution of '/usr/bin/yum -d 0 -e 0 -y install zabbix-agent' returned 1: One of the configured repositories failed (Zabbix repo to install Zabbix client on CentOS 7),
 and yum doesn't have enough cached data to continue. At this point the only
 safe thing yum can do is fail. There are a few ways to work "fix" this:

它建议我禁用回购,所以我不确定我犯了什么错误,但由于某种原因,根据我的配置方式,回购似乎不是有效的。有谁知道我如何获得 zabbix 回购在 Puppet 中工作以便我可以安装 zabbix 代理?

标签: linuxcentosrepositorypuppetzabbix

解决方案


您必须始终牢记,Puppet 的 DSL 专注于要管理的机器状态细节,而不是改变机器状态的细节。这将帮助您避免误解Yumrepo 资源类型的文档

具体来说,该baseurl类型的属性直接对应于每个存储库的同名 Yum 配置参数。该参数指定存储库的基本 URL (可能http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/在您的情况下)而不是要安装以获取存储库定义的包的名称。

如果您愿意,您可以完全不使用该包,而是通过Yumrepo资源严格配置存储库。但是,如果您想至少部分地通过包来管理它,那么您就会遇到鸡与蛋的问题:您从哪里获得包以便为包含该包的存储库创建存储库定义?有两种主要选择:

  • 通过手动安装包,在 Puppet 范围之外执行存储库的初始配置,作为供应过程的一部分。此后,您可以调整 repo 配置并通过 Puppet 更新存储库发布包。

  • 将存储库发布包的副本放入您自己的本地包存储库中(您确实有一个,不是吗?)。根据需要配置该 repo,允许 Puppet 从那里安装 repo-release 包。

无论哪种方式,如果您通过 Puppet 管理发布包和 repo 详细信息,那么该部分看起来像这样:

class importRepos {
  package { 'zabbix-release' ensure => 'latest' }

  yumrepo { "zabbix":
    # Most repo properties probably should not be managed
    enabled  => 1,
  }
}

完成此操作后,您可能还需要注意类和资源排序。这是一个太大的话题,无法在一个 SO 答案中涵盖,但对于您的特定情况,鉴于您直接在节点块中而不是通过类声明包,我的建议是在相关包的属性之间声明适当的依赖关系:

node 'puppet-agent' {
  include importRepos

  package { 'php':
    ensure => "installed",
  }

  package { 'zabbix-agent':
    ensure  => "installed",
    require => Yumrepo['zabbix'],  # <--- this
  }
}

推荐阅读