def list_nodes_with_recipe(recipe): """Show all nodes which have asigned a given recipe""" for node in lib.get_nodes(): if recipe in lib.get_recipes_in_node(node): lib.print_node(node) else: for role in lib.get_roles_in_node(node): with open('roles/' + role + '.json', 'r') as f: roles = json.loads(f.read()) # Reuse _get_recipes_in_node to extract recipes in a role if recipe in lib.get_recipes_in_node(roles): lib.print_node(node) break
def _build_node(node): """Builds a list with all needed cookbooks and their dependencies""" cookbooks = [] # Fetch cookbooks needed for recipes for recipe in lib.get_recipes_in_node(node): recipe = recipe.split('::')[0] if recipe not in cookbooks: cookbooks.append(recipe) # Fetch cookbooks needed for role recipes for role in lib.get_roles_in_node(node): try: with open('roles/' + role + '.json', 'r') as f: try: roles = json.loads(f.read()) except json.decoder.JSONDecodeError as e: msg = 'Little Chef found the following error in your' msg += ' "{0}" role file:\n {1}'.format( role, str(e)) abort(msg) # Reuse _get_recipes_in_node to extract recipes in a role for recipe in lib.get_recipes_in_node(roles): recipe = recipe.split('::')[0] if recipe not in cookbooks: cookbooks.append(recipe) except IOError: abort("Role '{0}' not found".format(role)) # Fetch dependencies warnings = [] for cookbook in cookbooks: for recipe in lib.get_recipes_in_cookbook(cookbook): for dep in recipe['dependencies']: if dep not in cookbooks: try: lib.get_cookbook_path(dep) cookbooks.append(dep) except IOError: if dep not in warnings: warnings.append(dep) print "Warning: Possible error because of missing", print "dependency for cookbook {0}".format( recipe['name']) print " Cookbook '{0}' not found".format( dep) time.sleep(1) return cookbooks
def _build_node_data_bag(): """Builds one 'node' data bag item per file found in the 'nodes' directory Automatic attributes for a node item: 'id': It adds data bag 'id', same as filename but with underscores 'name': same as the filename 'fqdn': same as the filename (LittleChef filenames should be fqdns) 'hostname': Uses the first part of the filename as the hostname (until it finds a period) minus the .json extension 'domain': filename minus the first part of the filename (hostname) minus the .json extension In addition, it will contain the merged attributes from: All default cookbook attributes corresponding to the node All attributes found in nodes/<item>.json file Default and override attributes from all roles Returns the node object of the node which is about to be configured, or None if this node object cannot be found. """ current_node = None nodes = lib.get_nodes() node_data_bag_path = os.path.join('data_bags', 'node') # In case there are leftovers _remove_local_node_data_bag() os.makedirs(node_data_bag_path) all_recipes = lib.get_recipes() all_roles = lib.get_roles() for node in nodes: # Dots are not allowed (only alphanumeric), substitute by underscores node['id'] = node['name'].replace('.', '_') # Build extended role list node['role'] = lib.get_roles_in_node(node) node['roles'] = node['role'][:] for role in node['role']: node['roles'].extend(lib.get_roles_in_role(role)) node['roles'] = list(set(node['roles'])) # Build extended recipe list node['recipes'] = lib.get_recipes_in_node(node) # Add recipes found inside each roles in the extended role list for role in node['roles']: node['recipes'].extend(lib.get_recipes_in_role(role)) node['recipes'] = list(set(node['recipes'])) # Add node attributes _add_merged_attributes(node, all_recipes, all_roles) _add_automatic_attributes(node) # Save node data bag item with open( os.path.join('data_bags', 'node', node['id'] + '.json'), 'w') as f: f.write(json.dumps(node)) if node['name'] == env.host_string: current_node = node return current_node
def _build_node_data_bag(): """Builds one 'node' data bag item per file found in the 'nodes' directory Automatic attributes for a node item: 'id': It adds data bag 'id', same as filename but with underscores 'name': same as the filename 'fqdn': same as the filename (LittleChef filenames should be fqdns) 'hostname': Uses the first part of the filename as the hostname (until it finds a period) minus the .json extension 'domain': filename minus the first part of the filename (hostname) minus the .json extension In addition, it will contain the merged attributes from: All default cookbook attributes corresponding to the node All attributes found in nodes/<item>.json file Default and override attributes from all roles Returns the node object of the node which is about to be configured, or None if this node object cannot be found. """ current_node = None nodes = lib.get_nodes() node_data_bag_path = os.path.join('data_bags', 'node') # In case there are leftovers _remove_local_node_data_bag() os.makedirs(node_data_bag_path) all_recipes = lib.get_recipes() all_roles = lib.get_roles() for node in nodes: # Dots are not allowed (only alphanumeric), substitute by underscores node['id'] = node['name'].replace('.', '_') # Build extended role list node['role'] = lib.get_roles_in_node(node) node['roles'] = node['role'][:] for role in node['role']: node['roles'].extend(lib.get_roles_in_role(role)) node['roles'] = list(set(node['roles'])) # Build extended recipe list node['recipes'] = lib.get_recipes_in_node(node) # Add recipes found inside each roles in the extended role list for role in node['roles']: node['recipes'].extend(lib.get_recipes_in_role(role)) node['recipes'] = list(set(node['recipes'])) # Add node attributes _add_merged_attributes(node, all_recipes, all_roles) _add_automatic_attributes(node) # Save node data bag item with open(os.path.join( 'data_bags', 'node', node['id'] + '.json'), 'w') as f: f.write(json.dumps(node)) if node['name'] == env.host_string: current_node = node return current_node
def _build_node_data_bag(): """Builds one 'node' data bag item per file found in the 'nodes' directory Attributes for a node item: 'id': It adds data bag 'id' using the first part of the filename (until it finds a period) minus the .json extension 'name': same as the filename 'fqdn': same as the filename (as LittleChef filenames should be fqdns) 'hostname': same as the filename all attributes found in nodes/<item>.json file Returns the node object of the node which is about to be configured, or None if this node object cannot be found. """ current_node = None nodes = lib.get_nodes() node_data_bag_path = os.path.join('data_bags', 'node') _remove_node_data_bag() os.makedirs(node_data_bag_path) all_recipes = lib.get_recipes() all_roles = lib.get_roles() for node in nodes: node['id'] = node['name'].split('.')[0] # Build extended role list node['role'] = lib.get_roles_in_node(node) node['roles'] = node['role'][:] for role in node['role']: node['roles'].extend(lib.get_roles_in_role(role)) node['roles'] = list(set(node['roles'])) # Build extended recipe list node['recipes'] = lib.get_recipes_in_node(node) # Add recipes found inside each roles in the extended role list for role in node['roles']: node['recipes'].extend(lib.get_recipes_in_role(role)) node['recipes'] = list(set(node['recipes'])) # Add node attributes _add_merged_attributes(node, all_recipes, all_roles) _add_automatic_attributes(node) # Save node data bag item with open(os.path.join( 'data_bags', 'node', node['id'] + '.json'), 'w') as f: f.write(json.dumps(node)) if node['name'] == env.host_string: current_node = node return current_node
def build_node_data_bag(): """Builds one 'node' data bag item per file found in the 'nodes' directory Automatic attributes for a node item: 'id': It adds data bag 'id', same as filename but with underscores 'name': same as the filename 'fqdn': same as the filename (LittleChef filenames should be fqdns) 'hostname': Uses the first part of the filename as the hostname (until it finds a period) minus the .json extension 'domain': filename minus the first part of the filename (hostname) minus the .json extension In addition, it will contain the merged attributes from: All default cookbook attributes corresponding to the node All attributes found in nodes/<item>.json file Default and override attributes from all roles """ nodes = lib.get_nodes() node_data_bag_path = os.path.join("data_bags", "node") # In case there are leftovers remove_local_node_data_bag() os.makedirs(node_data_bag_path) all_recipes = lib.get_recipes() all_roles = lib.get_roles() for node in nodes: # Dots are not allowed (only alphanumeric), substitute by underscores node["id"] = node["name"].replace(".", "_") # Build extended role list node["role"] = lib.get_roles_in_node(node) node["roles"] = node["role"][:] for role in node["role"]: node["roles"].extend(lib.get_roles_in_role(role)) node["roles"] = list(set(node["roles"])) # Build extended recipe list node["recipes"] = lib.get_recipes_in_node(node) # Add recipes found inside each roles in the extended role list for role in node["roles"]: node["recipes"].extend(lib.get_recipes_in_role(role)) node["recipes"] = list(set(node["recipes"])) # Add node attributes _add_merged_attributes(node, all_recipes, all_roles) _add_automatic_attributes(node) # Save node data bag item with open(os.path.join("data_bags", "node", node["id"] + ".json"), "w") as f: f.write(json.dumps(node))