JClouds-Chef не добавляет роль в список выполнения

Я использую превосходный API JClouds-Chef для загрузки и настройки виртуальных машин в нашем центре обработки данных.

У меня есть следующий код:

String appName = "myapp";
String myRole = "my_app";
String chefGroup = "fizzbuzz";
String endpoint = "https://mychefserver";
String client = "myuser";
String validator = "chef-validator";
String clientCredential = Files.toString(new File("/etc/chef/myuser.pem"), Charsets.UTF_8);
String validatorCredential = Files.toString(new File("/etc/chef/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);
// ChefEnvironmentProvider is a custom class that builds environments.
ChefEnvironmentProvider environmentProvider = new ChefEnvironmentProvider(appName);

Environment devEnv = environmentProvider.provideEnvironment("dev");
Environment testEnv = environmentProvider.provideEnvironment("test");
api.createEnvironment(devEnv);
api.createEnvironment(testEnv);

List<String> runlist = new RunListBuilder().addRole(myRole).build();
//      BootstrapConfig bootstrapConfig = BootstrapConfig.builder().environment(devEnv).runList(runlist).build();
BootstrapConfig bootstrapConfig = BootstrapConfig.builder().runList(runlist).build();

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

Statement bootstrap = chef.createBootstrapScriptForGroup(chefGroup);

SshClient.Factory sshFactory = ctx.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();

try {
    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");
} catch(Throwable t) {
    log.error(t.message);
} finally {
    ssh.disconnect();
}

Когда я запускаю этот код, я не получаю исключений, однако, если я зайду в http://mychefserver и посмотрю на узел, я увижу, что его Список выполнения и Рецепты пусты. Другими словами, несмотря на то, что я специально добавляю роль в список выполнения, похоже, что это не добавляет ничего на стороне сервера шеф-повара.

Что здесь может происходить?


person unfettered    schedule 14.08.2014    source источник


Ответы (1)


Существует ли эта роль на сервере Chef?

Как и окружающая среда, он должен существовать. Если нет, вам придется сначала создать его с помощью ChefApi таким же образом, как вы создаете среду.

Если роль уже существует, проверьте вывод скрипта, выполненного на виртуальной машине, и посмотрите, не содержит ли он ошибок.

person Ignasi Barrera    schedule 14.08.2014
comment
Спасибо @Ignasi Barrera - да, он существовал, но в моей среде была неверная ссылка на URL. Ваш совет вручную подключить SSH к машине и запустить шеф-повар дал мне необходимую информацию, чтобы увидеть, что не так с моей конфигурацией - спасибо! - person unfettered; 17.08.2014