fantoche cria um arquivo

1

Então eu tenho esse hash no manifesto de fantoche do app1

$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",
        }
}

e este hash no manifesto de fantoches do meu app2

$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",
        }
}

que são ambos passados para daemontools :: build (junto com um caminho)

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]}";
    }
}

que resulta em

Erro: Não foi possível recuperar o catálogo do servidor remoto: Erro 400 no SERVER: declaração duplicada: Daemontools :: Envfile [SERVICE_IP] já está declarado no arquivo daemontools / manifests / build.pp: 53; não pode redeclarar no daemontools / manifests / build.pp: 53

Como posso fazer com que eu não receba declarações duplicadas de recursos?

    
por Arenstar 13.02.2014 / 17:14

3 respostas

3

Na criação do seu objeto daemontools::envfile , você deve adicionar um identificador exclusivo ao $name do objeto.

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

Por padrão, $name é cada um de seus $env_names . Quando você cria o segundo objeto com o mesmo conjunto de chaves, isso causa muitas duplicatas. O FQDN ou algo igualmente único pode ser útil para pesquisa.

    
por 13.02.2014 / 17:44
3

Certo, você está usando $env_names (você também pode querer ver o uso consistente de sublinhados lá) como $name para daemontools::envfile para a iteração semi-hacky - suponho que você não queira usar o future parser (razoavelmente). Note que também o que você está tentando fazer com value => $envvars provavelmente não funcionará também.

Portanto, prefix de puppetlabs/stdlib é seu amigo para o problema duplicado, garantindo que você receba $name s exclusivo pré-construindo o caminho:

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

No entanto, isso provavelmente revelará que value => $envvars não funciona e parece levar apenas à conclusão de que você precisa do future parser por enquanto e each()

    
por 13.02.2014 / 17:50
1

Parece que isso funcionou :) Embora confuso com esse modelo inline ...

    $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]}";
    }
}
    
por 13.02.2014 / 18:36