Есть ли простой способ создания графика зависимых зависимостей роли?

Начиная с версии 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 имеет.