Skip to content

Instantly share code, notes, and snippets.

@wojciechpuchta
Last active April 5, 2021 09:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save wojciechpuchta/8fda8d448967f811b5cfa2653ac6c093 to your computer and use it in GitHub Desktop.
Save wojciechpuchta/8fda8d448967f811b5cfa2653ac6c093 to your computer and use it in GitHub Desktop.
DevOps / SRE Regular

1. Ansible

Popraw wszystkie błędy w pliku date-flag-playbook.yml (poniżej). Jak uruchomić ten plik? (napisz komendę w bash):

---
- host: localhost
  task:
    - name: create date_flagg file
      lineifile:
         creates: yes
       lines: "{{ ansible_date_time.date }}"
dests: /tmp/date_flag

2. bash

  • a) przeiteruj przez linie w pliku ./ttt i wykonaj na każdej z nich polecenie echo
  • b) ustaw limit otwartych plików na 1024 w obecnej sesji logowania
  • c) Popraw wszystkie błędy w poniższym wywołaniu:
DOCKER_FLAGS="-ti ubuntu:latest cat /etc/resolf.conv"
docker runn "${DOCKER_FLAGS}"

3. networking

Rozważ architekturę, w której na serwerze app01.local uruchomiony jest Apache Tomcat, który na porcie 8080 wystawia aplikację webową "X". Maszyna app01.local nie ma dostępu do Internetu, ale posiada serwer ssh (port 2222). Firewall blokuje wszystkie połączenia przychodzące do app01.local oprócz połączeń z serwera jump.local skierowanych na port 2222. W jaki sposób otworzysz aplikację "X" w przeglądarce na swoim laptopie biorąc pod uwagę fakt, że możesz połączyć się do root@jump.local za pomocą ssh, a użytkownik root z jump.local ma dodany klucz ssh na app01.local?

4. CI/CD

Napisz plik .gitlab-ci.yml lub bitbucket-pipelines.yml, który wykorzystywałby Mavena do zbudowania kodu i wysłania paczki war do Artifactory, zakładając, że pom.xml jest odpowiednio skonfigurowany. Opcjonalnie, jeśli nie jesteś zaznajomiony z Mavenem może to być Gradle i Artifactory, albo nawet Python i PyPi lub Composer i Satis.

5. Architektura

Zaprojektuj infrastrukturę dla aplikacji webowej na AWS lub Azure, biorąc pod uwagę następujące warunki:

  • frontend to aplikacja SPA w Angular
  • bakcend to REST API w Python uruchomione na dockerze
  • backend musi być samo-skalowalny, zależnie od liczby odwiedzających
  • aplikacja korzysta z bazy danych Mysql
  • aplikacja korzysta z Redis do zarządzania sesją
  • aplikacja posiada funkcjonalność uploadowania plików przez użytkowników. Pliki te muszą być następnie dostępne dla serwerów backendowych

Forma odpowiedzi dowolna.

@aragorn001
Copy link

aragorn001 commented Dec 14, 2020

1. Ansible (Adam Brzyski)

Poprawiony playbook w ansible:

---
  - name: "run on localhost"
    hosts: localhost
    connection: local
    tasks:
    - name: "ensure file /tmp/date_flag exists"
      file:
        path: /tmp/date_flag
        state: touch
        mode: u+rw,g-wx,o-rwx
        modification_time: preserve
        access_time: preserve
    - name: "create date_flagg file"
      lineinfile:
        line: '{{ ansible_date_time.date }}'
        path: /tmp/date_flag
        insertbefore: BOF

Poprawione błędy w formatowaniu. Dodane touch na wypadek gdyby plik nie istniał. Należy dodać jeszcze plik hosts jak poniżej, w innym wypadku będziemy mieli:

[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'

Po dodaniu pliku hosts:

[all]
localhost

Uruchamiamy w bash tak:

ansible-playbook  date-flag-playbook.yml -i hosts --limit localhost

Opcjonalnie można najpierw uruchomić tak i sprawdzić co się zmieni (tu mogą pojawić się błędy jeśli plik '/tmp/date_flag' nie istnieje):

ansible-playbook  date-flag-playbook.yml -i hosts --limit localhost --check --diff

Dodałbym jeszcze tags i wtedy należy uruchamiać z dodaniem --tags <tags>

@aragorn001
Copy link

aragorn001 commented Dec 14, 2020

2. bash - Adam Brzyski

a) while read p ;do echo ${p};done <./ttt
b) ulimit -n 1000
c) poprawione wywołanie z literówką runn, należy podawać env variables przez -e,

