Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ansible 1 #7

Merged
merged 9 commits into from
Nov 12, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,6 @@
variables.json
*.tfstate
*.tfstate.*.backup
*.tfstate.backup
*.tfvars
.terraform/
5 changes: 5 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"files.eol": "\n",
"files.trimFinalNewlines": true,
"files.insertFinalNewline": true
}
86 changes: 83 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#HW-3
# HW-3
## В процессе сделано:
- Созданы две ВМ. Одна с внутренним. Одна с внешним и внутренним IP - пограничный сервер.
- Проработаны несколько вариантов подключения через proxy по SSH
Expand Down Expand Up @@ -32,7 +32,7 @@ someinternalhost_IP = 10.156.0.2
- Перейти по ссылке https://35.187.10.59.sslip.io


#HW-4
# HW-4
## В процессе сделано:
- Развёрнуто приложение на виртуальной машине в GCP.
- Добавлено вручную правило для разрешения входящего трафика на сервера с определённым тегом.
Expand Down Expand Up @@ -76,7 +76,7 @@ gcloud compute firewall-rules create default-puma-server \
--target-tags puma-server
```

#HW-5
# HW-5
## В процессе сделано:
- Выдали доступ приложению Packer к GCP.
- Создали по инструкции базовый образ ubuntu с установленными ruby и mongodb и задеплоили в него приложение.
Expand All @@ -89,3 +89,83 @@ gcloud compute firewall-rules create default-puma-server \
- Выполнить скрипт config-scripts/create-reddit-vm.sh. Запомнить IP.
- Добавить правило firewall, разрешающее входящий трафик на порт TCP 9292.
- Пройти по ссылке http://IP:9292.

# HW-6
## В процессе сделано:
- Удалили ключ из метаданных проекта, чтобы протестировать добавление ключа через метаданый ресурса.
- Я перевёз средство разработки из Linux nano в MS VS Code. Пришлось заново настроить аутентификацию пакера и терраформа в gcloud.
- Создали ВМ из образа reddit-base. Посмотрели tfstate, грепнули его, чтобы получить IP-адрес.
- Создали output переменные. После редактирования ВМ сразу в консоль выводился IP-адрес.
- Создали ресурс правило фаерволла для нашего приложения. Удалил старое правило из прошлых дз для чистоты эксперимента.
- Добавили provisioners для деплоя приложения, добавили systemd unit из прошлого ДЗ со *.
- Добавили входные переменные.
- Использовали полезную команду terraform fmt для автоматического форматирования конфигов терраформа.
- Пометили ВМ для пересоздания командой terraform taint.resource_type.resource_name.
- Добавили несколько юзеров с ключами в метаданные проекта. Изменения применились не сразу, т.к. у меня в ЛК были созданы ещё какие-то старые экспериментальные ключи. Конфиг применился только после ручного удаления юзеров. Было бы неплохо этот эксперимент добавить в ДЗ.
- Последующее добавление вручную и применение конфига удалило вручную созданных юзеров.
- Изучили метод создания load balancer в GCP и в Terraform. В конфигах есть комментарии к ресурсам. Что можно ещё добавить в конфигурацию приложения: 1. Добавить внутренние адреса для инстансов приложений, оставить внешний адрес только у балансера. 2. Добавить репликацию/честную кластеризацию БД.
- Изучили метод параметризации количества инстансов ВМ с приложением.

## Проблемы при добавлении ключей:
- Изменения применились не сразу, т.к. у меня в ЛК были созданы ещё какие-то старые экспериментальные ключи. Конфиг применился только после ручного удаления юзеров. Было бы неплохо этот эксперимент добавить в ДЗ.

## Недостатки LB конфигурации.
- При добавлении дополнительного ресурса ВМ необходимо в нескольких местах поменять конфиги. 1. Добавить ресурс ВМ. 2. Добавить ВМ в instance_group. 3. Добавить IP в output (для сохранения шаблонности).
- При изменении конфигурации ВМ в ТФ необходимо добавить изменения в нескольких ресурсах.

## Что можно ещё добавить в конфигурацию приложения:
- Добавить внутренние адреса для инстансов приложений, оставить внешний адрес только у балансера.
- Добавить репликацию/честную кластеризацию БД.
- Сейчас health-check работает только по недоступности приложения. Желательно, чтобы работала по превышению нагрузки, по кодам ответа HTTP. Чтобы работало распределение пользователей по прозрачным правилам, например, приблизительное непревышение разницы метрик нагрузки.

# HW-7
## В процессе сделано
- Импортировали правило файерволла, разрешающее подключение по SSH к машинам. Это было сделано, т.к. добавление правила с таким же именем вызывло конфликт, т.к. ТФ ничего не знал об этом правиле, т.к. в state-файле не было такой информации.
- Изучили вопрос явных и неявных связей между ресурсами. Обратили вниманиеd в каком порядке добавляются и удаляются зависимые ресурсы.
- Кроме неявных зависимостей, у всех ресурсов есть мета-параметр depends-on, который добавляет явную зависимость от ресурса. В доках и в гугле не нашёл нормального способа добавить зависимость в ресурсы одного модуль от ресурсов другого модуля.
- Пакером разбили виртуалку с приложением и БД на две виртуалки: приложение и БД.
- В ТФ так же разбили ресурс с ВМ на два ресурса: приложение и БД, созданные из образов, которые запаковали в пакере.
- В конфиг ТФ приложения добавили правило файерволла, разрешающее доступ по порту 9292, а в конфиг ТФ БД добавили правило, разрешающее доступ к монге по 27017.
- Оставшуюсь конфигурацию разбили по файлам main.tf, описывающий провайдер GCP и файл vpc.tf, описывающий правило доступа по ssh.
- Далее конфигурации БД и приложения разбили по модулям, которые подключаются в основном файле main.tf.
- Добавили модуль vpc.tf c переменной IP источника, чтобы для прода ограничивать доступ по SSH, а для препрода нет.
- Добавили из реестра модулей модуль, создающий bucket'ы в GCP. Создали два бакета, для препрода и прода.
- Настроили хранение стейтов в бакетах. Проверили, что при инициализации терраформа в директории с созданными конфиг файлами стейт берётся из бакета. Это ОЧЕНЬ удобно. Это позволяет не заботиться о хранении актуального стейта.
- Проверили одновременное изменение конфигурации - не работает. Не работает даже terraform plan, что логично. Бакет не даёт прочитать state.
- Добавили provisioners в DB и APP. В DB нужно изменть конфиг mongo, чтобы демон слушал не только локалхост. В APP нужно добавить переменную IP адрес сервера БД, которая запишется в unit. Нельзя добавить при деплое, т.е. приложение при каждом запуске берёт IP адрес из переменной.
- Добавили запуск provisioners с условием. Добавляется null_resourse, который может запускаться по триггеру. Можно запускать по изменению, можно по равенству переменной чему-либо (тернарный оператор на count). Недостатком такой конфигурации является то, что при force пересоздании (taint), нужно помечать оба ресурса, и родительский, и null_resourse. Нужно как-то в триггеры добавить условие пересоздания родительского ресурса.

## Как проверить работоспособность.
- Забрать проект c git.
- Создать terraform.tfvars из terraform.tfvars.example, указать новый проект.
- Перейти в директорию terraform.
- Выполнить terraform init и terraform apply(Команда создаст бакет для хранения tfstate).
- Перейти в директорию stage. Создать terraform.tfvars из terraform.tfvars.example, указать свой проект и заполнить другие переменные. Если необходимо добавить provisioners, указать переменную provisioner_condition = 1.
- Выполнить terraform init и terraform apply(Команда создаст инфраструктуру с приложением).

# HW-8
## В процессе сделано
- Интегрировал своё окружение на Windows с Linux. Git остался на Windows, в Linux подключил раздел по cifs.
- Установили Python2.7, pip, Ansible.
- Заполнили инвентори в формате ini, конфиг, попинговали хосты.
- Перевели инвентори в формат YAML.
- Сравнили shell/command, command/service/systemd, command/git.
- Написали просто плейбук на git clone. См. наблюдения в следующем пункте.
- Ознакомились с форматом JSON инвентори. Используется для автоматизации получение инвентори.
- Два формата. Практически плоский JSON со ссылочной структурой родитель-ребёнок и JSON с иерархической структурой (копия YAML). Первый нужно "скормить" Ансиблу в виде исполняемого скрипта, который возвращает JSON, второй возможно "скормить" в виде файла (команды см. в п. ниже).

## Выполнение простого плейбука.
- Первый раз выполнили плейбук, когда приложение уже было склонировано. Ансибл вернул по всем шагам OK. Удалили склонированный репозиторий и снова выполнили ту же команду. Анмибл вернул changed по задаче клонирования репозитория.

## Команды для использования JSON инвентори.
```
ansible app -m ping -i get-inventory.sh
ansible app -m ping -i inventory.json
```

## Как проверить работоспособность.
- Забрать ветку ansible-1.
- Перейти в директорию terraform/stage
- Выполнить terraform init && terraform apply, получить IP адреса (ключи пользователя appuser должны быть в домашней директории ~/.ssh).
- Заменить IP адреса из инвентори (8.8.8.8 и 9.9.9.9).
- Выполнить команды из п. выше.
6 changes: 6 additions & 0 deletions ansible/ansible.cfg
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
[defaults]
inventory = ./inventory
remote_user = appuser
private_key_file = ~/.ssh/appuser
host_key_checking = False
retry_files_enabled = False
8 changes: 8 additions & 0 deletions ansible/clone.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
- name: Clone
hosts: app
tasks:
- name: Clone repo
git:
repo: https://github.com/express42/reddit.git
dest: /home/appuser/reddit
2 changes: 2 additions & 0 deletions ansible/get-inventory.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#!/bin/bash
cat inventory2.json
4 changes: 4 additions & 0 deletions ansible/inventory
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
[app]
appserver ansible_host=8.8.8.8
[db]
dbserver ansible_host=9.9.9.9
16 changes: 16 additions & 0 deletions ansible/inventory.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"app": {
"hosts": {
"appserver": {
"ansible_host": "8.8.8.8"
}
}
},
"db": {
"hosts": {
"dbserver": {
"ansible_host": "9.9.9.9"
}
}
}
}
9 changes: 9 additions & 0 deletions ansible/inventory.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
app:
hosts:
appserver:
ansible_host: 8.8.8.8

db:
hosts:
dbserver:
ansible_host: 9.9.9.9
23 changes: 23 additions & 0 deletions ansible/inventory2.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"app": {
"children": [
"appserver",
"dbserver"
]
},
"db": {
"children": [
"dbserver"
]
},
"appserver": {
"hosts": [
"8.8.8.8"
]
},
"dbserver": {
"hosts": [
"9.9.9.9"
]
}
}
1 change: 1 addition & 0 deletions ansible/requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ansible>=2.4
32 changes: 32 additions & 0 deletions packer/app.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
{
"variables": {
"project_id": "infra-219212",
"machine_type": "f1-micro",
"source_image_family": "ubuntu-1604-lts",
"disk_size": "10",
"disk_type": "pd-standard",
"image_description": "ruby for reddit-app"
},
"builders": [
{
"type": "googlecompute",
"project_id": "{{ user `project_id` }}",
"image_name": "reddit-app-base-{{timestamp}}",
"image_family": "reddit-app-base",
"source_image_family": "{{ user `source_image_family` }}",
"zone": "europe-west1-b",
"ssh_username": "appuser",
"machine_type": "{{ user `machine_type` }}",
"disk_size": "{{ user `disk_size` }}",
"disk_type": "{{ user `disk_type` }}",
"image_description": "{{ user `image_description` }}"
}
],
"provisioners": [
{
"type": "shell",
"script": "scripts/install_ruby.sh",
"execute_command": "sudo {{.Path}}"
}
]
}
32 changes: 32 additions & 0 deletions packer/db.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
{
"variables": {
"project_id": "infra-219212",
"machine_type": "f1-micro",
"source_image_family": "ubuntu-1604-lts",
"disk_size": "10",
"disk_type": "pd-standard",
"image_description": "mongo for reddit-app"
},
"builders": [
{
"type": "googlecompute",
"project_id": "{{ user `project_id` }}",
"image_name": "reddit-db-base-{{timestamp}}",
"image_family": "reddit-db-base",
"source_image_family": "{{ user `source_image_family` }}",
"zone": "europe-west1-b",
"ssh_username": "appuser",
"machine_type": "{{ user `machine_type` }}",
"disk_size": "{{ user `disk_size` }}",
"disk_type": "{{ user `disk_type` }}",
"image_description": "{{ user `image_description` }}"
}
],
"provisioners": [
{
"type": "shell",
"script": "scripts/install_mongodb.sh",
"execute_command": "sudo {{.Path}}"
}
]
}
1 change: 0 additions & 1 deletion packer/ubuntu16.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
"source_image_family": null,
"disk_size111": null,
"disk_name": null,
"disk_size111": null,
"disk_type": null,
"image_description": null,
"network": null
Expand Down
12 changes: 12 additions & 0 deletions terraform/files/deploy.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#!/bin/bash
set -e

APP_DIR=${1:-$HOME}

git clone -b monolith https://github.com/express42/reddit.git $APP_DIR/reddit
cd $APP_DIR/reddit
bundle install

sudo mv /tmp/puma.service /etc/systemd/system/puma.service
sudo systemctl start puma
sudo systemctl enable puma
Loading