# DeployApp.sh должна запускать средства автоматизации

#### Задание:

1\. На машине ControlVM создайте скрипт /home/altlinux/bin/DeployApp.sh.

* 1\. Скрипт должен выполняться из любой директории без явного указания пути к исполняемому файлу
* 3\. Команда DeployApp.sh должна запускать средства автоматизации для настройки операционных систем.
  * 1\. Разверните web-приложение App1 из репозитория Docker на виртуальных машинах Web1 и Web2.
  * 2\. Обеспечьте балансировку нагрузки между Web1 и Web2.
  * 3\. Обеспечьте внешний доступ к web-приложению по протоколу https.
  * 4\. При обращении по протоколу http должно выполняться автоматическое перенаправления на протокол https.
  * 5\. Обеспечивать доверие сертификату не требуется.

#### Выполнение:

**ControlVM:**

* Установим **ansible**:

```
sudo apt-get install -y ansible
```

* Создадим директорию под ansible:

```
mkdir ansible
```

* Правим основной файл terraform по пути **/home/altlinux/bin/main.tf** и добавляем следующую информацию:

```
vim ~/bin/main.tf
```

* * данный блок будет на основе шаблона автоматически после разрёртывания инфраструктуры с помощью **cloudinit.sh** - будет создавать инвентарный файл для **ansible**:

```
data "template_file" "inventory" {
    template = file("./_templates/inventory.tpl")
  
    vars = {
        user = "altlinux"
        web1 = join("", [yandex_compute_instance.web1.name, " ansible_host=", yandex_compute_instance.web1.network_interface.0.nat_ip_address])
        web2 = join("", [yandex_compute_instance.web2.name, " ansible_host=", yandex_compute_instance.web2.network_interface.0.nat_ip_address])
    }
}

resource "local_file" "save_inventory" {
   content  = data.template_file.inventory.rendered
   filename = "/home/altlinux/ansible/inventory"
}
```

* Создаём директорию для шаблона:

```
mkdir ~/bin/_templates/
```

* Теперь создаём сам шаблон для инвентарного файла:

```
vim ~/bin/_templates/inventory.tpl
```

* * содержимое:

```
${web1}
${web2}

[all:vars]
ansible_user = ${user}
ansible_ssh_extra_args = '-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'
ansible_python_interpreter = /usr/bin/python3
```

* Пишем **playbook-сценарий,** который будет развёртывать и настроивать **web1** и **web2**:

```
vim ~/ansible/playbook.yml
```

* * содержимое:

```
---
- hosts: all
  remote_user: altlinux
  become: true

  tasks:
    - name: Install docker
      apt_rpm:
        name:
          - docker-ce
          - python3-module-pip
        state: present
        update_cache: true
      ignore_errors: true

    - name: Started and enabled docker
      systemd:
        name: docker
        state: started
        enabled: true

    - name: Install docker-py
      command:
        cmd: pip3 install docker-py

    - name: Start a container App1
      docker_container:
        name: app1
        hostname: "{{ ansible_hostname }}"
        image: newerr0r/app1:1.0
        ports:
          - "80:80"
```

* Создаём скрипт по пути **/home/altlinux/bin/DeployApp.sh**:

```
vim /home/altlinux/bin/DeployApp.sh
```

* * содержимое:

```
#!/bin/bash

cd /home/altlinux/ansible
ansible-playbook -i inventory playbook.yml
```

* Задаём права на исполнение:

```
chmod +x /home/altlinux/bin/DeployApp.sh
```

* Запускаем скрипт:

```
DeployApp.sh
```

* * результат:

![](https://sysahelper.ru/pluginfile.php/312/mod_page/content/3/image.png)

* Проверяем:
  * из файла **/home/altlinux/lb.ip** берём внешний адрес Балансировщика и проверяем в браузере доступ:

![](https://sysahelper.ru/pluginfile.php/312/mod_page/content/3/image%20%286%29.png)

* * доступ:

![](https://sysahelper.ru/pluginfile.php/312/mod_page/content/3/image%20%284%29.png)

* * при обновлении страницы видна пработа балансировщика:

![](https://sysahelper.ru/pluginfile.php/312/mod_page/content/3/image%20%285%29.png)

Последнее изменение: пятница, 16 февраля 2024, 13:11


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://seraphim.gitbook.io/volodyazetkin2024gitbook/modul-v.-docker-compose-sozdanie-lokalnogo-docker-registry/deployapp.sh-dolzhna-zapuskat-sredstva-avtomatizacii.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
