Тестовое задание выполнение с помощью Terraform и Ansible.
Развертывание происходит на GCP.
Для успешного развертывания, в каталоге terraform/prod
должен лежать json-key для сервисного аккаунта в GCP, у которого есть права на создание Compute Engine инстансов, правил фаерволла, дисков. Кроме того, нужно terraform/modules/vpc/variables.tf заменить внешний source_range на свой. Еще, нужно создать ключ с именем ~/.ssh/appuser и добавить его в IAM в GCP.
-
Terraform v0.12.20
-
provider.google v3.17.0
-
provider.null v2.1.2
-
ansible 2.9.6
Для развертывания, зайти в terraform/prod
и выполнить terraform init
, чтобы установились все необходимые зависимости и инициализировались модули. Затем выполнить terraform plan
Если все ок, выполнить terraform apply
.
Весь комплект для развертывания состоит из трех terraform-модулей, котоыре описывают настройку инстанса с базой, инстанса с приложением и настроек vpc. Кроме этого, для развертывания приложения я написал простой ansible-плейбук и для установки mysql использовал роль от geerlingguy.
Для того, чтобы приложение работало, пришлось удалить из конфига приложения секцию про graylog, поправить host приложения, а также, динамически в конфиг пробрасываются айпиадрес хоста с базой, юзер и пароль из vars.yml.
Кроме того, для корректного выполнения условий задачи, руками удалил дефолтные правила в GCP
gcloud compute firewall-rules delete default-allow-icmp
gcloud compute firewall-rules delete default-allow-rdp
gcloud compute firewall-rules delete default-allow-ssh
curl -X POST 35.246.69.218:8084/v1/health/check {"last_check":"2020-04-18 19:20:01","version":"1.40"}
Здесь представлено решения All-in-one, но в реальной жизни, я бы разделил terraform и ansible-плейбуки, упаковал бы все это в CI в каком-нибудь гитлабе/дженкинсе. Сделал бы шаг тестирования для веток, когда в процессе жизненного цикла данного репозитория, будут добавляться какие-то изменения, можно было тестить ветки, разделил бы логически создание инфраструктуры, настройку инфраструктуры.
В файле ansible/db/vars.yml непосредственно прописаны пароли на базу. Это очень нехороший кейс. По факту лучше, если катить какие-то секреты, их нужно в простом случае, катить через ansible-vault. В лУчшем случае, у нас должен быть hashicorp Vault и такие секреты должны генериться там и браться оттуда.