You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

175 lines
5.4 KiB

7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
  1. ---
  2. order: 3
  3. ---
  4. # Terraform & Ansible
  5. Automated deployments are done using
  6. [Terraform](https://www.terraform.io/) to create servers on Digital
  7. Ocean then [Ansible](http://www.ansible.com/) to create and manage
  8. testnets on those servers.
  9. ## Install
  10. NOTE: see the [integration bash
  11. script](https://github.com/tendermint/tendermint/blob/master/networks/remote/integration.sh)
  12. that can be run on a fresh DO droplet and will automatically spin up a 4
  13. node testnet. The script more or less does everything described below.
  14. - Install [Terraform](https://www.terraform.io/downloads.html) and
  15. [Ansible](http://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html)
  16. on a Linux machine.
  17. - Create a [DigitalOcean API
  18. token](https://cloud.digitalocean.com/settings/api/tokens) with read
  19. and write capability.
  20. - Install the python dopy package (`pip install dopy`)
  21. - Create SSH keys (`ssh-keygen`)
  22. - Set environment variables:
  23. ```
  24. export DO_API_TOKEN="abcdef01234567890abcdef01234567890"
  25. export SSH_KEY_FILE="$HOME/.ssh/id_rsa.pub"
  26. ```
  27. These will be used by both `terraform` and `ansible`.
  28. ## Terraform
  29. This step will create four Digital Ocean droplets. First, go to the
  30. correct directory:
  31. ```
  32. cd $GOPATH/src/github.com/tendermint/tendermint/networks/remote/terraform
  33. ```
  34. then:
  35. ```
  36. terraform init
  37. terraform apply -var DO_API_TOKEN="$DO_API_TOKEN" -var SSH_KEY_FILE="$SSH_KEY_FILE"
  38. ```
  39. and you will get a list of IP addresses that belong to your droplets.
  40. With the droplets created and running, let's setup Ansible.
  41. ## Ansible
  42. The playbooks in [the ansible
  43. directory](https://github.com/tendermint/tendermint/tree/master/networks/remote/ansible)
  44. run ansible roles to configure the sentry node architecture. You must
  45. switch to this directory to run ansible
  46. (`cd $GOPATH/src/github.com/tendermint/tendermint/networks/remote/ansible`).
  47. There are several roles that are self-explanatory:
  48. First, we configure our droplets by specifying the paths for tendermint
  49. (`BINARY`) and the node files (`CONFIGDIR`). The latter expects any
  50. number of directories named `node0, node1, ...` and so on (equal to the
  51. number of droplets created).
  52. To create the node files run:
  53. ```
  54. tendermint testnet
  55. ```
  56. Then, to configure our droplets run:
  57. ```
  58. 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/networks/remote/ansible/mytestnet
  59. ```
  60. Voila! All your droplets now have the `tendermint` binary and required
  61. configuration files to run a testnet.
  62. Next, we run the install role:
  63. ```
  64. ansible-playbook -i inventory/digital_ocean.py -l sentrynet install.yml
  65. ```
  66. which as you'll see below, executes
  67. `tendermint node --proxy_app=kvstore` on all droplets. Although we'll
  68. soon be modifying this role and running it again, this first execution
  69. allows us to get each `node_info.id` that corresponds to each
  70. `node_info.listen_addr`. (This part will be automated in the future). In
  71. your browser (or using `curl`), for every droplet, go to IP:26657/status
  72. and note the two just mentioned `node_info` fields. Notice that blocks
  73. aren't being created (`latest_block_height` should be zero and not
  74. increasing).
  75. Next, open `roles/install/templates/systemd.service.j2` and look for the
  76. line `ExecStart` which should look something like:
  77. ```
  78. ExecStart=/usr/bin/tendermint node --proxy_app=kvstore
  79. ```
  80. and add the `--p2p.persistent_peers` flag with the relevant information
  81. for each node. The resulting file should look something like:
  82. ```
  83. [Unit]
  84. Description={{service}}
  85. Requires=network-online.target
  86. After=network-online.target
  87. [Service]
  88. Restart=on-failure
  89. User={{service}}
  90. Group={{service}}
  91. PermissionsStartOnly=true
  92. 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
  93. ExecReload=/bin/kill -HUP $MAINPID
  94. KillSignal=SIGTERM
  95. [Install]
  96. WantedBy=multi-user.target
  97. ```
  98. Then, stop the nodes:
  99. ```
  100. ansible-playbook -i inventory/digital_ocean.py -l sentrynet stop.yml
  101. ```
  102. Finally, we run the install role again:
  103. ```
  104. ansible-playbook -i inventory/digital_ocean.py -l sentrynet install.yml
  105. ```
  106. to re-run `tendermint node` with the new flag, on all droplets. The
  107. `latest_block_hash` should now be changing and `latest_block_height`
  108. increasing. Your testnet is now up and running :)
  109. Peek at the logs with the status role:
  110. ```
  111. ansible-playbook -i inventory/digital_ocean.py -l sentrynet status.yml
  112. ```
  113. ## Logging
  114. The crudest way is the status role described above. You can also ship
  115. logs to Logz.io, an Elastic stack (Elastic search, Logstash and Kibana)
  116. service provider. You can set up your nodes to log there automatically.
  117. Create an account and get your API key from the notes on [this
  118. page](https://app.logz.io/#/dashboard/data-sources/Filebeat), then:
  119. ```
  120. yum install systemd-devel || echo "This will only work on RHEL-based systems."
  121. apt-get install libsystemd-dev || echo "This will only work on Debian-based systems."
  122. go get github.com/mheese/journalbeat
  123. ansible-playbook -i inventory/digital_ocean.py -l sentrynet logzio.yml -e LOGZIO_TOKEN=ABCDEFGHIJKLMNOPQRSTUVWXYZ012345
  124. ```
  125. ## Cleanup
  126. To remove your droplets, run:
  127. ```
  128. terraform destroy -var DO_API_TOKEN="$DO_API_TOKEN" -var SSH_KEY_FILE="$SSH_KEY_FILE"
  129. ```