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

Mar*_*ang 11 administration scalability orchestration ansible

从版本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 }
Run Code Online (Sandbox Code Playgroud)

哪里roles/postgres_client/meta/main.yml可能包括类似的东西

---
dependencies:
  - { role: postgres_common }
  - { role: stunnel, 
      client: yes,
      local_port: 5432
      remote_host: db_host
      remote_port: 15432 
    }
Run Code Online (Sandbox Code Playgroud)

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

seb*_*ebn 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')
Run Code Online (Sandbox Code Playgroud)

  • @TravisBear `gv` 模块是 Graphviz 的一部分,它没有分布在 PyPI 上。您可以使用 Linux 发行版的包管理器(apt、yum...)来安装它。包名称可能类似于“graphviz-python”或“python-graphviz”。 (2认同)