【问题标题】:Is there an easy way to generate a graph of Ansible role dependencies?有没有一种简单的方法来生成 Ansible 角色依赖关系图?
【发布时间】:2014-03-10 10:11:52
【问题描述】:

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

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

【问题讨论】:

    标签: scalability administration ansible orchestration


    【解决方案1】:

    以下 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')
    

    【讨论】:

    • 这个答案可以通过解释如何解决问题中所述的问题来改进。
    • 运行:“ImportError:没有名为 gv 的模块”。 pip install gv: "没有找到 gv 的发行版"
    • @TravisBear gv 模块是 Graphviz 的一部分,它不在 PyPI 上分发。您可以使用 linux 发行版的包管理器(apt、yum...)来安装它。包名可能类似于graphviz-pythonpython-graphviz
    • 我使用graphviz python 包制作了一个alternative version
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:
      # install gv on ubuntu
      sudo apt-get install python3-gv
      

      【讨论】:

      • 这个答案可以通过展示python-gv如何回答OP的问题来改进。
      • 我认为这实际上应该添加到 sebn 的答案中。对于大多数不知道如何安装gv的人来说,这似乎是缺失的部分。
      猜你喜欢
      • 2012-06-16
      • 1970-01-01
      • 1970-01-01
      • 2015-12-19
      • 1970-01-01
      • 2013-06-21
      • 2010-11-20
      • 2012-01-21
      • 1970-01-01
      相关资源
      最近更新 更多