概述
自动化是计算机科学的核心,随着时间的推移,许多不同的自动化工具和方法应运而生。通过本文,您将能够使用单个命令设置 VPN 服务器和客户端。自动化可以释放您的时间,让您在未来学习和完成更多任务。您还可以分享您的自动化,帮助他人更快地构建和实现目标。让我们开始使用 Ansible 自动化 VPN 设置吧!
前言
在之前的博客中,我们设置了一个 WireGuard VPN 服务器和客户端,并了解了 WireGuard 的各种配置选项、如何提高 VPN 服务器的正常运行时间、如何转发流量等。像这样设置服务器和客户端是非常麻烦的工作!如果服务器崩溃或您想设置一个新服务器(也许是为朋友或家人),您需要回到之前的步骤,遵循所有指令,记住您是否在某个地方偏离了这些指令。
自动化的好处
有更好的方法——自动化!如果您只打算做一次(例如设置一个 VPN),投资于自动化可能不太合算。但如果您预计将会多次执行某项任务,自动化将释放您的时间,让您在未来学习和完成更多任务。您还可以分享您的自动化,帮助他人更快地构建和实现目标。
选择自动化工具
对于自动化 VPN 服务器设置的项目,我们可以考虑多种工具:
-
Shell 脚本
从工具的角度来看,最简单的方法是编写 shell 脚本,运行之前 WireGuard 教程博客中的命令,使用 ssh 执行服务器上的命令,并使用 rsync 将配置文件复制到服务器。 -
SSH 脚本库
如果 shell 脚本不理想,可以使用像 Capistrano 或 Fabric 这样的库,这些库为熟悉 Ruby 和 Python 等高级语言的开发者提供了更人性化的脚本功能。 -
基础设施/配置自动化工具(如 Puppet、Chef 或 Ansible)
这一类工具专门用于自动化服务器基础设施和配置,通常包括一系列包和插件,可以自动设置或配置几乎任何您能想到的东西。 -
基础设施即代码工具(如 Terraform)
基础设施即代码(IaC)工具与上述类别有很多重叠,但以更原生的方式支持云资源的配置。 -
容器(如 Docker)
您还可以在容器中运行 WireGuard,将服务器配置的容器镜像部署到云提供商,并在本地运行客户端配置的容器镜像以连接到服务器。
在本教程中,我将重点关注中间类别的基础设施/配置自动化工具,特别是 Ansible。尽管 Gruntwork 的一篇文章更倾向于 Terraform,但 Ansible 仍然是一个有用的通用工具,尤其是当您在非云服务器(如家中的 Raspberry Pi)上工作时。
设置 Ansible
Ansible 可以通过操作系统的包管理器(如 apt)安装,但我更喜欢使用 pip 以便获得最新更新,并避免将第三方 PPA(个人包存档)杂乱地添加到系统包管理中。我们还将使用 pyenv(由 Hypermodern Python 建议)来确保我们不会破坏或混乱系统 Python 安装。请按照以下步骤安装 pyenv:
```bash
sudo apt-get update
sudo apt-get install --no-install-recommends make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
curl https://pyenv.run | bash ```
在执行 curl <url> | bash
时,建议您先打开该 URL,查看它将要执行的内容。在这种情况下,它将下载并执行一个 shell 脚本,该脚本会从 GitHub 克隆 6 个仓库到您的 ~/.pyenv
文件夹,并提示您在 shell 的初始化脚本中添加几行。
根据上面的输出提示,将类似于以下内容的行添加到您的 shell 初始化脚本中(例如,如果您使用 bash shell,则为 ~/.bashrc
)。确保填写您自己的用户名!
bash
export PATH="/home/YOUR_USERNAME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
安装一个较新的 Python 版本:
```bash
pyenv install --list
pyenv install 3.9.2
pyenv global 3.9.2 ```
如果需要,您还可以创建一个虚拟环境,以进一步隔离 Ansible 安装,并使该虚拟环境在您所在的特定文件夹/仓库中自动激活。示例如下:
```bash
pyenv virtualenv 3.9.2 ansible-tutorial
pyenv local ansible-tutorial ```
安装 ansible pip 包,这将安装各种命令行工具,包括 ansible-playbook,我们将使用它来运行设置 VPN 服务器和客户端的“剧本”。
```bash pip install ansible
ansible --version ```
获取服务器
要使用 Ansible 设置 VPN 服务器,我们需要……一个服务器!Ansible 可以为我们从云提供商配置一台服务器(稍后我会简单提及),但我们暂时保持剧本与硬件提供商无关,因此您可以轻松地在云服务器或家用网络中的 Raspberry Pi 上运行它。我将创建一个每月 5 美元的 DigitalOcean droplet 进行测试,但您也可以使用 Vagrant(测试本地虚拟机)或任何您可以 SSH 连接的服务器。
在虚拟机上测试 Ansible 剧本而不是裸金属机器的一个优势是——在您编写完剧本后,您可以启动一个新的空虚拟机并测试整个剧本,以确保其一致性。
使用 Ansible 连接服务器
一旦您拥有服务器或虚拟机,请记下其 IP 地址,并使用它创建一个 inventory.ini
文件,如下所示:
ini
[vpn]
vpn_server ansible_host=203.0.113.1 ansible_user=root
库存文件告诉 Ansible 它可以操作哪些服务器以及如何访问它们。让我们以以上库存文件为例。当我们运行 Ansible 并针对 vpn
组的服务器或 vpn_server
主机时,它将尝试使用类似于以下的命令连接到服务器:
bash
ssh root@203.0.113.1
因此,如果您无法 SSH 连接到服务器,Ansible 也将无法连接!建议使用 SSH 密钥连接到服务器!将您的 SSH 密钥添加到服务器,以便无需密码即可连接。如果您必须使用密码连接,可以运行以下命令:
bash
sudo apt install sshpass
然后在使用 Ansible 时,通过在所有 ansible 命令中添加 --ask-pass
标志提供您的 SSH 密码。
让我们测试一下,确保 Ansible 可以连接到服务器:
bash
ansible -i inventory.ini -m ping vpn
这将运行 ping Ansible 模块,目标是 vpn
组的服务器。您应该看到 "pong" 的响应,表示连接成功。
结论
通过本文,您已经学会了如何使用 Ansible 自动化 VPN 设置。自动化不仅可以节省您的时间,还可以提高工作效率,让您能够专注于更有价值的任务。现在,您可以将这些知识应用到实际应用中,轻松设置 VPN 服务器和客户端。希望您能从中受益!