2014-02-12 4 views
11

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

Таких вложенных зависимостей могут запутаться поддерживать, когда количество ролей в оркестровке растет , Поэтому я задаюсь вопросом, нашел ли кто-нибудь простой способ генерировать график таких зависимостей, либо графически (точка или неато?), Либо просто как отступом текстового графика? Такой инструмент может помочь уменьшить сложность обслуживания.

ответ

2

Следующая питон скрипт работал для меня:

#!/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') 
+0

Этот ответ может быть улучшена путем объяснения _how_ он решает проблему, сформулированную в вопросе. –

+0

Запуск: «ImportError: нет модуля с именем gv». pip install gv: «Никаких распределений вообще не найдено для gv» –

+1

@TravisBear Модуль 'gv' является частью Graphviz, он не распространяется на PyPI. Его можно установить с помощью диспетчера пакетов вашего дистрибутива Linux (apt, yum ...). Имя пакета может быть чем-то вроде 'graphviz-python' или' python-graphviz'. – sebn

Смежные вопросы