mirror of
https://github.com/Dannecron/netology-devops.git
synced 2025-12-25 23:32:37 +03:00
homework 4.2: add question 4
This commit is contained in:
1
src/homework/04-script/4.2/.gitignore
vendored
Normal file
1
src/homework/04-script/4.2/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
hosts.json
|
||||||
40
src/homework/04-script/4.2/q4.py
Executable file
40
src/homework/04-script/4.2/q4.py
Executable file
@@ -0,0 +1,40 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import json
|
||||||
|
import io
|
||||||
|
import socket
|
||||||
|
|
||||||
|
filename = 'hosts.json'
|
||||||
|
|
||||||
|
hostsList = {
|
||||||
|
"drive.google.com",
|
||||||
|
"mail.google.com",
|
||||||
|
"google.com"
|
||||||
|
}
|
||||||
|
|
||||||
|
with open(filename, 'r+') as file:
|
||||||
|
jsonStr = file.read()
|
||||||
|
try:
|
||||||
|
jsonObj = json.load(io.StringIO(jsonStr))
|
||||||
|
except BaseException as err:
|
||||||
|
jsonObj = dict({})
|
||||||
|
print('error {}'.format(err))
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
file.truncate(0)
|
||||||
|
file.seek(0)
|
||||||
|
|
||||||
|
for hostname in hostsList:
|
||||||
|
ipAddr = socket.gethostbyname(hostname)
|
||||||
|
prevIpAddr = jsonObj.get(hostname)
|
||||||
|
|
||||||
|
if prevIpAddr is None or prevIpAddr == '':
|
||||||
|
prevIpAddr = ipAddr
|
||||||
|
|
||||||
|
print('{} - {}'.format(hostname, ipAddr))
|
||||||
|
if ipAddr != prevIpAddr:
|
||||||
|
print('[ERROR] {} IP mismatch: {} {}'.format(hostname, ipAddr, prevIpAddr))
|
||||||
|
|
||||||
|
jsonObj[hostname] = ipAddr
|
||||||
|
|
||||||
|
file.write(json.dumps(jsonObj))
|
||||||
@@ -128,38 +128,79 @@ for result in result_os.split('\n'):
|
|||||||
```
|
```
|
||||||
|
|
||||||
### Обязательная задача 4
|
### Обязательная задача 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`.
|
Наша команда разрабатывает несколько веб-сервисов, доступных по 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`.
|
||||||
|
|
||||||
#### Ваш скрипт:
|
#### Ваш скрипт:
|
||||||
|
|
||||||
|
[script](./q4.py)
|
||||||
|
|
||||||
```python
|
```python
|
||||||
???
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import json
|
||||||
|
import io
|
||||||
|
import socket
|
||||||
|
|
||||||
|
filename = 'hosts.json'
|
||||||
|
|
||||||
|
hostsList = {
|
||||||
|
"drive.google.com",
|
||||||
|
"mail.google.com",
|
||||||
|
"google.com"
|
||||||
|
}
|
||||||
|
|
||||||
|
with open(filename, 'r+') as file:
|
||||||
|
jsonStr = file.read()
|
||||||
|
try:
|
||||||
|
jsonObj = json.load(io.StringIO(jsonStr))
|
||||||
|
except BaseException as err:
|
||||||
|
jsonObj = dict({})
|
||||||
|
print('error {}'.format(err))
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
file.truncate(0)
|
||||||
|
file.seek(0)
|
||||||
|
|
||||||
|
for hostname in hostsList:
|
||||||
|
ipAddr = socket.gethostbyname(hostname)
|
||||||
|
prevIpAddr = jsonObj.get(hostname)
|
||||||
|
|
||||||
|
if prevIpAddr is None or prevIpAddr == '':
|
||||||
|
prevIpAddr = ipAddr
|
||||||
|
|
||||||
|
print('{} - {}'.format(hostname, ipAddr))
|
||||||
|
if ipAddr != prevIpAddr:
|
||||||
|
print('[ERROR] {} IP mismatch: {} {}'.format(hostname, ipAddr, prevIpAddr))
|
||||||
|
|
||||||
|
jsonObj[hostname] = ipAddr
|
||||||
|
|
||||||
|
file.write(json.dumps(jsonObj))
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Вывод скрипта при запуске при тестировании:
|
#### Вывод скрипта при запуске при тестировании:
|
||||||
```
|
|
||||||
???
|
Предположим, что в какой-то момент времени были следующие значения ip-адресов серверов:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{"drive.google.com": "173.194.221.194", "mail.google.com": "142.251.1.18", "google.com": "64.233.162.139"}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Дополнительное задание (со звездочкой*) - необязательно к выполнению
|
Тогда запуск команды будет выглядеть следующим образом:
|
||||||
|
|
||||||
Так получилось, что мы очень часто вносим правки в конфигурацию своей системы прямо на сервере.
|
|
||||||
Но так как вся наша команда разработки держит файлы конфигурации в github и пользуется gitflow,
|
|
||||||
то нам приходится каждый раз переносить архив с нашими изменениями с сервера на наш локальный компьютер,
|
|
||||||
формировать новую ветку, коммитить в неё изменения, создавать pull request (PR) и только после выполнения Merge мы наконец можем официально подтвердить,
|
|
||||||
что новая конфигурация применена. Мы хотим максимально автоматизировать всю цепочку действий.
|
|
||||||
Для этого нам нужно написать скрипт, который будет в директории с локальным репозиторием обращаться по API к github,
|
|
||||||
создавать PR для вливания текущей выбранной ветки в master с сообщением, которое мы вписываем в первый параметр при обращении к py-файлу (сообщение не может быть пустым).
|
|
||||||
При желании, можно добавить к указанному функционалу создание новой ветки, commit и push в неё изменений конфигурации.
|
|
||||||
С директорией локального репозитория можно делать всё, что угодно.
|
|
||||||
Также, принимаем во внимание, что Merge Conflict у нас отсутствуют и их точно не будет при push, как в свою ветку, так и при слиянии в master.
|
|
||||||
Важно получить конечный результат с созданным PR, в котором применяются наши изменения.
|
|
||||||
|
|
||||||
#### Ваш скрипт:
|
|
||||||
```python
|
|
||||||
???
|
|
||||||
```
|
```
|
||||||
|
./q4.py
|
||||||
#### Вывод скрипта при запуске при тестировании:
|
mail.google.com - 173.194.221.17
|
||||||
|
[ERROR] mail.google.com IP mismatch: 173.194.221.17 142.251.1.18
|
||||||
|
google.com - 64.233.162.100
|
||||||
|
[ERROR] google.com IP mismatch: 64.233.162.100 64.233.162.139
|
||||||
|
drive.google.com - 173.194.221.194
|
||||||
```
|
```
|
||||||
???
|
|
||||||
```
|
|
||||||
Reference in New Issue
Block a user