Создание новых сред с помощью JClouds-Chef

Я пытаюсь использовать JClouds-Chef API для оба загрузить и настроить только что подготовленные виртуальные машины Linux в нашем vCenter. Наша команда DevOps (наши «повара») недавно представила концепцию среды во всех наших рецептах, и мне сказали, что теперь мне нужно обновить код JClouds-Chef для создания новых сред на лету. . В настоящее время у меня есть следующий код, который просто указывает существующую среду для использования:

// Here, "node.getEnvironment()" might return "ourapp_dev" or "ourapp_test", etc.
bootstrapConfig bootstrapConfig = BootstrapConfig.builder()
    .environment(node.getEnvironment()).runList(runlist).build();

Но теперь я должен сам создавать среду на лету, а не использовать существующую среду, которая уже доступна на нашем сервере Chef.

Мне сказали, что я могу использовать Environment, чтобы сделать это создание. И это определенно выглядит именно так, учитывая то, как настроен API. Однако я не могу найти никаких рабочих примеров, и, не являясь "шеф-поваром", мне трудно увидеть здесь лес за деревьями.

Вот среда, которую мне сказали, что мне нужно будет использовать в качестве шаблона:

name "{appname}_dev"
description "{appname} Dev Environment"
cookbook_versions({
    "our_app" => "= 0.2.0",
    "our_logs" => "= 0.1.0"
})
default_attributes(
    "our_app" => {
        "port" => "{port}",
        "app_name" => "{appname}",
        "config_vars" => {
            "useFizz" => "true",
            "host" => "devourapp",
            "context" => "devourapp/{appname}"
        },
        "jar_file_url" => "http://ourartifactory/ourrepo/com/us/{appname}/%5BRELEASE%5D/{appname}-%5BRELEASE%5D.jar"
    },
    our_logs" => {
        "some_resource" => "{appname}",
        "log_server" => "logstash.example.com"
    }              
)

По-видимому, все, что находится в фигурных скобках { }, является переменной, которую мне нужно каким-то образом передать. Так, например, {appname} может быть fizzbuz, и в этом случае первая строка выше должна быть разрешена как:

name "fizzbuzz_dev"

и т. д. Я могу заранее определить имена этих переменных в коде Java:

String appname = getAppName();
String port = getPort();
// etc.

Проблема в том, что я не могу понять, как использовать Environment API для воспроизведения приведенной выше конфигурации, особенно когда речь идет о внедрении appname и port в качестве переменных. Есть идеи?


person IAmYourFaja    schedule 07.08.2014    source источник


Ответы (1)


Версии поваренной книги можно установить с помощью объекта Environment builder. У него есть метод, который принимает Map<String, String>, который вы можете использовать для их настройки.

Атрибуты немного сложны. Поскольку структура атрибутов произвольна, практически невозможно представить их в объекте Java. Вы должны использовать метод attributes в объекте построителя среды и поместить имена атрибутов корневого уровня в качестве ключей и JsonBall с буквальной строкой json в качестве значения. Что-то вроде следующего для одного атрибута, но вы уже можете предоставить всю карту напрямую методу attributes (множественное число):

envBuilder.attribute("our_app", new JsonBall("{\"foo\":true}"));

Вам придется вручную создать строку json с соответствующими значениями.

person Ignasi Barrera    schedule 07.08.2014