使用JClouds-Chef创建新环境

时间:2014-08-07 18:39:55

标签: chef environment jclouds

我正在尝试使用JClouds-Chef API 两个引导程序,并在我们的vCenter中配置新配置的Linux VM。我们的DevOps团队(我们的“厨师”)最近在我们的所有食谱中引入了 Environments 的概念,我被告知我现在需要更新我的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重现上述配置,尤其是在将appnameport作为变量注入时。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

可以使用“环境”构建器对象设置cookbook版本。它有一个接受可用于配置它们的Map<String, String>的方法。

属性有点棘手。由于属性结构是任意的,因此没有实际的方法在Java对象中表示它们。您必须在“环境”构建器对象中使用attributes方法,并将根级别属性名称作为键,并使用文字json字符串作为值JsonBall。对于单个属性,类似于以下内容,但您已经可以将整个地图直接提供给attributes(复数)方​​法:

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

您必须手动构建包含适当值的json String。