# Домашнее задание к занятию "7.1. Инфраструктура как код"
## Задача 1. Выбор инструментов.
### Легенда
Через час совещание на котором менеджер расскажет о новом проекте. Начать работу над которым надо
будет уже сегодня.
На данный момент известно, что это будет сервис, который ваша компания будет предоставлять внешним заказчикам.
Первое время, скорее всего, будет один внешних клиент, со временем внешних клиентов станет больше.
Так же по разговорам в компании есть вероятность, что техническое задание еще не четкое, что приведет к большому
количеству небольших релизов, тестирований интеграций, откатов, доработок, то есть скучно не будет.
Вам, как девопс инженеру, будет необходимо принять решение об инструментах для организации инфраструктуры.
На данный момент в вашей компании уже используются следующие инструменты:
- остатки Сloud Formation,
- некоторые образы сделаны при помощи Packer,
- год назад начали активно использовать Terraform,
- разработчики привыкли использовать Docker,
- уже есть большая база Kubernetes конфигураций,
- для автоматизации процессов используется Teamcity,
- также есть совсем немного Ansible скриптов,
- и ряд bash скриптов для упрощения рутинных задач.
Для этого в рамках совещания надо будет выяснить подробности о проекте, что бы в итоге определиться с инструментами:
1. Какой тип инфраструктуры будем использовать для этого проекта: изменяемый или не изменяемый?
1. Будет ли центральный сервер для управления инфраструктурой?
1. Будут ли агенты на серверах?
1. Будут ли использованы средства для управления конфигурацией или инициализации ресурсов?
В связи с тем, что проект стартует уже сегодня, в рамках совещания надо будет определиться со всеми этими вопросами.
### В результате задачи необходимо
1. Ответить на четыре вопроса представленных в разделе "Легенда".
1. Какие инструменты из уже используемых вы хотели бы использовать для нового проекта?
1. Хотите ли рассмотреть возможность внедрения новых инструментов для этого проекта?
Если для ответа на эти вопросы недостаточно информации, то напишите какие моменты уточните на совещании.
## Ответ 1.
1.1. Я бы использовал неизменяемый. Из лекции мне он понравился больше своей предсказуемостью. Я готов был бы пожертвовать скоростью развёртывания (при разворачивании новых серверов вместо доустановки ПО) и ресурсами ради стабильности и минимизирования временных затрат на поиски глюков в конкретном экзмпляре ПО/виртуалки.
1.2. Лично мне идея с централизованным сервером нравится тем, что будет единая точка входа для управления. Но при этом мы выбрали Ansible и Terraform (ниже) - они централизованного сервера не требуют. Поэтому наверно без него.
1.3. Опять же с учётом выбора ПО, агенты не нужны.
1.4. Как я понимаю - Terraform будем использовать как средство инициализации ресурсов. А вот уже при создании образов - будем пользоваться Ansible как средством управления конфигурацией.
2. Terraform + Packer + Docker - мне кажутся самыми подходящими. Сначала хотел отказаться от Ansible, а потом тут - https://habr.com/ru/company/croccloudteam/blog/492616/ понял, что можно ведь использовать его для обновления образа.
От Cloud Formation наверно имеет смысл отказаться - закрытый код, достаточно старый продукт (хотя проверенный временем)
Bash скрипты изредка наверно нужно будет использовать.
Teamcity тоже используем для CI/CD + автоматических тестов.
3. Может тупой вариант конечно, но мне кажется ещё было бы здорово GIT иметь - для хранения разных версий конфигов как минимум (уже молучу про версионирование кода для самих разработчкиов)
Ну и какое-то ПО для бэкапов наверно, типа Veeam если речь про ESXi например.
## Задача 2. Установка терраформ.
Официальный сайт: https://www.terraform.io/
Установите терраформ при помощи менеджера пакетов используемого в вашей операционной системе.
В виде результата этой задачи приложите вывод команды `terraform --version`.
## Ответ 2.
PS C:\Users\vah> terraform --version
Terraform v0.14.3
## Задача 3. Поддержка легаси кода.
В какой-то момент вы обновили терраформ до новой версии, например с 0.12 до 0.13.
А код одного из проектов на столько устарел, что не может работать с версией 0.13.
В связи с этим необходимо сделать так, чтобы вы могли одновременно использовать последнюю версию терраформа установленную при помощи
штатного менеджера пакетов и устаревшую версию 0.12.
В виде результата этой задачи приложите вывод `--version` двух версий терраформа доступных на вашем компьютере
или виртуальной машине.
## Ответ 3.
Я сделал очень примитивно... Т.к. terraform - всего лишь бинарник, я положил старый бинарник в ту же директори и просто его переименовал.
```
PS C:\Users\vah> terraform --version
Terraform v0.14.3
PS C:\Users\vah> terraform013 --version
Your version of Terraform is out of date! The latest version
is 0.14.3. You can update by downloading from https://www.terraform.io/downloads.html
Terraform v0.13.0
```
Потом немного почитал и понял, что тру девопс наверно будет билдить докер имидж... ;)
cat Dockerfile
```
FROM ubuntu:20.04
RUN apt-get -y update && \
apt-get -y install sudo wget zip
RUN wget https://releases.hashicorp.com/terraform/0.14.3/terraform_0.14.3_linux_amd64.zip && \
unzip terraform_0.14.3_linux_amd64.zip && \
rm -f terraform_0.14.3_linux_amd64.zip && \
rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin
ENTRYPOINT ["/terraform"]
```
cat Dockerfile_old
```
FROM ubuntu:20.04
RUN apt-get -y update && \
apt-get -y install sudo wget zip
RUN wget https://releases.hashicorp.com/terraform/0.13.5/terraform_0.13.5_linux_amd64.zip && \
unzip terraform_0.13.5_linux_amd64.zip && \
rm -f terraform_0.13.5_linux_amd64.zip && \
rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin
ENTRYPOINT ["/terraform"]
```
Ну и собственно сами команды...
```
vah@LAPTOP-D1L8BMA4:/mnt/c/Users/vah/docker/11-terraform$ docker run --rm -it terraform --version
Terraform v0.14.3
vah@LAPTOP-D1L8BMA4:/mnt/c/Users/vah/docker/11-terraform$ docker run --rm -it terraform:0.13.5 --version
Terraform v0.13.5
Your version of Terraform is out of date! The latest version
is 0.14.3. You can update by downloading from https://www.terraform.io/downloads.html
```