use of org.jclouds.chef.util.RunListBuilder in project legacy-jclouds-examples by jclouds.
the class MainApp method main.
public static void main(String[] args) {
if (args.length < PARAMETERS) {
throw new IllegalArgumentException(INVALID_SYNTAX);
}
String provider = args[0];
String identity = args[1];
String credential = args[2];
String groupName = args[3];
Action action = Action.valueOf(args[4].toUpperCase());
if ((action == Action.CHEF || action == Action.SOLO) && args.length < PARAMETERS + 1) {
throw new IllegalArgumentException("please provide the list of recipes to install, separated by commas");
}
String recipes = action == Action.CHEF || action == Action.SOLO ? args[5] : "apache2";
String minRam = System.getProperty("minRam");
// note that you can check if a provider is present ahead of time
checkArgument(contains(allKeys, provider), "provider %s not in supported list: %s", provider, allKeys);
LoginCredentials login = action != Action.DESTROY ? getLoginForCommandExecution(action) : null;
ComputeService compute = initComputeService(provider, identity, credential);
try {
switch(action) {
case ADD:
System.out.printf(">> adding node to group %s%n", groupName);
// Default template chooses the smallest size on an operating
// system that tested to work with java, which tends to be Ubuntu
// or CentOS
TemplateBuilder templateBuilder = compute.templateBuilder();
// can just tweak minRam
if (minRam != null) {
templateBuilder.minRam(Integer.parseInt(minRam));
}
// note this will create a user with the same name as you on the
// node. ex. you can connect via ssh publicip
Statement bootInstructions = AdminAccess.standard();
// to run commands as root, we use the runScript option in the
// template.
templateBuilder.options(runScript(bootInstructions));
NodeMetadata node = getOnlyElement(compute.createNodesInGroup(groupName, 1, templateBuilder.build()));
System.out.printf("<< node %s: %s%n", node.getId(), concat(node.getPrivateAddresses(), node.getPublicAddresses()));
case SOLO:
System.out.printf(">> installing [%s] on group %s as %s%n", recipes, groupName, login.identity);
Iterable<String> recipeList = Splitter.on(',').split(recipes);
ImmutableList.Builder<Statement> bootstrapBuilder = ImmutableList.builder();
bootstrapBuilder.add(new InstallGit());
// Clone community cookbooks into the node
for (String recipe : recipeList) {
bootstrapBuilder.add(CloneGitRepo.builder().repository("git://github.com/opscode-cookbooks/" + recipe + ".git").directory(//
"/var/chef/cookbooks/" + recipe).build());
}
// Configure Chef Solo to bootstrap the selected recipes
bootstrapBuilder.add(InstallRuby.builder().build());
bootstrapBuilder.add(InstallRubyGems.builder().build());
bootstrapBuilder.add(//
ChefSolo.builder().cookbookPath(//
"/var/chef/cookbooks").runlist(//
RunList.builder().recipes(recipeList).build()).build());
// Build the statement that will perform all the operations above
StatementList bootstrap = new StatementList(bootstrapBuilder.build());
// Run the script in the nodes of the group
runScriptOnGroup(compute, login, groupName, bootstrap);
break;
case CHEF:
// Create the connection to the Chef server
ChefService chef = initChefService(System.getProperty("chef.client"), System.getProperty("chef.validator"));
// Build the runlist for the deployed nodes
System.out.println("Configuring node runlist in the Chef server...");
List<String> runlist = new RunListBuilder().addRecipes(recipes.split(",")).build();
chef.updateRunListForGroup(runlist, groupName);
Statement chefServerBootstrap = chef.createBootstrapScriptForGroup(groupName);
// Run the script in the nodes of the group
System.out.printf(">> installing [%s] on group %s as %s%n", recipes, groupName, login.identity);
runScriptOnGroup(compute, login, groupName, chefServerBootstrap);
break;
case DESTROY:
System.out.printf(">> destroying nodes in group %s%n", groupName);
// you can use predicates to select which nodes you wish to
// destroy.
Set<? extends NodeMetadata> destroyed = //
compute.destroyNodesMatching(Predicates.<NodeMetadata>and(not(TERMINATED), inGroup(groupName)));
System.out.printf("<< destroyed nodes %s%n", destroyed);
break;
}
} catch (RunNodesException e) {
System.err.println("error adding node to group " + groupName + ": " + e.getMessage());
error = 1;
} catch (RunScriptOnNodesException e) {
System.err.println("error installing " + recipes + " on group " + groupName + ": " + e.getMessage());
error = 1;
} catch (Exception e) {
System.err.println("error: " + e.getMessage());
error = 1;
} finally {
compute.getContext().close();
System.exit(error);
}
}
use of org.jclouds.chef.util.RunListBuilder in project gora by apache.
the class ChefSoftwareProvisioning method performChefComputeServiceBootstrapping.
private static void performChefComputeServiceBootstrapping(Properties properties) throws IOException, InstantiationException, IllegalAccessException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {
// Get the credentials that will be used to authenticate to the Chef server
String rsContinent = DataStoreFactory.findProperty(properties, MemStore.class.getDeclaredConstructor().newInstance(), RS_CONTINENT, "rackspace-cloudservers-us");
String rsUser = DataStoreFactory.findProperty(properties, MemStore.class.getDeclaredConstructor().newInstance(), RS_USERNAME, "asf-gora");
String rsApiKey = DataStoreFactory.findProperty(properties, MemStore.class.getDeclaredConstructor().newInstance(), RS_APIKEY, null);
String rsRegion = DataStoreFactory.findProperty(properties, MemStore.class.getDeclaredConstructor().newInstance(), RS_REGION, "DFW");
String client = DataStoreFactory.findProperty(properties, MemStore.class.getDeclaredConstructor().newInstance(), CHEF_CLIENT, System.getProperty("user.name"));
String organization = DataStoreFactory.findProperty(properties, MemStore.class.getDeclaredConstructor().newInstance(), CHEF_ORGANIZATION, null);
String pemFile = System.getProperty("user.home") + "/.chef/" + client + ".pem";
String credential = Files.toString(new File(pemFile), Charsets.UTF_8);
// Provide the validator information to let the nodes to auto-register themselves
// in the Chef server during bootstrap
String validator = organization + "-validator";
String validatorPemFile = System.getProperty("user.home") + "/.chef/" + validator + ".pem";
String validatorCredential = Files.toString(new File(validatorPemFile), Charsets.UTF_8);
Properties chefConfig = new Properties();
chefConfig.put(ChefProperties.CHEF_VALIDATOR_NAME, validator);
chefConfig.put(ChefProperties.CHEF_VALIDATOR_CREDENTIAL, validatorCredential);
// Create the connection to the Chef server
ChefApi chefApi = ContextBuilder.newBuilder(new ChefApiMetadata()).endpoint("https://api.opscode.com/organizations/" + organization).credentials(client, credential).overrides(chefConfig).buildApi(ChefApi.class);
// Create the connection to the compute provider. Note that ssh will be used to bootstrap chef
ComputeServiceContext computeContext = ContextBuilder.newBuilder(rsContinent).endpoint(rsRegion).credentials(rsUser, rsApiKey).modules(ImmutableSet.<Module>of(new SshjSshClientModule())).buildView(ComputeServiceContext.class);
// Group all nodes in both Chef and the compute provider by this group
String group = "jclouds-chef-goraci";
// Set the recipe to install and the configuration values to override
String recipe = "apache2";
JsonBall attributes = new JsonBall("{\"apache\": {\"listen_ports\": \"8080\"}}");
// Check to see if the recipe you want exists
List<String> runlist = null;
Iterable<? extends CookbookVersion> cookbookVersions = chefApi.chefService().listCookbookVersions();
if (any(cookbookVersions, CookbookVersionPredicates.containsRecipe(recipe))) {
runlist = new RunListBuilder().addRecipe(recipe).build();
}
for (Iterator<String> iterator = runlist.iterator(); iterator.hasNext(); ) {
String string = (String) iterator.next();
LOG.info(string);
}
// Update the chef service with the run list you wish to apply to all nodes in the group
// and also provide the json configuration used to customize the desired values
BootstrapConfig config = BootstrapConfig.builder().runList(runlist).attributes(attributes).build();
chefApi.chefService().updateBootstrapConfigForGroup(group, config);
// Build the script that will bootstrap the node
Statement bootstrap = chefApi.chefService().createBootstrapScriptForGroup(group);
TemplateBuilder templateBuilder = computeContext.getComputeService().templateBuilder();
templateBuilder.options(runScript(bootstrap));
// Run a node on the compute provider that bootstraps chef
try {
Set<? extends NodeMetadata> nodes = computeContext.getComputeService().createNodesInGroup(group, 1, templateBuilder.build());
for (NodeMetadata nodeMetadata : nodes) {
LOG.info("<< node %s: %s%n", nodeMetadata.getId(), concat(nodeMetadata.getPrivateAddresses(), nodeMetadata.getPublicAddresses()));
}
} catch (RunNodesException e) {
throw new RuntimeException(e.getMessage());
}
// Release resources
chefApi.close();
computeContext.close();
}
Aggregations