puppet hash 创建文件

puppet hash 创建文件

所以我在 app1 的 puppet 清单中有这个哈希

$applicaton = 'app1'

daemontools::build {
    $application:
        path     => "/opt/supervise/${application}"
        envvars  => {
            'ENVIRONMENT'              => $location,
            'SERVICE_USER'             => $application_user,
            'SERVICE_PORT'             => $gunicorn_port,
            'SERVICE_IP'               => $gunicorn_ip,
            'ADDITIONAL_PARAMS'        => "--workers $processorcount",
            'DJANGO_SETTINGS_MODULE'   => "${application}.settings",
        }
}

并且这个哈希在我的 app2 的 puppet 清单中

$applicaton = 'app2'

daemontools::build {
    $application:
        path     => "/opt/supervise/${application}"
        envvars  => {
            'ENVIRONMENT'              => $location,
            'SERVICE_USER'             => $application_user,
            'SERVICE_PORT'             => $gunicorn_port,
            'SERVICE_IP'               => $gunicorn_ip,
            'ADDITIONAL_PARAMS'        => "--workers $processorcount",
            'DJANGO_SETTINGS_MODULE'   => "${application}.settings",
        }
}

它们都传递给 daemontools::build (连同路径)

define daemontools::build (
$envvars = {},
$path
){
    $env_names = keys($envvars)
    daemontools::envfile { $env_names:
        path   => $path,
        value  => $envvars
    }
}
define daemontools::envfile($path, $value) {
    file { "/${path}/envdir/${name}" :
        mode    => 0644,
        content => "${value[$name]}";
    }
}

结果是

错误:无法从远程服务器检索目录:服务器上的错误 400:重复声明:Daemontools::Envfile[SERVICE_IP] 已在文件 daemontools/manifests/build.pp:53 中声明;无法在 daemontools/manifests/build.pp:53 中重新声明

我怎样才能做到不获得重复的资源声明?

答案1

在创建对象时,您应该为对象daemontools::envfile添加唯一标识符。$name

daemontools::envfile { $something_unique$env_names:
    path   => $path,
    value  => $envvars
}

默认情况下,$name是您的每个$env_names。当您使用同一组键创建第二个对象时,会导致许多重复。FQDN 或同样独特的内容可能对查找有用。

答案2

是的,您正在使用$env_names(您可能还想看看那里下划线的一致使用)作为半黑客迭代的$namefor daemontools::envfile- 我假设您不想使用解析器future(相当合理)。请注意,您尝试做的事情value => $envvars可能也不会奏效。

因此,prefixfrompuppetlabs/stdlib是您解决重复问题的朋友,$name通过预先构建路径确保您获得唯一的 s:

define daemontools::build (
    $envvars = {},
    $path
) {
    $envnames = keys($envvars)
    $envfiles = prefix($envnames, "${path}/envdir/")
    daemontools::envfile {
        $envfiles:
            # Stuff
    }
}

然而,这可能只会表明这是value => $envvars行不通的,而且似乎只能得出这样的结论:需要future现在的解析器,以及each()

答案3

看起来这有效:)虽然内联模板很混乱......

    $env_names = keys($envvars)
    $prefixedenvnames = prefix($env_names, "${path}/envdir/")
    daemontools::envfile { $prefixedenvnames:
        value  => $envvars
    }
}

define daemontools::envfile($value) {
    $tmp = inline_template('<%= name.split("/").last %>')
    file { $name :
        mode    => 0644,
        content => "${value[$tmp]}";
    }
}

相关内容