避免 Puppet 清单重复

避免 Puppet 清单重复

我有一组配置文件需要部署到每台服务器上的多个位置,每个位置都有不同的内容,但它们都共享相同的位置结构。我试图通过创建一个可以多次使用的通用类来减少清单中的重复量。

以下是文件结构的一个简化示例:

/home/bob/config/files.cfg
/home/bob/config/settings.cfg

/home/sue/config/files.cfg
/home/sue/config/settings.cfg

/home/ann/config/files.cfg
/home/ann/config/settings.cfg

这是我写的清单。

class config-generic {
    file { "/home/$name/config/files.cfg":
        owner =>    $name,
        group =>    $name,
        source =>   "puppet://puppet.domain.com/files/home/$name/config/files.cfg",
        mode =>     644,
    }
    file { "/home/$name/config/settings.cfg":
        owner =>    $name,
        group =>    $name,
        source =>   "puppet://puppet.domain.com/files/home/$name/config/settings.cfg",
        mode =>     644,
    }
}

第一次使用该类时,它运行良好。

node "client1", "client2" {
    class {'config-generic':
        name  => 'bob',
    }
}

但是,当我再次使用该类时,会出现错误,因为该类已经定义。

服务器上出现错误 400:重复定义:Class[config-generic] 已定义

node "client1", "client2" {

    class {'config-generic':
        name  => 'bob',
    }

    class {'config-generic':
        name  => 'sue',
    }
}

问题:我理解这个问题 - 但是有什么更好的方法可以减少清单中的重复?我试图避免定义“文件' 为每个文件中的每个用户创建条目。

答案1

您所需要的不是一个类,而是一个定义,因为您想创建它们的多个实例,例如:

define config-generic ($ensure=present) {
    file { "/home/$name/config/files.cfg":
        ensure  =>  $ensure,
        owner   =>  $name,
        group   =>  $name,
        source  =>  "puppet://puppet.domain.com/files/home/$name/config/files.cfg",
        mode    =>  '0644',
    }
    file { "/home/$name/config/settings.cfg":
        ensure  =>  $ensure,
        owner   =>  $name,
        group   =>  $name,
        source  =>  "puppet://puppet.domain.com/files/home/$name/config/settings.cfg",
        mode    =>  '0644',
    }
}

并使用以下命令调用它:

node "client1", "client2" {

    config-generic {
      'bob':;    
      'sue':;
    }
}

如果差异很小,您可能还想使用模板,而不是复制源文件。

相关内容