如何使用 JClouds-Chef 指定客户端版本?

Posted

技术标签:

【中文标题】如何使用 JClouds-Chef 指定客户端版本?【英文标题】:How to specify client version with JClouds-Chef? 【发布时间】:2015-02-11 13:43:38 【问题描述】:

几个月来我一直在使用以下 JClouds-Chef 1.7.3 代码从头开始引导新的虚拟机:

public class Bootstrapper 
    public static void main(String[] args) 
        Bootstrapper b = new Bootstrapper();
        b.bootstrap();
    

    public void bootstrap() 
        String endpoint = "https://mychef.example.com"
        String client = "myuser"
        String validator = "chef-validator"

        String clientCredential = Files.toString(new File("/etc/myuser/myuser.pem"), Charsets.UTF_8)
        String validatorCredential = Files.toString(new File("/etc/myuser/chef-validator.pem"), Charsets.UTF_8)

        Properties props = new Properties()
        props.put(ChefProperties.CHEF_VALIDATOR_NAME, validator);
        props.put(ChefProperties.CHEF_VALIDATOR_CREDENTIAL, validatorCredential)
        props.put(Constants.PROPERTY_RELAX_HOSTNAME, "true")
        props.put(Constants.PROPERTY_TRUST_ALL_CERTS, "true")

        ChefContext ctx = ContextBuilder.newBuilder("chef")
            .endpoint(endpoint)
            .credentials(client, clientCredential)
            .overrides(props)
            .modules(ImmutableSet.of(new SshjSshClientModule())) //
            .buildView(ChefContext.class);

        ChefApi api = ctx.unwrapApi(ChefApi.class)
        MyEnvProvider environmentProvider = new MyEnvProvider()

        Environment devEnv = environmentProvider.provideEnvironment()
        api.createEnvironment(devEnv)

        List<String> runlist = new RunListBuilder().addRole("myrole").build()
        BootstrapConfig bootstrapConfig = BootstrapConfig.builder().environment("myenv").runList(runlist).build()

        String vmIp = "myapp01.example.com"
        String vmSshUsername = "myuser"
        String vmSshPassword = "12345"
        ChefService chef = chefContext.getChefService()
        chef.updateBootstrapConfigForGroup(chefGroup, bootstrapConfig)

        Statement bootstrap = chef.createBootstrapScriptForGroup(chefGroup)

        SshClient.Factory sshFactory = chefContext.unwrap().utils()
            .injector().getInstance(Key.get(new TypeLiteral<SshClient.Factory>() ))

        SshClient ssh = sshFactory.create(HostAndPort.fromParts(vmIp, 22),
        LoginCredentials.builder().user(vmSshUsername).password(vmSshPassword).build())

        ssh.connect()

        StringBuilder rawScript = new StringBuilder()

        Map<String, String> resolvedFunctions = ScriptBuilder.resolveFunctionDependenciesForStatements(
            new HashMap<String, String>(), ImmutableSet.of(bootstrap), OsFamily.UNIX)

        ScriptBuilder.writeFunctions(resolvedFunctions, OsFamily.UNIX, rawScript)
        rawScript.append(bootstrap.render(OsFamily.UNIX))

        ssh.put("/tmp/chef-bootstrap.sh", rawScript.toString())
        ExecResponse result = ssh.exec("sudo bash /tmp/chef-bootstrap.sh")

        ssh.disconnect()
        api.close()
        ctx.close()
    

我几周来第一次运行这段代码,但一切都坏了。似乎这段代码现在会导致使用 Chef 12 的节点,而 mychef.example.com 是 Chef 11 服务器,这是问题的根源。

所以我问:如何配置此代码以继续安装/引导 Chef 11.x 节点?

请注意:这是一个代码问题,不是系统管理员问题,因此属于 ***。

【问题讨论】:

【参考方案1】:

jclouds docs list how to configure the process。

在这种情况下,您需要类似ChefProperties.CHEF_VERSION = '11.16.4' 的内容。我觉得我应该指出 chef-client 12 与 Chef Server 11 一起工作得很好。如果您正在运行 Enterprise Chef 11,您只需要更新其上的配置变量以允许客户端 12,因为它被错误地限制为仅 11 .x.

【讨论】:

请注意,从 jclouds 1.7 开始,默认情况下使用 Omnibus 安装程序安装 Chef,并且无论 ChefProperties.CHEF_VERSION 属性值如何,都会安装最新版本的 Chef 客户端。 (顺便说一句,有没有办法通过 Omnibus 脚本安装 Chef 客户端的具体版本?)。如果要控制安装的确切 Chef 版本,则需要将 ChefProperties.USE_OMNIBUS 设置为 false 并相应配置 @coderanger 提到的属性。 是的,在运行脚本时传递一个-v option。另请记住,您可以将其设置为 11 之类的内容,以获取最新的 11.x 版本。 感谢@coderanger!我刚刚创建了一个补丁,以在使用 Omnibus 安装程序时添加对自定义版本的支持(通过设置相同的 CHEF_VERSION 属性)。简而言之,您可以期待它可用:github.com/jclouds/jclouds/pull/638 如果我同时配置了chefConfig.put(ChefProperties.CHEF_USE_OMNIBUS, false); chefConfig.put(ChefProperties.CHEF_VERSION,"11.16.4");,它不会从主厨网址下载主厨客户端 rpm ...有什么想法吗?

以上是关于如何使用 JClouds-Chef 指定客户端版本?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Homebrew 安装指定版本的工具

git如何更新到指定版本,然后再更新到最新版本

git如何更新到指定版本,然后再更新到最新版本

svn是啥工具,如何使用

ORA-12154: TNS: 无法解析指定的连接标识符

如何在virtualenv环境中安装指定的python版本