Есть ли простой способ создания графика зависимых зависимостей роли?
Начиная с версии 1.3, Ansible поддерживает зависимые роли, чтобы поощрять повторное использование определений ролей. Чтобы провести аудит и поддерживать более крупные оркестровки, было бы неплохо иметь некоторый способ легко создать граф зависимостей, функции которого зависят от других ролей.
Пример определения зависимостей может быть roles/app_node/meta/main.yml
:
---
dependencies:
- { role: common, some_parameter: 3 }
- { role: apache, port: 80 }
- { role: postgres_client,
dbname: blarg,
other_parameter: 12 }
где roles/postgres_client/meta/main.yml
может включать что-то вроде
---
dependencies:
- { role: postgres_common }
- { role: stunnel,
client: yes,
local_port: 5432
remote_host: db_host
remote_port: 15432
}
Такие вложенные зависимости могут стать беспорядочными, чтобы поддерживать, когда число ролей в оркестровке растет. Поэтому я задаюсь вопросом, нашел ли кто-нибудь простой способ генерировать график таких зависимостей, либо графически (точка или неато?), Либо просто как отступом текстового графика? Такой инструмент может помочь уменьшить сложность обслуживания.
Ответы
Ответ 1
Для меня работал следующий python script:
#!/usr/bin/env python
import sys
import gv
from glob import glob
import yaml
g = gv.digraph('roles')
role_nodes = {}
def add_role(role):
if role not in role_nodes:
role_nodes[role] = gv.node(g, role)
def link_roles(dependent, depended):
gv.edge(
role_nodes[dependent_role],
role_nodes[depended_role]
)
for path in glob('roles/*/meta/main.yml'):
dependent_role = path.split('/')[1]
add_role(dependent_role)
with open(path, 'r') as f:
for dependency in yaml.load(f.read())['dependencies']:
depended_role = dependency['role']
add_role(depended_role)
link_roles(dependent_role, depended_role)
gv.layout(g, 'dot')
gv.render(g, 'png', 'doc/ansible-roles.png')
Ответ 2
Вы можете использовать Graphviz, чтобы сделать это, как проект ginas имеет.