igormelnikov Infra repository
Подключение ко внутреннему хосту при помощи команды ssh someinternalhost:
Файл ~/.ssh/config:
Host someinternalhost
User appuser
IdentityFile ~/.ssh/appuser
ProxyCommand ssh appuser@bastion -W %h:%p
Host bastion
User appuser
HostName 35.210.200.77
IdentityFile ~/.ssh/appuser
bastion_IP = 35.204.149.219 someinternalhost_IP = 10.164.0.3 testapp_IP = 35.208.236.82 testapp_port = 9292
Startup script: файл install.sh
Команда gcloud:
gcloud compute instances create reddit-app --boot-disk-size=10GB --image-family=ubuntu-1604-lts --image-project=ubuntu-os-cloud --machine-type=g1-small --tags puma-server --restart-on-failure --metadata-from-file startup-script=install.sh
Команда gcloud, если скрипт находится в бакете infra-reddit-storage:
gcloud compute instances create reddit-app --boot-disk-size=10GB --image-family=ubuntu-1604-lts --image-project=ubuntu-os-cloud --machine-type=g1-small --tags puma-server --restart-on-failure --scopes storage-ro --metadata startup-script-url=gs://infra-reddit-storage/install.sh
Команда gcloud для создания правила фаервола default-puma-server:
gcloud compute --project=infra-219315 firewall-rules create default-puma-server --direction=INGRESS --priority=1000 --network=default --action=ALLOW --rules=tcp:9292 --source-ranges=0.0.0.0/0 --target-tags=puma-server
В main.tf описано добавление нескольких ssh-ключей в метаданные проекта. Если добавить ключ appuser_web через веб-интерфейс, при следующем terraform apply он будет удалён, поскольку не прописан в terraform. Таким образом, все изменения инфраструктуры должны производиться через код.
При описании второго инстанса reddit-app2 мы имеем одинаковые конфигурации, каждую из которых придётся поддерживать и обновлять по отдельности, следя при этом за повторяемостью и проч. Кроме того, мы не можем воспользоваться managed группой инстансов в GCP.
-
main.tf- описание группы инстансов reddit-app1, reddit-app2 etc. -
lb.tf- описание http-балансировщика -
outputs.tf:-
all_app_external_ips- список внешних адресов каждого инстанса -
lb_external_ip- внешний адрес балансировщика
-
storage-bucket.tf - описание двух бакетов GCP для хранения бакендов для stage и prod: reddit-state-stage, reddit-state-prod
stage/backend.tf, prod/backend.tf - описание конфигурации бакенда для соответствующего окружения
Для модулей app и db переменная use_provisioner отвечает за включение/отключение провиженера, тип boolean, значение по умолчанию true.
Выполнение плейбука clone.yml:
appserver : ok=2 changed=1 unreachable=0 failed=0
Удалив репозиторий предыдущей командой 'rm -rf ~/reddit', с помощью плейбука мы заново клонировали репозиторий. Состояние системы изменилось, поэтому changed=1.
Описания inventory - ansible/inventory, inventory.ym, inventory.json
clone.yml - простой плейбук, клонирующий репозиторий
requirements.txt - описание virtualenv для ansible
Плейбуки для развёртывания приложения в stage окружении:
reddit_app_one_play.yml- один сценарийreddit_app_multiple_plays.yml- несколько сценариевsite.yml- несколько плейбуков:db.ymlapp.ymldeploy.yml
Плейбуки для провиженинга в packer:
packer_db.ymlpacker_app.yml
Описание динамического инвентори GCP содержится в inventory.gcp.yml, который выбран в ansible.cfg по умолчанию.
Ansible роли для app и db находятся в директории roles и вызываются с помощью app.yml и dm.yml.
Окружения stage и prod находятся в директории environments. По умолчанию установлено окружение stage. Для обоих окружений используется динамический GCP инвентори inventory.gcp.yml.
Community-роль jdauphant.nginx вызывается в app.yml для доступа к приложению по 80 порту.
В users.yml описано создание пользователей; данные пользователей хранятся в зашифрованном Ansible Vault environments/<env>/credentials.yml.
ssh.yml включает доступ ко всем хостам по ssh с паролем.
site.yml - основной плейбук для поднятия инфраструктуры, запускающий остальные.
В play-travis/test.sh описан тестовый скрипт для докер-контейнера в Travis, вызывающий packer validate, terraform validate, tflint и ansible-lint.
В Vagrantfile описана инфраструктура app/db для тестов на локальной машине с хостами appserver и dbserver. Производится установка python и провиженинг с помощью Ansible. Для appserver добавлена конфигурация nginx.
packer_app.yml теперь использует роль app (тэг ruby).
packer_db.yml теперь использует роль db (тэг install).
Переменная deploy_user в app - имя пользователя, в домашней директории какого будет производиться конфигурация. Значение по умолчанию - appuser.
Для db описаны тесты с помощью molecule и Testinfra.
Роль db вынесена в отдельный репозиторий igormelnikov/db, подключение описано в requirements.yml обоих окружений. Для репозитория подключен TravisCI, а также оповещения в чат.