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 
    }

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

4

3 回答 3

4

以下 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')
于 2015-12-03T22:44:22.790 回答
1

您可以像ginas 项目一样使用Graphviz来执行此操作。

于 2014-05-16T14:45:31.440 回答
0
# install gv on ubuntu
sudo apt-get install python3-gv
于 2021-02-04T14:45:09.073 回答