Назад | Перейти на главную страницу

марионеточный хэш создать файл

У меня есть этот хэш в манифесте марионетки 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",
        }
}

и этот хеш в моем марионеточном манифесте 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",
        }
}

которые оба передаются в 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 / manifest / build.pp: 53; невозможно повторно объявить в daemontools / manifest / build.pp: 53

Как сделать так, чтобы объявления ресурсов не повторялись?

Правильно, вы используете $env_names (вы также можете посмотреть на последовательное использование подчеркивания там) в качестве $name для daemontools::envfile для полу-хакерской итерации - я полагаю, вы не хотите использовать future парсер (вполне разумно). Обратите внимание, что также то, что вы пытаетесь сделать с value => $envvars наверное, тоже не сработает.

Так, prefix из puppetlabs/stdlib ваш друг по проблеме дублирования, гарантирующий, что вы получите уникальный $names, предварительно построив путь:

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

Однако это, вероятно, просто покажет, что value => $envvars не работает и, кажется, приводит только к выводу, что вы необходимость то future парсер на данный момент и each()

В создании вашего daemontools::envfile объект, вы должны добавить уникальный идентификатор в $name объекта.

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

По умолчанию, $name каждый из ваших $env_names. Когда вы создаете второй объект с тем же набором ключей, он вызывает множество дубликатов. Полное доменное имя или что-то столь же уникальное может быть полезно для поиска.

Кажется, это сработало :) Хотя этот встроенный шаблон запутался ...

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