[%- level_1 = []; level_2 = []; level_3 = []; i = 0; WHILE i < 3; elem = 'FastCGI_' _ i; level_1.push(elem); i = i + 1; END; i = 0; WHILE i < 2; elem = 'proxy_' _ i; level_2.push(elem); i = i + 1; END; i = 0; WHILE i < 4; elem = 'Pg_' _ i; level_3.push(elem); i = i + 1; END; %] digraph cluster_arch { graph [K=0.8, center, label="OpenResty Cluster Architecture", dpi=110.0, fontname="consolas"]; edge [color=red, dir=both, minlen=2]; node [fillcolor=white, style=filled, fontname="consolas"]; subgraph cluster_1 { graph [bgcolor="#ffdddd", label=""]; node [label="FastCGI server"]; [% FOREACH elem = level_1 %] [% elem %]; [% END %] }; subgraph cluster_2 { graph [bgcolor="#ddddff", label=""]; node [label="PL/Proxy server"]; [% FOREACH elem = level_2 %] [% elem %]; [% END %] }; [% FOREACH from = level_1 %] [% FOREACH to = level_2 %] [% from %] -> [% to %]; [% END %] [% END %] subgraph cluster_3 { graph [bgcolor="#ddffdd", label=""]; node [label="Pg node"]; [% FOREACH elem = level_3 %] [% elem %]; [% END %] }; [% FOREACH from = level_2 %] [% FOREACH to = level_3 %] [% from %] -> [% to %]; [% END %] [% END %] }