Blog
Nowoczesne administrowanie, czyli Infrastruktura-jako-kod

Nowoczesne administrowanie, czyli Infrastruktura jako kod

Nie odkryjemy Ameryki je┼Ťli powiemy, ┼╝e im wi─Öksza infrastruktura IT, tym wi─Öksze wyzwania w zarz─ůdzaniu ni─ů. S─ů jednak sposoby uproszczenia pracy┬áwarte zg┼é─Öbienia. Je┼Ťli mia┼ée┼Ť ju┼╝ do czynienia z du┼╝ymi infrastrukturami, to zapewne s┼éysza┼ée┼Ť o poj─Öciu DevOps, kt├│rego cz─Ö┼Ťci─ů┬ájest w┼éa┼Ťnie poj─Öcie Infrastruktury-jako-kodu.

W metodyce pracy DevOps (z j─Öz. ang. Development and Operations, wi─Öcej na ten temat mo┼╝esz poczyta─ç tutaj) chodzi o uproszczenie proces├│w zwi─ůzanych z zarz─ůdzaniem infrastruktur─ů IT poprzez jej automatyzacj─Ö.

Zacznijmy jednak od tego

Czym jest Infrastruktura jako kod?

M├│wi─ůc najpro┼Ťciej, Infrastruktura jako kod (z j─Öz. ang. Infrastructure as code, programmable infrastructure) to pisanie skrypt├│w lub aplikacji wspomagaj─ůcych proces konfiguracji infrastruktury, zamiast ka┼╝dorazowego dokonywania wszystkich ustawie┼ä manualnie. Oznacza to napisanie kodu (za pomoc─ů j─Özyk├│w wysokiego poziomu lub ka┼╝dego j─Özyka deklaratywnego) do zarz─ůdzania konfiguracjami, oraz zautomatyzowania przygotowania infrastruktury.

Ale rzecz jest nie tylko w skryptach. Wiedzia┼ée┼Ť, ┼╝e mo┼╝na w pe┼éni uwzgl─Ödni─ç proces konfiguracji infrastruktury w kodzie Twoich aplikacji? Nie nale┼╝y jednak myli─ç Infrastruktury-jako-kodu z automatyzacj─ů infrastruktury, kt├│ra polega tylko na wielokrotnym replikowaniu krok├│w oraz powtarzaniu tego procesu na innych serwerach.

Narz─Ödzia

Pracuj─ůc metod─ů Infrastruktury-jako-kodu u┼╝ywamy narz─Ödzi, kt├│re s─ů szerzej wykorzystywane w podej┼Ťciu DevOps, na przyk┼éad:

  • Vagrant
  • Ansible
  • Docker
  • Chef
  • oraz Puppet.

Dr├│g do osi─ůgni─Öcia oczekiwanego rezultatu jest wiele – mo┼╝na wybra─ç jedno narz─Ödzie, mo┼╝na┬ár├│wnie┼╝ je ┼é─ůczy─ç. Daje to mo┼╝liwo┼Ť─ç zautomatyzowania w zasadzie wszystkiego, co mo┼╝na zrobi─ç r─Öcznie, a co jest zwi─ůzane z warstw─ů infrastruktury oraz warstw─ů systemu operacyjnego. Nawet je┼Ťli infrastruktura ju┼╝ istnieje, to mo┼╝na wykorzysta─ç te narz─Ödzia do uruchomienia jeszcze wi─Ökszej ilo┼Ťci skrypt├│w, nawet plik├│w BAT.

Programowanie nie tylko w r─Ökach programist├│w


Konfigurowaniem za pomoc─ů Infrastruktury-jako-kodu mo┼╝e zaj─ů─ç si─Ö administrator, ale tak┼╝e programista. To do┼Ť─ç istotna r├│┼╝nica w por├│wnaniu do tradycyjnego, manualnego podej┼Ťcia, gdzie konfiguracj─Ö wykonywali tylko administratorzy. W obecnych czasach infrastruktura mo┼╝e by─ç budowana i zarz─ůdzana przez programist├│w oraz tester├│w.

W przypadku programowania webowego, coraz cz─Ö┼Ťciej mamy do czynienia z programistami, kt├│rzy buduj─ů takie rzeczy jak deploy.php. Tworz─ů w ten spos├│b infrastruktur─Ö, na kt├│rej b─Ödzie dzia┼éa┼éa ca┼éa aplikacja. Pisanie skryptu zaczyna si─Ö tu od stworzenia maszyn wirtualnych, a ko┼äczy si─Ö na pull request z repozytorium ┼║r├│d┼éa.

