[Anaconda×Diagrams] 使用 Python 绘制配置图

目录
介绍
好久不见。
我是系统解决方案部的御琴,眼看二年级就要结束了,我感到有些焦虑。
我认为如果我能自由地使用 IaC(基础设施即代码),例如 Ansible 和 Terraform,那将会非常强大,但Python 所以最近没怎么有机会去尝试。
学生时代,我对 Unity(C#)只有一点点经验,但一时兴起,Anaconda,结果惨败,从此以后我就对 Python 恨之入骨。
像个基础设施工程师一样Anaconda——我的宿敌——生成一个配置图。
关于执行环境
Ubuntu 22.04(流浪者)
conda 25.11.1
Python 3.10
Vagrant.configure("2") do |config| config.vm.box = "bento/ubuntu-22.04" config.vm.network "private_network", ip: "192.168.55.15" config.vm.network "forwarded_port", guest: 8888, host: 8888 # config.vm.provider "virtualbox" for Jupyter do |vb| vb.memory = "4096" end end
(⌒3⌒)<为什么不在 Vagrant 启动后直接设置 Anaconda 环境呢?
因为这篇文章的目的是为了克服我对 Anaconda 的恐惧,所以我才费劲地手动安装了它。
我越用越觉得 venv 好用。我用 Anaconda 只是因为不想继续讨厌它,所以请大家使用 venv。
构建虚拟环境
设置 Anaconda
下载最新版本的
Anaconda安装程序。
$ wget https://repo.anaconda.com/archive/Anaconda3-2025.12-2-Linux-x86_64.sh
运行下载的 Anaconda 安装程序以开始安装。
在本例中, anaconda3被解压到名为 conda-test 的测试用户的家目录中。
$ sh Anaconda3-2025.12-2-Linux-x86_64.sh
------省略------- Anaconda3 将安装到以下位置:/home/conda-test/anaconda3 - 按 Enter 键确认位置 - 按 Ctrl-C 键中止安装 - 或在下方指定其他位置 [/home/conda-test/anaconda3] >>> PREFIX=/home/conda-test/anaconda3 ------省略-------- 要安装 conda 的 shell 函数以便更轻松地访问,请先激活 conda,然后:conda init 感谢您安装 Anaconda3!
安装完成!
正如英文说明中所述,安装完成后请立即运行以下命令以启用 Anaconda:
conda 初始化
重新加载以应用设置。
此时您将进入 Anaconda 环境。
源〜/ .bashrc(基础)conda-test@vagrant:〜$
设置好路径后,检查版本。
$ conda --版本 conda 25.11.1
顺便一提,Anaconda 安装完成后,Python 也包含在内,非常方便!
/home/conda-test/anaconda3/bin/python Python 3.13.9
此外,安装完成后,以下常用库将自动包含在内。
这意味着您无需使用 `pip install` 逐个安装它们。
(不过,我们这次要用到的图表库并未包含在内。)
Pandas
、NumPy
、Matplotlib
、Seaborn
、Jupyter
你也可以通过命令行检查你想要的库是否可用。
(⌒3⌒)<我也不知道这是怎么回事,但是库真的好多啊,太神奇了!
$ conda list
安装 Graphviz
Graphviz 是一款图形创建工具,它使用一种名为 DOT 的数据描述语言。
Diagrams 是一个用于创建配置图的库,需要在本地环境中运行 Graphviz,因此我们将安装它。
$ sudo apt install graphviz
安装完成后,检查版本和位置。
$ dot -V dot - graphviz 版本 2.43.0 (0)
$ which dot /usr/bin/dot
建立虚拟环境
接下来,我要安装 Diagram。不过,我不会直接安装它,而是会搭建一个虚拟环境。
我是 Python 新手,之前在库依赖方面遇到过很多问题(得意脸),所以我会把库安装在虚拟环境中,这样如果它们出了问题,我就可以轻松地删除它们。
要使用 Anaconda 创建虚拟环境,请使用以下命令。
这次,我将绘制一个配置图,因此我将其命名为 draw-env。
$ conda create -n draw-env python=3.10
默认情况下,虚拟环境处于停止状态,请启动它。
现在虚拟环境已准备就绪!
接下来,我们将开始对 draw-env 进行准备和开发工作。
$ conda activate draw-env (draw-env) conda-test@vagrant:~$
那一刻,我心想:
(⌒3⌒)<咦,看起来不像 venv 吗?
……这个念头在我脑海中闪过一瞬,但因为我的主要目标是克服创伤,所以这样也无妨。
安装图
现在我们终于要说到正题了:安装 Diagrams。
如上所述,仅仅安装 Anaconda 并不足以使用它,因此您需要单独安装 Diagrams。
$ pip install diagrams
图表将安装在我们创建的绘图环境中。
完成这一步后,您就可以开始编写配置图的代码了!
绘制配置图
现在终于可以开始绘制图表了。
我想和之前用 VS Code 的 draw.io 一点一点绘制图表的时间说再见了。
文档,似乎可以使用一组常用的图标。
Diagrams 目前支持的主要供应商包括:
AWS、Azure、GCP、Kubernetes、阿里云、Oracle Cloud等……它还支持本地节点、SaaS以及主要的编程框架和语言。
创建一个 Python 文件
这次的目标是创建以下结构。
(我为此使用了 drawio 绘制了它 ;;)

我个人觉得在终端里写代码很困难,所以我会在 VS Code 里创建我的 Python 文件。
from diagrams import Cluster, Diagram, Edge from diagrams.aws.compute import EC2 from diagrams.aws.database import RDS from diagrams.aws.network import VPC, PrivateSubnet, PublicSubnet, CF, ELB from diagrams.aws.security import WAF from diagrams.aws.storage import S3 from diagrams.aws.general import Users, Client with Diagram("", direction="LR", show=False) as diag: # 1. 用户层 user = Users("Users") client = Client("Clients") # 2. 外部服务层 s3 = S3("S3") with Cluster("", graph_attr={"style":"none", "penwidth":"0"}): waf = WAF("WAF") cf = CF("CloudFront") waf - cf # 3. 网络层 (VPC) with Cluster("VPC"): with Cluster("Public Subnet"): lb = ELB("ALB")堡垒机 = EC2("EC2(堡垒机)") with Cluster("私有子网"): webs = [EC2("EC2"), EC2("EC2")] db_primary = RDS("Writer") db_replica = RDS("Reader") db_primary - Edge(style="dashed") - db_replica # 4. 路由定义 用户 >> cf >> lb >> webs >> db_primary 客户端 >> 堡垒机 >> webs webs >> s3
试试看
运行起来非常简单。
只需运行你用 Python 创建的文件即可!
python draw-test.py
结果会是什么?
drwxrwxr-x 2 conda-test conda-test 4096 二月 21 日 11:55 ./ drwxr-x--- 9 conda-test conda-test 4096 二月 21 日 11:55 ../ -rw-rw-r-- 1 conda-test conda-test 1440 二月 21 日 11:55 绘制-test.py -rw-rw-r-- 1 conda-test conda-test 132253 2月21日11:55 web_services.png
哦,图像文件创建成功了!
所以我尝试下载它……

哇哦,它们排列整齐了!!!🎉🎉🎉
竖排(TB)格式太长了,所以我改成横排(LR)格式,这样看起来更整齐。
(⌒3⌒)<(不过,箭头有点太挤了,不太容易看清)
如何编写 Python 文件
从这里开始,这只是一个附加内容,所以如果您不需要,可以随意跳过,但为了我自己的参考,我将简要解释一下内容。
这应该很容易理解,以下是导入 AWS 图标的步骤。
文档中解释了如何编写要导入的每个资源,请参考文档。
from diagrams import Cluster, Diagram, Edge from diagrams.aws.compute import EC2 from diagrams.aws.database import RDS from diagrams.aws.network import VPC, PrivateSubnet, PublicSubnet, CF, ELB from diagrams.aws.security import WAF from diagrams.aws.storage import S3 from diagrams.aws.general import Users, Client
用户层描述的是无法包含在 VPC、子网等内的资源。在这种情况下,无需将它们包含在集群中,可以独立地描述它们。
# 1. 用户层 user = Users("Users") client = Client("Clients")
这是对外部服务层和网络层的描述。如果您想创建一个便于理解的框架并将资源放置在其中,可以将内部资源描述在一个名为“集群”(Cluster)的类中。
*集群也可以命名,并且可以单独设置其可见性。
*要隐藏集群,请将参数留空。
# 2. 外部服务层 s3 = S3("S3") with Cluster("", graph_attr={"style":"none", "penwidth":"0"}): waf = WAF("WAF") cf = CF("CloudFront") waf - cf
这是对每种资源的描述。
如果要并排绘制它们,请使用方括号 [] 来排列它们。
您可以使用 Edge 来更改线条的外观。
使用集群(“私有子网”):webs = [EC2(“EC2”), EC2(“EC2”)] db_primary = RDS(“写入器”) db_replica = RDS(“读取器”) db_primary - Edge(样式为“dashed”) - db_replica
最后是路由部分。
目标地址用“>>”指定。这很容易理解!
如果您要配置 S3 直接从 CloudFront 交付数据,只需输入“cf >> s3”,布局就会改变。
# 4. 路由定义 用户 >> cf >> lb >> webs >> db_primary 客户端 >> 堡垒机 >> webs webs >> s3
最后
你觉得怎么样?
这次,我尝试通过创建一个虚拟环境并生成配置图来克服之前使用 Anaconda 时留下的心理阴影。
当我开始担任工程师并真正开始使用它时,我发现我可以轻松地设置执行环境并运行它。
下次我一定要学会更有效地使用 Anaconda!
再见!!!
参考
https://qiita.com/sakai_noriko/items/53d65f3177b891f6cfcc
https://qiita.com/lighlighlighlighlight/items/8f624751df808d89d48c
https://dev.classmethod.jp/articles/graphviz-beginner/
https://qiita.com/hiesiea/items/860c42a96b031f929b94
https://dev.classmethod.jp/articles/diagrams-introduction/
0