Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Service-discovery DevOps: Управление инфраструктурой

Пример файла terraform/main.tf
// Для удобства всё находится в одном файле
// При необходимости разделяется на отдельные .tf файлы

// https://registry.terraform.io/providers/digitalocean/digitalocean/latest/docs
terraform {
  required_providers {
    digitalocean = {
      source = "digitalocean/digitalocean"
      version = "1.22.2"
    }
  }
}

provider "digitalocean" {
  // Использование переменной (токен доступа к DO)
  // https://www.terraform.io/docs/language/values/variables.html
  token = var.do_token
}

variable "do_token" {}
variable "pvt_key" {
  default = "~/.ssh/id_rsa"
}

output "webserver_ips" {
  value = digitalocean_droplet.servers.*.ipv4_address
}

// Создаём дроплеты
// https://registry.terraform.io/providers/digitalocean/digitalocean/latest/docs/resources/droplet
resource "digitalocean_droplet" "servers" {
  count              = 2
  image              = "docker-20-04"
  name               = "service-discovery-${count.index + 1}"
  region             = "ams3"
  size               = "s-1vcpu-1gb"
  private_networking = true

  // Добавление приватного ключа на создаваемый сервер
  // Обращение к datasource выполняется через data.
  ssh_keys = [
    data.digitalocean_ssh_key.example.id
  ]
}

// Ключ можно либо получить созданный, либо создать новый
// resource "digitalocean_ssh_key" "default" {
//   name       = "Terraform Homework"
//   public_key = file("~/.ssh/id_rsa.pub")
// }
// Используется data source - ресурс не создаётся. Terraform запрашивает информацию о ресурсе
// https://registry.terraform.io/providers/digitalocean/digitalocean/latest/docs/data-sources/droplet
data "digitalocean_ssh_key" "example" {
  name = "key"
}
Пример файла terraform/.gitignore
.terraform
terraform.tfstate
*.backup
Пример файла ansible/setup_servers.yml
- name: Setup servers
  hosts: all
  tasks:
    - name: Update cache
      apt:
        update_cache: yes

    - name: install pip
      include_role:
        name: geerlingguy.pip

    - name: Disable UFW
      community.general.ufw:
        state: disabled
Пример файла ansible/setup_consul_server.yml
- name: Run consul server
  hosts: consul_servers
  tasks:
    - name: Run Consul server
      community.docker.docker_container:
        name: consul-server
        recreate: yes
        image: consul:latest
        network_mode: host
        container_default_behavior: no_defaults
        command: "agent -server -ui -node=server-1 -bootstrap-expect=1 -client=0.0.0.0 -advertise={{ advertise_ip }}"
Пример файла ansible/setup_consul_client.yml
- name: Run Consul client container
  hosts: consul_clients
  tasks:
    - include_tasks: common/register_consul_server_ip.yml

    - name: Run Consul container
      community.docker.docker_container:
        name: consul-client
        image: consul
        recreate: yes
        network_mode: host
        container_default_behavior: no_defaults
        command: "agent -node=client-1 -join={{ consul_server_ip }} -advertise={{ advertise_ip }}"
Пример файла ansible/requirements.yml
collections:
  - community.general
  - ansible.posix

roles:
  - name: geerlingguy.docker
  - name: geerlingguy.pip
Пример файла ansible/register_consul_service.yml
- name: Run Consul client container with service
  hosts: consul_clients
  tasks:
    - include_tasks: common/register_consul_server_ip.yml

    - name: Copy file with owner and permissions
      ansible.builtin.copy:
        src: files/devops.json
        dest: /tmp/devops.json

    - name: Run Consul container
      community.docker.docker_container:
        name: consul-client
        image: consul
        recreate: yes
        network_mode: host
        volumes:
          - /tmp/devops.json:/consul/config/devops.json
        container_default_behavior: no_defaults
        command: "agent -node=client-1 -join={{ consul_server_ip }} -advertise={{ advertise_ip }}"

    - name: Run app container
      community.docker.docker_container:
        name: hexlet-app
        image: hexlet/hexlet-app
        published_ports: 5000:5000
        restart_policy: always
        restart: yes
        pull: yes
        container_default_behavior: no_defaults
        env:
          SERVER_MESSAGE: "Hello!"
Пример файла ansible/hosts.ini
[consul_servers]
server1 ansible_host=142.93.137.128 ansible_user=root
[consul_clients]
client1 ansible_host=134.122.51.58 ansible_user=root
Пример файла ansible/group_vars/all.yml
pip_package: python3-pip
pip_install_packages:
  - name: docker
# Описываем переменную в которой будет храниться IP адрес из предоставляемой VPC
advertise_ip: "..."
Пример файла ansible/common/register_consul_server_ip.yml
- name: Gather facts from consul_server
  ansible.builtin.setup:
  delegate_to: "server1"
  delegate_facts: true
  register: consul_server_facts

- set_fact:
  # Регистрируем в переменную IP адрес в приватной подсети
  consul_server_ip: "..."

- debug:
  var: consul_server_ip
Пример файла ansible/files/devops.json
{
  "service": {
    "name": "devops",
    "tags": ["hexlet"],
    "port": 5000
  }
}

Домашнее задание

hexlet program download devops-for-programmers service-discovery

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.
Об обучении на Хекслете

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
900
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

  • 120 курсов, 2000+ часов теории
  • 900 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы соглашаетесь c «Политикой конфиденциальности» и «Условиями оказания услуг»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff

Есть вопрос или хотите участвовать в обсуждении?

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы соглашаетесь c «Политикой конфиденциальности» и «Условиями оказания услуг»

Изображение Тото

Задавайте вопросы, если хотите обсудить теорию или упражнения. Команда поддержки Хекслета и опытные участники сообщества помогут найти ответы и решить задачу