Zalety

Jakie korzy┼Ťci przynosi zarz─ůdzanie Infrastruktur─ů jako kodem? Jest ich kilka i to znacz─ůcych:

  • ÔÇô oszcz─Ödza czas,
  • pozwala na powtarzalno┼Ť─ç zada┼ä. Wdro┼╝enia mog─ů by─ç czym┼Ť wi─Öcej, ni┼╝ tylko kopiowaniem zasob├│w i uruchamianiem kodu. Mog─ů te┼╝ by─ç infrastruktur─ů. Do ka┼╝dego wdro┼╝enia powstaje nowy zestaw infrastruktury, na kt├│rej uruchamiany jest kod. Dzi─Öki temu unikniemy zanieczyszcze┼ä i tak znanego wszystkim zjawiska – ÔÇ×dziwne, u mnie dzia┼éaÔÇŁ,
  • skrypty mog─ů pos┼éu┼╝y─ç tak┼╝e jako dokumentacja dla aplikacji infrastruktury, co oznacza ┼╝e inne osoby te┼╝ b─Öd─ů mog┼éy korzysta─ç z owoc├│w twojej pracy,
  • mamy plan dla przysz┼éych wdro┼╝e┼ä. Poprzez fakt, ┼╝e wszystkie dzia┼éania s─ů inicjowane przez skrypty – mamy konkretny punkt, od kt├│rego zawsze mo┼╝emy zacz─ů─ç. Je┼Ťli skrypty s─ů prawid┼éowo napisane, mo┼╝na je uruchomi─ç wsz─Ödzie: w chmurze prywatnej, publicznej, hybrydowej, na w┼éasnym serwerze – nie ma to znaczenia. Przyk┼éadowo: je┼Ťli mamy kilka projekt├│w o r├│┼╝nym przeznaczeniu, to mo┼╝emy je uruchomi─ç w konkretnych chmurach. Je┼Ťli jest taka potrzeba, to tworzymy zintegrowan─ů chmur─Ö testowania, kt├│ra jest oddzielona od chmury produkcyjnej, a ta z kolei jest oddzielona od chmury przeznaczonej do beta testowania,
  • u┼éatwia komunikacj─Ö. Nie jest to zasadniczy aspekt, ale pozwala niekiedy zaoszcz─Ödzi─ç du┼╝o czasu i frustracji. Konfigurowanie za pomoc─ů Infrastruktury-jako-kodu daje nam mo┼╝liwo┼Ť─ç przekazania informacji na temat kompletnych wdro┼╝e┼ä, kodu oraz infrastruktury, zamiast przesy┼éania trudnych do rozszyfrowania zrzut├│w ekranu oraz opis├│w bug├│w,
  • rejestrowanie zmian. Dzi─Öki zastosowaniu kontroli wersji w kodzie infrastruktury, mo┼╝na w ┼éatwy spos├│b ┼Ťledzi─ç wszystkie zmiany kt├│re zasz┼éy w naszym ┼Ťrodowisku. U┼éatwia to przegl─ůdanie zmian konfiguracji i dotarcie do ostatniej dzia┼éaj─ůcej wersji, w razie gdyby wyst─ůpi┼é jaki┼Ť problem,
  • Linux. Wszystkie te mo┼╝liwo┼Ťci s─ů dost─Öpne na infrastrukturze linuksowej.

Przykład

Mo┼╝emy dokona─ç takiej oto automatyzacji za pomoc─ů Ansible . Mo┼╝emy zainstalowa─ç mysql-server na zdalnej maszynie (serwerze), co zapewnia ┼╝e mysql dzia┼éa, tworzy u┼╝ytkownika z has┼éem, usuwa testow─ů baz─Ö danych, tworzy baz─Ö danych ansible_example, kopiuje sql dump na maszyn─Ö i przywraca j─ů do bazy danych ansible_example. Przyk┼éadowy kod, kt├│ry to wykona:

---

- name: Installing MySQL
  yum: name=mysql-server state=latest

- name: Starting MySQL
  service: name=mysqld state=started enabled=yes

- name: Delete anonymous MySQL server user for localhost
  action: mysql_user user="" state="absent"

