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

11
自Ansible 1.3版本以来,支持角色依赖关系,以鼓励重用角色定义。为了审计和维护更大的编排,最好有一些方法可以轻松生成一个依赖图,显示哪些角色依赖于其他哪些角色。
依赖关系定义的示例可能是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个回答

4

The following python script worked for me:

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

这个答案可以通过解释它如何解决问题来改进。 - user439793
运行中出现错误:"ImportError: No module named gv"。尝试使用pip安装gv: "No distributions at all found for gv"。 - Travis Bear
2
@TravisBear gv 模块是 Graphviz 的一部分,它不在 PyPI 上分发。您可以使用 Linux 发行版的软件包管理器(apt、yum...)安装它。软件包名称可能类似于 graphviz-pythonpython-graphviz - sebn
1
我已经使用graphviz Python包制作了一个替代版本 - Le Hibou

1

0
# install gv on ubuntu
sudo apt-get install python3-gv

1
这个答案可以通过展示 python-gv 如何解决 OP 的问题来改进。 - zkoza
我认为这实际上应该添加到sebn的答案中。对于大多数不知道如何安装gv的人来说,这似乎是缺失的部分。 - Martin Thorsen Ranang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接