Graphviz布局调整:将Openshift/letsencrypt移至Stage/Prod下方及节点组织问询
解答你的Graphviz布局与节点归类问题
1. 用rank属性调整Openshift与letsencrypt的位置
当然可以!Graphviz的rank属性就是专门用来控制节点/子图垂直(或水平)层级的工具。默认布局是从上到下(rankdir=TB),我们可以通过定义rank组,轻松把Stage、Prod集群放在同一上层,让Openshift集群和letsencrypt节点固定在它们的下方。
具体实现思路:
- 先创建一个rank组,把Stage和Prod的核心标识设为同一层级,确保它们横向对齐
- 再创建另一个rank组,把Openshift集群和letsencrypt节点归为一组,通过隐形边或者rank约束,强制这个组位于Stage/Prod的下方,避免自动布局打乱层级
2. 不用子图归类Stage下的节点
完全没问题!如果不想用嵌套子图来分组fe03-osl2-stage和fe04-osl3-stage的节点,我们可以用无形状的标签节点配合rank=same来实现逻辑归类:
- 创建一个仅显示文字的标签节点(设置
shape=none),用来替代子图的label - 把同属
fe03-osl2-stage的haproxy、varnish节点设为同一水平,fe04-osl3-stage的节点也同理 - 用隐形边把标签节点和所属的业务节点关联,维持逻辑分组的视觉对齐
修改后的完整Graphviz代码
digraph G { label = "Setup" labelloc = top; node [shape=record]; edge [dir=both]; subgraph cluster_0 { label = "Internet"; tcp80 [label="*:80/tcp"]; tcp443 [label="*:443/tcp"]; tcp8443 [label="*:8443/tcp"]; } // Stage分组:不用子图,用标签节点+rank控制 Stage_label [label="Stage", shape=none, fontsize=14, fontweight=bold]; {rank=same; "fe03-osl2-stage-haproxy" [label= "HaProxy"]; "fe03-osl2-stage-varnish" [label= "Varnish"]; } {rank=same; "fe04-osl3-stage-haproxy" [label= "HaProxy"]; "fe04-osl3-stage-varnish" [label= "Varnish"]; } // 隐形边维持标签与节点的层级对齐 Stage_label -> "fe03-osl2-stage-haproxy" [style=invis]; Stage_label -> "fe04-osl3-stage-haproxy" [style=invis]; // Prod分组:同样采用无图归类方式 Prod_label [label="Prod", shape=none, fontsize=14, fontweight=bold]; {rank=same; "fe03-osl2-prod-haproxy" [label= "HaProxy"]; "fe03-osl2-prod-varnish" [label= "Varnish"]; } {rank=same; "fe04-osl3-prod-haproxy" [label= "HaProxy"]; "fe04-osl3-prod-varnish" [label= "Varnish"]; } Prod_label -> "fe03-osl2-prod-haproxy" [style=invis]; Prod_label -> "fe04-osl3-prod-haproxy" [style=invis]; subgraph cluster_3 { label = "Openshift"; master0 [label= "master0"]; master1 [label= "master1"]; master3 [label= "master3"]; } letsencrypt [label= "letsencrypt"]; // 全局层级控制 {rank=same; Stage_label; Prod_label;} // Stage和Prod横向对齐 {rank=same; cluster_3; letsencrypt;} // Openshift与letsencrypt横向对齐 // 隐形边强制层级顺序,确保下方组在Stage/Prod之后 "fe03-osl2-stage-varnish" -> cluster_3 [style=invis]; "fe04-osl3-prod-varnish" -> letsencrypt [style=invis]; // 原有业务边关系保持不变 tcp80 -> "fe03-osl2-stage-haproxy"; tcp443 -> "fe03-osl2-stage-haproxy"; tcp80 -> "fe04-osl3-stage-haproxy"; tcp443 -> "fe04-osl3-stage-haproxy"; tcp8443 -> "fe03-osl2-stage-haproxy"; tcp8443 -> "fe04-osl3-stage-haproxy"; tcp80 -> "fe03-osl2-prod-haproxy"; tcp443 -> "fe03-osl2-prod-haproxy"; tcp80 -> "fe04-osl3-prod-haproxy"; tcp443 -> "fe04-osl3-prod-haproxy"; "fe03-osl2-stage-haproxy" -> "fe03-osl2-stage-varnish"; "fe04-osl3-stage-haproxy" -> "fe04-osl3-stage-varnish"; "fe03-osl2-prod-haproxy" -> "fe03-osl2-prod-varnish"; "fe04-osl3-prod-haproxy" -> "fe04-osl3-prod-varnish"; "fe03-osl2-stage-haproxy" -> letsencrypt; "fe04-osl3-stage-haproxy" -> letsencrypt; "fe03-osl2-prod-haproxy" -> letsencrypt; "fe04-osl3-prod-haproxy" -> letsencrypt; "fe03-osl2-stage-haproxy" -> master0; "fe03-osl2-stage-haproxy" -> master1; "fe03-osl2-stage-haproxy" -> master3; "fe04-osl3-stage-haproxy" -> master0; "fe04-osl3-stage-haproxy" -> master1; "fe04-osl3-stage-haproxy" -> master3; "fe03-osl2-prod-haproxy" -> master0; "fe03-osl2-prod-haproxy" -> master1; "fe03-osl2-prod-haproxy" -> master3; "fe04-osl3-prod-haproxy" -> master0; "fe04-osl3-prod-haproxy" -> master1; "fe04-osl3-prod-haproxy" -> master3; "fe03-osl2-stage-varnish" -> master0; "fe03-osl2-stage-varnish" -> master1; "fe03-osl2-stage-varnish" -> master3; "fe04-osl3-stage-varnish" -> master0; "fe04-osl3-stage-varnish" -> master1; "fe04-osl3-stage-varnish" -> master3; "fe03-osl2-prod-varnish" -> master0; "fe03-osl2-prod-varnish" -> master1; "fe03-osl2-prod-varnish" -> master3; "fe04-osl3-prod-varnish" -> master0; "fe04-osl3-prod-varnish" -> master1; "fe04-osl3-prod-varnish" -> master3; }
关键细节说明
- 层级控制:通过
rank=same分组确保Stage和Prod横向对齐,再用隐形边强制Openshift与letsencrypt处于下方层级,避免Graphviz自动布局的随机调整 - 无图归类:用
shape=none的标签节点替代子图容器,既保留了分组标签的视觉效果,又避免了嵌套子图的结构限制
内容的提问来源于stack exchange,提问作者user3297323
相关产品推荐
相关产品推荐

