使用配置片段构建配置文件

你怎能一口吃头大象呢?有时你会遇到这种情况,想要从被不同类管理的各种片段构建单一的配置文件。 例如,你可能有两到三个服务需要 rsync 模块配置,因此你不能只发布单一的配置文件 rsyncd.conf。 尽管你可以使用 Augeas,但是一种更简单的方法就是使用 exec 资源将若干配置片段串接成一个文件。

操作步骤

  1. 使用如下代码创建 /etc/puppet/modules/admin/manifests/rsyncdconf.pp 文件:

    class admin::rsyncdconf {
        file { "/etc/rsyncd.d":
            ensure => directory,
        }
    
        exec { "update-rsyncd.conf":
            command => "/bin/cat /etc/rsyncd.d/*.conf > /etc/rsyncd.conf",
            refreshonly => true,
        }
    }
    
  2. 添加如下代码到你的配置清单:

    class myapp::rsync {
        include admin::rsyncdconf
    
        file { "/etc/rsyncd.d/myapp.conf":
            ensure  => present,
            source  => "puppet:///modules/myapp/myapp.rsync",
            require => File["/etc/rsyncd.d"],
            notify  => Exec["update-rsyncd.conf"],
        }
    }
    include myapp::rsync
    
  3. 使用如下内容创建 /etc/puppet/modules/myapp/files/myapp.rsync 文件:

    [myapp]
        uid = myappuser
        gid = myappuser
        path = /opt/myapp/shared/data
        comment = Data for myapp
        list = no
        read only = no
        auth users = myappuser
    
  4. 运行 Puppet:

    # puppet agent --test
    info: Retrieving plugin
    info: Caching catalog for cookbook.bitfieldconsulting.com
    info: Applying configuration version '1303731804'
    notice: /Stage[main]/Admin::Rsyncdconf/File[/etc/rsyncd.d]/ensure:
    created
    notice: /Stage[main]/Myapp::Rsync/File[/etc/rsyncd.d/myapp.conf]/
    ensure: defined content as '{md5}e1e57cf38bb88a7b4f2fd6eb1ea2823a'
    info: /Stage[main]/Myapp::Rsync/File[/etc/rsyncd.d/myapp.conf]:
    Scheduling refresh of Exec[update-rsyncd.conf]
    notice: /Stage[main]/Admin::Rsyncdconf/Exec[update-rsyncd.conf]:
    Triggered 'refresh' from 1 events
    notice: Finished catalog run in 1.01 seconds
    

工作原理

admin::rsyncdconf 类为存放 rsync 的配置片段创建了如下目录:

file { "/etc/rsyncd.d":
    ensure => directory,
}

当你创建一个配置片段(例如本例中的 myapp::rsync),你要做的所有工作就是 require 这个目录(require => File["/etc/rsyncd.d"])并 notify 资源 exec 更新主配置文件 (notify => Exec["update-rsyncd.conf"],)。

只要 /etc/rsyncd.d 目录中有一个配置片段被更新,exec 资源就会执行一次:

exec { "update-rsyncd.conf":
    command     => "/bin/cat /etc/rsyncd.d/*.conf > /etc/rsyncd.conf",
    refreshonly => true,
}

这样,/etc/rsyncd.d 目录中的所有配置片段将会串接成一个 rsyncd.conf 文件。

这是非常有用的,原因在于你可以有许多不同的片段资源散布在各个不同的类或模块中, 所有这些片段最终都将被合并成单一的 rsyncd.conf 文件,而你却可以在一个地方实现配置代码的合并。

更多用法

当你有一个像 rsync 这样的服务且在一个配置文件中需要包含不同的片段时,这会是一种很有用的模式。 实际上,这为你提供了类似于 Apache 的 conf.d 目录或 PHP 的 php-ini.d 目录的功能。

参见本书