\chapter{Automatizace konfigurace}

Konfigurační management, jakožto obor systémového inženýrství, byl vyvinut již v~50. letech 20. století ministerstvem obrany Spojených států. Sloužil jako metoda pro sledování změn v~komplexních systémech jako jsou zbraňové systémy nebo vojenská vozidla. Každá změna v~systému musela být zaznamenána včetně dokumentace, která uváděla, kdo změnu provedl a z~jakého důvodu. Cílem bylo zajistit, že stav systému bude v~kterémkoli okamžiku známý a zpětně dohledatelný. Stejná praxe byla aplikována i na počítačové systémy. Původně se dokumentovaly změny provedené v~čase. Nové softwarové nástroje umožnily přejít od dokumentace provedených změn k~definování požadovaného stavu systému. \citep{HeapAnsible}

S~narůstajícím využíváním virtualizace, kontejnerizace a komplexností počítačových systémů, tedy s~narůstajícím počtem zařízení vyžadující určitou konfiguraci implementovaly tyto nástroje i automatizaci konfigurace spravované infrastruktury. Tento přístup se nazývá \textbf{Infrastructure as Code} (IaC), tedy infrastruktura jako kód. V~tomto modelu je požadovaná konfigurace infrastruktury zapsána ve strojově čitelném formátu v~souboru, podle kterého následně softwarové nástroje automaticky konfigurují jednotlivé prvky infrastruktury.
Díky zápisu požadované konfigurace se eliminuje lidská chyba při konfiguraci více zařízení a zvýší se homogennost konfigurace napříč infrastrukturou. S~použitím verzovacího systému lze umožnit verzování infrastruktury, týmovou spolupráci nad konfigurací s~důrazem na auditovatelnost konfigurace a dohledatelnost historických změn. Toto zvyšuje bezpečnost.
Automatizace konfigurace rozsáhlé infrastruktury zvýší efektivitu, ušetří čas a umožní snadnou škálovatelnost. \citep{leanDeliveryIaC}

\pagebreak

Existuje několik známých open-source nástrojů pro správu infrastruktury jako kódu, každý se svými specifiky a způsob správy. Mezi nejpoužívanější opensource nástroje patří \textbf{Ansible\footnote{\url{https://www.ansible.com/}}}, \textbf{Chef\footnote{\url{https://www.chef.io/}}}, \textbf{Puppet\footnote{\url{https://www.puppet.com/}}} a \textbf{SaltStack\footnote{\url{https://saltproject.io/}}} \citep[p.~841]{Nemeth_Evi_2018}.

\begin{longtable}[c]{|p{3.5cm}|p{2.5cm}|p{2.5cm}|p{2.5cm}|p{2.5cm}|}
\caption{Nástroje pro automatizaci správy infrastruktury}

\label{tab:DevOpsTools}\\
\hline
\multicolumn{1}{|c|}{} &
\multicolumn{1}{c|}{\textbf{Ansible}} &
\multicolumn{1}{c|}{\textbf{Chef}} &
\multicolumn{1}{c|}{\textbf{Puppet}} &
\multicolumn{1}{c|}{\textbf{SaltStack}} \\ \hline
\endfirsthead
%
\endhead
%
Programovací jazyk nástroje & Python                                                                    & Ruby          & C++, Clojure             & Python        \\ \hline
Jazyk pro konfiguraci       & YAML, JSON                                                                & Ruby          & Vlastní jazyk            & YAML          \\ \hline
Způsob zápisu konfigurace   & Procedurální/Deklarativní                                                 & Procedurální  & Deklarativní             & Deklarativní  \\ \hline
Architektura                & Agentless\footnote{nevyžaduje speciální software na spravovaném zařízení} & Server/client & Server/client, Agentless\footnote{\url{https://www.puppet.com/community/open-source/bolt}} & Server/client, Agentless\footnote{\url{https://docs.saltproject.io/salt/user-guide/en/latest/topics/salt-ssh.html}} \\ \hline
Model získání konfigurace   & Push\footnote{konfigurace je na zařízení zaslána}                         & Pull\footnote{zařízení stahuje konfiguraci ze serveru}          & Pull / Push              & Push          \\ \hline
Způsob přenosu konfigurace  & SSH                                                                       & HTTP(S)       & MCollective, HTTPS       & ZeroMQ        \\ \hline

\end{longtable}

\section{Přístupy k~zápisu konfigurace}

Existují dvě základní paradigmata zápisu konfigurace.

\textbf{Imperativní (procedurální)} zápis definuje jednotlivé kroky, které mají být provedeny v~přesném pořadí, pro dosažení požadovaného stavu infrastruktury.

\textbf{Deklarativní} zápis popisuje požadovaný stav infrastruktury, tedy jaký má být cílený stav. Jedná se deklarativní abstrakci kdy dosažení cílové konfigurace je implementovány imperativně. Nástroj pro automatizaci konfigurace vyhodnotí aktuální stav a provede pouze nezbytné kroky k~dosažení cílového stavu.