- name: Delete anonymous MySQL server user
  mysql_user: name='' host={{ item }} state=absent
  with_items:
    - "{{ ansible_hostname }}"
    - "{{ inventory_hostname }}"
    - 127.0.0.1
    - ::1
    - localhost

- name: Remove the MySQL test database
  action: mysql_db db=test state=absent

- name: Change root user password on first run
  mysql_user: login_user="root"
              login_password=""
              name="root"
              password="{{ mysql_root_passwd }}"
              priv=*.*:ALL,GRANT
              host={{ item }}
  with_items:
    - "{{ ansible_hostname }}"
    - 127.0.0.1
    - ::1
    - localhost

- name: Create my.cnf file with root passwd credentials
  template: src=my.cnf.j2 dest=/root/.my.cnf owner=root group=root mode=0600

- name: Configuring MySQL
  copy: src=my.cnf dest=/etc/my.cnf
  notify: restart_mysqld

Wszystkie te dzia┼éania wykonywane s─ů automatycznie, kiedy uruchamiamy nasz playbook. Nie wa┼╝ne ile razy by┼Ťmy go uruchamiali, je┼Ťli wymagane zadanie zosta┼éo ju┼╝ wykonane na maszynie, to nie b─Ödzie ono ponownie wykonane. Innymi s┼éowy – ten skrypt dba o to, by maszyna ca┼éy czas znajdowa┼éa si─Ö w po┼╝─ůdanym przez nas stanie.

Wyzwania

Ka┼╝dy kij ma dwa ko┼äce. Oto kilka frapuj─ůcych kwestii:

  • ÔÇô co zrobi─ç, je┼Ťli mamy do czynienia z wielowarstwowymi aplikacjami?
  • jak doda─ç komponent sieci i bezpiecze┼ästwa nie prze┼╝ywaj─ůc przy tym prawdziwego koszmaru? Programi┼Ťci staraj─ů si─Ö obej┼Ť─ç ten problem zajmuj─ůc si─Ö tymi kwestiami w innym miejscu,
  • trzeba wcze┼Ťniej zaplanowa─ç infrastruktur─Ö, aby w┼éa┼Ťciwie dobra─ç narz─Ödzia,
  • dob├│r narz─Ödzi. Jest ich wiele i ka┼╝de posiada bogate funkcjonalno┼Ťci. A to wymaga nauki, cz─Östo specjalizacji, co w niekt├│rych przypadkach mo┼╝e by─ç barier─ů nie do przej┼Ťcia,
  • jak zaplanowa─ç dzia┼éania, je┼Ťli wszystkie aplikacje s─ů PaaS albo s─ů kombinacj─ů PaaS i infrastruktury (czy to w chmurze, czy na serwerze znajduj─ůcym si─Ö miejscu). W takim przypadku trudniej jest stworzy─ç jeden skrypt obejmuj─ůcy je wszystkie.Trzeba rozwa┼╝y─ç napisanie kilku oddzielnych skrypt├│w,
  • ┼║le przeprowadzana konfiguracja – mo┼╝e zosta─ç powielona na wszystkich serwerach,
  • sytuacja kiedy zmiany konfiguracji serwera s─ů wprowadzane tylko na maszynie (na przyk┼éad: poprzez szybkie poprawki, bez wprowadzania zmian do oryginalnego szablonu), konfiguracja serwera r├│┼╝ni si─Ö od konfiguracji szablonu. I to si─Ö mo┼╝e cz─Östo zdarza─ç, je┼Ťli od razu nie narzucimy sobie dyscypliny w tym zakresie.

Mimo ┼╝e Infrastruktura jako kod nie jest jeszcze idealn─ů metod─ů pracy, to ca┼éy czas jest dynamicznie rozwijana i zdecydowanie warto jej spr├│bowa─ç. Bior─ůc pod uwag─Ö obecne tempo ewolucji tego tematu w ci─ůgu najbli┼╝szego roku, mo┼╝e dw├│ch –┬ánale┼╝y spodziewa─ç si─Ö dalszych znacz─ůcych zmian id─ůcych w kierunku u┼éatwienia korzystania z niej. Ba, stanie si─Ö ona na tyle popularna, ┼╝e dziwi─ç b─Ödzie przestarza┼éa forma manualnej konfiguracji. Na co wi─Öc czeka─ç?

Dodaj komentarz!