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.yml
app.yml
deploy.yml
Плейбуки для провиженинга в packer:
packer_db.yml
packer_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, а также оповещения в чат.