Files
netology-devops/src/homework/04-script/4.2

Выполнение домашнего задания по теме "4.2. Использование Python для решения типовых DevOps задач".

Q/A

Обязательная задача 1

Есть скрипт:

#!/usr/bin/env python3
a = 1
b = '2'
c = a + b

Вопросы:

Вопрос Ответ
Какое значение будет присвоено переменной c? Переменной не будет присвоено никакое значение, потому что производится сложение целого числа и строки, при этом будет инициировано исключение TypeError: unsupported operand type(s) for +: 'int' and 'str'
Как получить для переменной c значение 12? Для этого необходимо присвоить переменной a строковое значение '1', чтобы была произведена конкатенация строк. script
Как получить для переменной c значение 3? Для этого необходимо присвоить переменной b целочисленное значение 2 (без кавычек). script

Обязательная задача 2

Мы устроились на работу в компанию, где раньше уже был DevOps Engineer. Он написал скрипт, позволяющий узнать, какие файлы модифицированы в репозитории, относительно локальных изменений. Этим скриптом недовольно начальство, потому что в его выводе есть не все изменённые файлы, а также непонятен полный путь к директории, где они находятся. Как можно доработать скрипт ниже, чтобы он исполнял требования вашего руководителя?

#!/usr/bin/env python3

import os

bash_command = ["cd ~/netology/sysadm-homeworks", "git status"]
result_os = os.popen(' && '.join(bash_command)).read()
is_change = False
for result in result_os.split('\n'):
    if result.find('modified') != -1:
        prepare_result = result.replace('\tmodified:   ', '')
        print(prepare_result)
        break

Ваш скрипт:

script

#!/usr/bin/env python3

import os
cd_command = "cd ~/netology/sysadm-homeworks"
bash_command = [cd_command, "git status"]
top_level_command = [cd_command, "git rev-parse --show-toplevel"]
top_level = os.popen(' && '.join(top_level_command)).read().replace('\n', '')
result_os = os.popen(' && '.join(bash_command)).read()
for result in result_os.split('\n'):
    if result.find('modified') != -1:
        prepare_result = result.replace('\tmodified:   ', '')
        full_path = top_level + '/' + prepare_result
        print(full_path)

Вывод скрипта при запуске при тестировании:

note: при запуске скрипта изменил путь до репозитория.

./q2.py
/home/dannc/code/learning/netology/readme.md
/home/dannc/code/learning/netology/src/homework/04-script/4.2/q1_2.py
/home/dannc/code/learning/netology/src/homework/04-script/4.2/q1_3.py
/home/dannc/code/learning/netology/src/homework/04-script/4.2/q2.py
/home/dannc/code/learning/netology/src/homework/04-script/4.2/readme.md

Обязательная задача 3

  1. Доработать скрипт выше так, чтобы он мог проверять не только локальный репозиторий в текущей директории, а также умел воспринимать путь к репозиторию, который мы передаём как входной параметр. Мы точно знаем, что начальство коварное и будет проверять работу этого скрипта в директориях, которые не являются локальными репозиториями.

Ваш скрипт:

???

Вывод скрипта при запуске при тестировании:

???

Обязательная задача 4

  1. Наша команда разрабатывает несколько веб-сервисов, доступных по http. Мы точно знаем, что на их стенде нет никакой балансировки, кластеризации, за DNS прячется конкретный IP сервера, где установлен сервис. Проблема в том, что отдел, занимающийся нашей инфраструктурой очень часто меняет нам сервера, поэтому IP меняются примерно раз в неделю, при этом сервисы сохраняют за собой DNS имена. Это бы совсем никого не беспокоило, если бы несколько раз сервера не уезжали в такой сегмент сети нашей компании, который недоступен для разработчиков. Мы хотим написать скрипт, который опрашивает веб-сервисы, получает их IP, выводит информацию в стандартный вывод в виде: <URL сервиса> - <его IP>. Также, должна быть реализована возможность проверки текущего IP сервиса c его IP из предыдущей проверки. Если проверка будет провалена - оповестить об этом в стандартный вывод сообщением: [ERROR] <URL сервиса> IP mismatch: <старый IP> <Новый IP>. Будем считать, что наша разработка реализовала сервисы: drive.google.com, mail.google.com, google.com.

Ваш скрипт:

???

Вывод скрипта при запуске при тестировании:

???

Дополнительное задание (со звездочкой*) - необязательно к выполнению

Так получилось, что мы очень часто вносим правки в конфигурацию своей системы прямо на сервере. Но так как вся наша команда разработки держит файлы конфигурации в github и пользуется gitflow, то нам приходится каждый раз переносить архив с нашими изменениями с сервера на наш локальный компьютер, формировать новую ветку, коммитить в неё изменения, создавать pull request (PR) и только после выполнения Merge мы наконец можем официально подтвердить, что новая конфигурация применена. Мы хотим максимально автоматизировать всю цепочку действий. Для этого нам нужно написать скрипт, который будет в директории с локальным репозиторием обращаться по API к github, создавать PR для вливания текущей выбранной ветки в master с сообщением, которое мы вписываем в первый параметр при обращении к py-файлу (сообщение не может быть пустым). При желании, можно добавить к указанному функционалу создание новой ветки, commit и push в неё изменений конфигурации. С директорией локального репозитория можно делать всё, что угодно. Также, принимаем во внимание, что Merge Conflict у нас отсутствуют и их точно не будет при push, как в свою ветку, так и при слиянии в master. Важно получить конечный результат с созданным PR, в котором применяются наши изменения.

Ваш скрипт:

???

Вывод скрипта при запуске при тестировании:

???