Skip to content

Instantly share code, notes, and snippets.

@abihf
Last active July 28, 2022 00:05
Show Gist options
  • Save abihf/938e38f61e236160aa4be8ad4810299e to your computer and use it in GitHub Desktop.
Save abihf/938e38f61e236160aa4be8ad4810299e to your computer and use it in GitHub Desktop.
Print ansible roles dependencies
#!/usr/bin/env python2
import yaml
from sets import Set
from os import path
import sys
roles_dirs = ['roles', '.']
loaded_roles = Set()
def get_tree(role_name):
if role_name in loaded_roles:
return role_name
try:
dependencies = get_dependencies(role_name)
if len(dependencies) > 0:
return {role_name: dependencies}
else:
return role_name
except RoleNotFoundException:
return "%s (NOT FOUND)" % role_name
def get_dependencies(role_name):
role_dir = find_role_dir(role_name)
if role_dir is None:
raise RoleNotFoundException()
loaded_roles.add(role_name)
meta_file = path.join(role_dir, 'meta/main.yml')
if path.isfile(meta_file):
meta = {}
with file(meta_file, 'r') as f:
meta = yaml.load(f)
if 'dependencies' in meta:
return [get_tree(normalize_dependency(role)) for role in meta['dependencies'] ]
return []
def normalize_dependency(role):
if isinstance(role, basestring):
return role
elif 'name' in role:
return role['name']
elif 'role' in role:
return role['role']
else:
return role
def find_role_dir(role_name):
for parent in roles_dirs:
role_dir = path.join(parent, role_name)
if path.isdir(role_dir):
return role_dir
return None
class RoleNotFoundException(Exception):
pass
if len(sys.argv) > 1:
print(yaml.dump(get_tree(sys.argv[1]), default_flow_style=False))
else:
print('Usage: %s role_name' % sys.argv[0])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment