Terraform & Ansible

优质
小牛编辑
138浏览
2023-12-01

自动化部署使用 Terraform 在 Digital Ocean 上创建服务器,然后 Ansible 在这些服务器上创建和管理测试网络。

安装

注意:请参阅集成 bash 脚本,它可以在一个新的 DO 液滴上运行,并将自动启动一个 4 节点的测试网络。脚本或多或少完成了下面描述的所有工作。

  • 在 Linux 机器上安装 TerraformAnsible
  • 创建一个带读写能力的 DigitalOcean API token
  • 安装 python dopy 包 (pip install dopy)
  • 创建 SSH 密钥 (ssh-keygen)
  • 设置环境变量:
export DO_API_TOKEN="abcdef01234567890abcdef01234567890"
export SSH_KEY_FILE="$HOME/.ssh/id_rsa.pub"

这些将被用于 terraformansible

Terraform

这一步将创建四个 Digital Ocean droplets。首先,转到正确的目录:

cd $GOPATH/src/github.com/tendermint/tendermint/networks/remote/terraform

然后:

terraform init
terraform apply -var DO_API_TOKEN="$DO_API_TOKEN" -var SSH_KEY_FILE="$SSH_KEY_FILE"

你会得到一个属于你 droplets 的 IP 地址列表。

创建并运行 droplets 之后,让我们设置 Ansible。

Ansible

ansible 目录中的剧本运行 ansible 角色来配置哨兵节点体系结构。要运行 ansible,必须切换到这个目录(cd $GOPATH/src/github.com/tendermint/tendermint/networks/remote/ansible)。

有几个角色不言自明:

首先,我们通过指定 tendermint(BINARY) 和节点文件(CONFIGDIR)的路径来配置 droplets。后者期望任意数量的目录名为 node0, node1, ... 以此类推(等于产生的 droplets 数量)。对于这个示例,我们使用这个目录中预先创建的文件。要创建自己的文件,可以使用 tendermint testnet 命令或查看手动部署。

下面是运行的命令:

ansible-playbook -i inventory/digital_ocean.py -l sentrynet config.yml -e BINARY=$GOPATH/src/github.com/tendermint/tendermint/build/tendermint -e CONFIGDIR=$GOPATH/src/github.com/tendermint/tendermint/docs/examples

瞧!您的所有 droplets 现在都具有 tendermint 二进制文件,并且运行测试网络需要配置文件。

接下来,我们运行安装角色:

ansible-playbook -i inventory/digital_ocean.py -l sentrynet install.yml

如下所示,在所有 droplets 上执行 tendermint node --proxy_app=kvstore。虽然我们很快将修改这个角色并再次运行它,但是第一次执行允许我们获得每个 node_info.id 对应于每个 node_info.listen_addr。(这部分将在未来实现自动化)。在您的浏览器中(或者使用 curl),对于每一个 droplets,转到 IP:26657/status 并注意刚才提到的两个字段 node_info。注意,没有创建块(latest_block_height 应该为零,并且没有增加)。

接下来,打开 roles/install/templates/systemd.service.j2,然后查找 ExecStart 行,它应该类似于:

ExecStart=/usr/bin/tendermint node --proxy_app=kvstore

然后添加 --p2p.persistent_peers 的标志,其中包含每个节点的相关信息。结果文件应该类似于:

[Unit]
Description={{service}}
Requires=network-online.target
After=network-online.target

[Service]
Restart=on-failure
User={{service}}
Group={{service}}
PermissionsStartOnly=true
ExecStart=/usr/bin/tendermint node --proxy_app=kvstore --p2p.persistent_peers=167b80242c300bf0ccfb3ced3dec60dc2a81776e@165.227.41.206:26656,3c7a5920811550c04bf7a0b2f1e02ab52317b5e6@165.227.43.146:26656,303a1a4312c30525c99ba66522dd81cca56a361a@159.89.115.32:26656,b686c2a7f4b1b46dca96af3a0f31a6a7beae0be4@159.89.119.125:26656
ExecReload=/bin/kill -HUP $MAINPID
KillSignal=SIGTERM

[Install]
WantedBy=multi-user.target

然后,停止节点:

ansible-playbook -i inventory/digital_ocean.py -l sentrynet stop.yml

最后,我们再次运行安装角色:

ansible-playbook -i inventory/digital_ocean.py -l sentrynet install.yml

在所有 droplets 上带新标志重新运行 tendermint nodelatest_block_hash 现在应该在更改,latest_block_height 应该在增加。您的测试网络现在已经启动并运行了