有没有一种简单的方法来生成Ansible角色依赖关系图?

时间:2014-02-12 08:01:47

标签: scalability administration ansible orchestration

从版本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 
    }

当业务流程中的角色数量增加时,这种嵌套的依赖关系可能会变得混乱。因此,我想知道是否有人找到了一种简单的方法来生成这种依赖关系的图形,无论是图形(点或neato?)还是仅作为缩进文本图形?这样的工具可以帮助降低维护的复杂性。

3 个答案:

答案 0 :(得分:3)

以下python脚本对我有用:

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

答案 1 :(得分:2)

您可以使用Graphviz执行此操作,例如ginas project

答案 2 :(得分:1)

90%