gpt4 book ai didi

puppet - 如何使用 Puppet 参数化类来强制应用资源的顺序?

转载 作者:行者123 更新时间:2023-12-03 20:39:29 26 4
gpt4 key购买 nike

Puppetlabs 文档指出,为了让一个类需要另一个类,您应该使用关系链接语法并在外部节点中声明这两个类。

我有一个 repo 类,它创建每个模块中的许多包所依赖的 yum repo 定义。在每个模块中,我都有一个 Class['repo'] -> Class['modulename'] 语句,并且两个类都在节点中声明。但是,当 puppet 运行时,它并不总是像预期的那样在模块类之前执行 repo 类。为什么不?下面的示例( puppet 2.6.16):

编辑:看来这个问题有3个基本解决方案。

  • 使用资源依赖项替换类依赖项
    before/require 元参数(如图灵机的答案所示)。
  • 移除外部类依赖并显式声明依赖
    内部类之间。
  • 使用 Puppetlabs 在 stdlib 模块中提供的 anchor 类型
    包含一个允许依赖类创建引用的类
    使用链接语法到外部类。

  • 那么,考虑到 Puppet v3 以及将重构保持在最低限度的愿望,这些方法中的哪一种是最好的?

    list puppettest.pp :
    class { 'repo': }
    class { 'maradns': }

    class repo {
    class { 'repo::custom': }
    }

    class repo::custom {
    yumrepo {'custom':
    enabled => 1,
    gpgcheck => 0,
    descr => "Local respository - ${::architecture}",
    baseurl => 'http://repo.nike.local/CentOS/\$releasever/\$basearch';
    }
    }

    class maradns {
    Class['repo'] -> Class['maradns::install']
    Class['maradns::install'] -> Class['maradns::config']
    Class['maradns::config'] ~> Class['maradns::service']
    class { 'maradns::install': }
    class { 'maradns::config': }
    class { 'maradns::service': }
    }

    class maradns::install {
    package { 'maradns':
    ensure => present,
    }
    }

    class maradns::config {
    file { 'mararc':
    ensure => present,
    path => '/etc/mararc',
    mode => '0644',
    owner => root,
    group => root,
    }
    }

    class maradns::service {
    service { 'maradns':
    ensure => running,
    enable => true,
    hasrestart => true,
    }
    }

    输出:
    puppet apply puppettest.pp    
    err: /Stage[main]/Maradns::Install/Package[maradns]/ensure: change from absent to present failed: Execution of '/usr/bin/yum -d 0 -e 0 -y install maradns' returned 1: Error: Nothing to do

    notice: /Stage[main]/Maradns::Config/File[mararc]: Dependency Package[maradns] has failures: true
    warning: /Stage[main]/Maradns::Config/File[mararc]: Skipping because of failed dependencies
    notice: /Stage[main]/Maradns::Service/Service[maradns]: Dependency Package[maradns] has failures: true
    warning: /Stage[main]/Maradns::Service/Service[maradns]: Skipping because of failed dependencies
    notice: /Stage[main]/Repo::Custom/Yumrepo[custom]/descr: descr changed '' to 'Local respository - x86_64'
    notice: /Stage[main]/Repo::Custom/Yumrepo[custom]/baseurl: baseurl changed '' to 'http://repo.test.com/CentOS/\$releasever/\$basearch'
    notice: /Stage[main]/Repo::Custom/Yumrepo[custom]/enabled: enabled changed '' to '1'
    notice: /Stage[main]/Repo::Custom/Yumrepo[custom]/gpgcheck: gpgcheck changed '' to '0'
    notice: Finished catalog run in 2.15 seconds

    最佳答案

    调试依赖问题的一个很好的起点是指示 puppet 生成依赖图。

    puppet apply --graph --noop manifest.pp
    dot -Tpng /var/lib/puppet/state/graphs/relationships.dot -o relationships.png

    通过这样做你会看到类 repo:custom完全没有依赖信息。
    maradns::install确实依赖于 repo上课但不在 repo::custom类,因为 repo::custom不依赖 repo .

    新的类声明语法 class {'classname':}没有设置任何依赖,它的行为就像 include classname句法。

    所以要么你设置一个依赖 repo::customrepo或者您指示 maradns::install类直接依赖 repo:custom类(class)。

    但是你会遇到更多的麻烦。对类的依赖只会确保应用这个类。但是,不会对包含资源设置依赖项。

    我会像这样模拟你的情况:
    class { 'repo:custom': }
    class { 'maradns': }

    class repo {
    }

    class repo::custom {
    yumrepo {'custom':
    enabled => 1,
    gpgcheck => 0,
    descr => "Local respository - ${::architecture}",
    baseurl => 'http://repo.nike.local/CentOS/\$releasever/\$basearch';
    }
    }

    class maradns {
    class{[
    'maradns::package',
    'maradns::config',
    'maradns::service',
    ]:}
    }

    class maradns::package {
    package { 'maradns':
    ensure => present,
    require => Yumrepo['custom'],
    }
    }

    class maradns::config {
    file { 'marac:config':
    ensure => present,
    mode => '0644',
    owner => root,
    group => root,
    }
    }

    class maradns::service {
    service { 'maradns':
    ensure => running,
    enable => true,
    hasrestart => true,
    require => [
    Package['maradns'],
    File['mararc:config'],
    ],
    }
    }

    关于puppet - 如何使用 Puppet 参数化类来强制应用资源的顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11675102/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com