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

目录
介绍
好久不见。
我是系统解决方案部的御琴,眼看二年级就要结束了,我开始感到有些焦虑。
我认为如果能够自由地使用像 Ansible 或 Terraform 这样的基础设施即代码 (IaC) 将会非常强大,但Python 所以最近没怎么尝试过。
学生时代,我只浅尝辄止地接触过Unity(C#),但当时我有点得意忘形,竟然 Anaconda 尝试用
一个真正的 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 解压
$ 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` 逐个安装。
(不过,我们这次要用的 Diagrams 库并未包含在内。)这些库包括
: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
图表库已安装在我们创建的 draw-env 环境中。
现在我们已经完成了这一步,终于可以开始编写代码来绘制配置图了!
绘制配置图
现在我们终于可以开始绘制配置图了。
我希望我们终于可以告别过去用 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
哦,图像文件创建好了!
所以我下载下来查看一下……

哇哦,它们都排列得好整齐!!!🎉🎉🎉
竖着放的时候太长了,所以我改成横着放,这样看起来更整齐。
(⌒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` 的类中描述内部资源来实现。
*您还可以为 `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
最后,我们来看路由部分。
您可以使用“>>”指定目标位置。这部分很简单!
如果您将 CloudFront 配置为直接分发到 S3,只需输入“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/
3