export DOCKER_FLAGS="-ti ubuntu:latest cat /etc/resolf.conv"
docker run -e ${DOCKER_FLAGS}

@aragorn001
Copy link

aragorn001 commented Dec 14, 2020

3. networking - Adam Brzyski

me.local -> jump.local -> app01.local

Należy wykonać port forwarding (local -L) używając ssh w dwóch krokach:

  1. z hosta jump.local jako root na port 2222 na app01.local:
jump.local$ ssh -L 8080:localhost:8080 root@app01.local -p 2222
  1. z me.local na jump.local:
me.local$ ssh -L 8080:localhost:8080 root@jump.local

A następnie u siebie otwieramy przeglądarkę z adresem: http://localhost:8080

@aragorn001
Copy link

aragorn001 commented Dec 14, 2020

5. Architektura - Adam Brzyski

Dziękuję za interesujące zadanie.

Proponowane rozwiązanie w AWS z opcją multi AZ (Availability Zones) w production i uproszczoną infrastrukturę jako DR w innym regionie.

  • Route 53 (DNS) - w przypadku failover przekierowanie do DR
  • ELB Elastic Load Balancer (w multi AZ konfiguracji)
  • EC2 jako frontend (minimum 2 w różnych AZ)
  • ECS jako samo-skalowalny backend (Elastic Container Service) w 2 AZ
  • ECR (Elastic Docker Container Registry) miejsce na docker images
  • Elastic Cache with Redis do zarządzania sesją, replikowany pomiędzy AZ
  • S3 bucket do przechowywania załadowanych plików i udostępnienie ich dla backend (możliwa replikacja do DR)
  • RDS - MySQL jako DB z replikacją to drugiego AZ i do DR

Dodałem Amazon CloudWatch do monitorowania i ewentualnego komunikowania się z Lambda i funkcjami skalowania.

Jeżeli jest konieczność i możliwość to VPN Gateway do połączenia przez VPN do zarządzania.

Można zastąpić EC2 przez rozszerzenie serwisu ECS, gdzie frontend i backend może być na dockerze.

Jeśli są zasoby IT (DevOPS) to można część frontend/backed zrobić na EKS Managed Kubernetes, lub ustawić swój własny kubernetes cluster między dwoma AZ.

Ważnym aspektem będzie zestawienie cenowe serwisów pomiędzy managed/self-managed.

@aragorn001
Copy link

aragorn001 commented Dec 14, 2020

Diagram - Adam Brzyski

AWS-architecture-design1

@aragorn001
Copy link

aragorn001 commented Dec 14, 2020

4. CI/CD - Adam Brzyski

Tutaj mam pewnego rodzaju problem, nie mam środowiska do przetestowania takiej konfiguracji i bazuje to tylko na teoretycznym skonfigurowaniu/rozważaniu.

Zakładamy, że potrzeba skonfigurować .m2/settings.xml dla Artifactory, skonfigurować też variables w gitlab: MAVEN_CLI_OPTS, MAVEN_OPTS, MAVEN_REPO_URL, MAVEN_REPO_USER, MAVEN_REPO_PASS, paczka war jest przeznaczona na apache/tomcat serwer i użytkownik jest skonfigurowany do restartowania tomcat'a

.gitlab-ci.yml

image: maven:latest
 
variables:
  MAVEN_CLI_OPTS: "-s .m2/settings.xml --batch-mode"
  MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"
 
buildAndTest:
    script:
      - mvn verify
    artifacts:
      paths:
        - target/*
      expire_in: 10min
 
autoDeploy:
  stage: deploy
  script:
    - mvn package
    - mv target/*.war file.war
    - ssh user@server 'sudo service tomcat stop'
    - scp file.war user@server:/opt/<path>
    - ssh user@server 'sudo service tomcat start'
  artifacts:
    paths:
      - *.war
    expire_in: 14d
  only:
    - tags

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment