Ansible je softverski alat čija je funkcija automatizacija procesa kao što su postavljanje, konfiguracija, upravljanje, instalacija, orkestracija softvera, kontejnera, servera i sličnih procesa rada. Radi se o projektu otvorenog koda (open-source), koji je besplatan za korištenje, i koji se održava doprinosima pojedinaca i cjelokupne open-source zajednice. Pisan je u Python programskom jeziku, a pokreće se naredbama u komandnom prozoru.
Ansible se može koristiti za automatizaciju procesa na Linux i Windows serverima (fizičkim, virtualnim, cloud instancama), desktop računalima, mrežnim uređajima, sustavima za pohranu podataka, kontejnerskim instancama, bazama, aplikacijama, IoT uređajima i slično.
Kako bismo automatizirali određene procese u menadžmentu Windows poslužitelja, u našem ćemo primjeru postaviti kontrolni node s Ansibleom i Windows poslužitelj kao upravljani node.
Instalacija Ansiblea
Ansible instaliramo na Linux poslužitelju. On će nam služiti kao upravljački poslužitelj.
apt update apt install software-properties-common add-apt-repository --yes --update ppa:ansible/ansible apt install ansible
Ansible se može instalirati i na Windows operativnom sustavu, ali isključivo u podsustavu za Linux (WSL), no službeno nije podržan i ne preporučuje se za produkcijska okruženja.
Instalacija ansible.windows kolekcije
Za svrhu upravljanja Windows hostovima, instaliramo kolekciju naziva ansible.windows
.
Općenito, Ansible kolekcija je skup playbooka, rola, modula ili plugina koji izvršavaju neku zajedničku zadaću. ansible.windows
sadrži razne module koji, na primjer, omogućavaju upravljanje korisničkim računima, njihovim pravima, pokretanjem naredbi, instalaciju raznih paketa i slične zadatke na hostovima s Windows operativnim sustavom.
Ansible kolekciju možemo instalirati s naredbom ansible-galaxy
, koja inače služi za upravljanje Ansible rolama i kolekcijama.
ansible-galaxy collection install ansible.windows
Prema defaultnoj konfiguraciji, ova naredba će koristiti Ansible Galaxy koji se nalazi na
https://galaxy.ansible.com/, a s kojeg će preuzeti kolekciju.
Ansible Galaxy je javni repozitorij rola i kolekcija koje se mogu preuzeti potpuno besplatno. Kako bi provjerili koje su sve kolekcije instalirane možemo pokrenuti naredbu:
ansible-galaxy collection list
Konfiguracija WinRM-a na Windows hostu
Kako bi Linux upravljački poslužitelj mogao komunicirati s Windows hostom, potrebno je podesiti Windows Remote Management (WinRM) ili Secure Shell (SSH) protokole.
WinRM i SSH su protokoli koji se koriste za udaljeni pristup i upravljanje računalima, odnosno poslužiteljima. Prvi je Microsoft native protokol, dok se drugi uglavnom koristi na Unix-based strojevima.
U podešavanju WinRM servisa može nam pomoći članak na sljedećoj poveznici
https://www.plus.hr/blog/2022/11/02/powershell-remoting-i-winrm/
Podešavanje firewalla
Pristup WinRM servisu s Ansible poslužitelja je potrebno dozvoliti u firewallu. Kod inicijalne konfiguracije WinRM-a, kreira se novi firewall rule koji otvara pristup svima, što iz sigurnosnih aspekata nije dobra praksa. Potrebno je izmijeniti pravilo koje dozvoljava pristup svima u ono koje limitira pristup na samo naš Linux poslužitelj, naročito ako je firewall na Windows hostu jedini firewall koji se koristi. Za to možemo koristiti sljedeće Powershell naredbe:
$IPs = @("xxx.xxx.xxx.xxx")
Umjesto xxx.xxx.xxx.xxx upisujemo IP adresu poslužitelja na kojem je instaliran Ansible.
Remove-NetFirewallRule -DisplayName "Windows Remote Management (HTTPS-In)" New-NetFirewallRule -DisplayName "Windows Remote Management (HTTPS-In)" -Direction Inbound -Protocol TCP -Action Allow -RemoteAddress $IPs -LocalPort 5986
Kreiranje certifikata za autentikaciju
Kreiramo self-signed certifikat koji ćemo koristiti za autentikaciju između Ansible servera i Windows hosta. Možemo ga generirati pomoću OpenSSL alata na Linux poslužitelju ili kroz Powershell na Windows hostu.
Za kreiranje certifikata na Linux poslužitelju koristimo sljedeće naredbe:
cat > openssl.conf << EOL distinguished_name = req_distinguished_name [req_distinguished_name] [v3_req_client] extendedKeyUsage = clientAuth subjectAltName = otherName:1.3.6.1.4.1.311.20.2.3;UTF8:$USER@localhost EOL
export OPENSSL_CONF=openssl.conf
export USER="ansible"
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -out ansible.pem -outform PEM -keyout ansible_key.pem -subj "/CN=$USER" -extensions v3_req_client
Certifikat možemo kreirati i na Windows hostu, ako pokrenemo sljedeće naredbe u Powershellu:
$params = @{ Type = 'Custom' Subject = 'CN=ansible' TextExtension = @( '2.5.29.37={text}1.3.6.1.5.5.7.3.2', '2.5.29.17={text}upn=ansible@localhost' ) KeyUsage = 'DigitalSignature' KeyAlgorithm = 'RSA' KeyLength = 2048 CertStoreLocation = 'Cert:\LocalMachine\My' } New-SelfSignedCertificate @params
Certifikat je potrebno uvesti u Windows certificate store na Windows hostu, i to certifikat izdavača u Trusted Root Certification Authorities store, a klijentski certifikat u Trusted People store. S obzirom da se ovdje radi o self-signed certifikatu, u oba storea uvozimo isti. Ako pretpostavimo da je datoteka sa certifikatom pohranjena na lokaciji C:\Certifikati, onda naredbe koje trebamo pokrenuti u Powershellu glase ovako:
$cert = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Certificate2("C:\Certifikati\ansible.pem") $store_name = [System.Security.Cryptography.X509Certificates.StoreName]::Root $store_location = [System.Security.Cryptography.X509Certificates.StoreLocation]::LocalMachine $store = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Store -ArgumentList $store_name, $store_location $store.Open("MaxAllowed") $store.Add($cert) $store.Close()
$cert = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Certificate2("C:\Certifikati\ansible.pem") $store_name = [System.Security.Cryptography.X509Certificates.StoreName]::TrustedPeople $store_location = [System.Security.Cryptography.X509Certificates.StoreLocation]::LocalMachine $store = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Store -ArgumentList $store_name, $store_location $store.Open("MaxAllowed") $store.Add($cert) $store.Close()
Kreiranje lokalnog korisnika i mapiranje certifikata
Sljedeći korak je da mapiramo uvezeni certifikat s lokalnim korisnikom na Windows hostu, no najprije ćemo tog korisnika i kreirati:
$credential = Get-Credential $password = $credential.Password $username = $credential.Username New-LocalUser -Name $username -Password $password -FullName "$username" -PasswordNeverExpires -UserMayNotChangePassword Add-LocalGroupMember -Group Administrators -Member $username
A zatim ćemo mapirati certifikat novokreiranom korisniku:
$thumbprint = (Get-ChildItem -Path cert:\LocalMachine\root | Where-Object { $_.Subject -eq "CN=$username" }).Thumbprint New-Item -Path WSMan:\localhost\ClientCertificate -Subject "$username@localhost" -URI * -Issuer $thumbprint -Credential $credential -Force
Trebamo imati na umu da u WinRM postavkama mora biti omogućena autentikacija putem certifikata. Ako nije, možemo je uključiti naredbom:
winrm set winrm/config/service/Auth '@{Certificate="true"}'
Dodatna provjera postavki WinRM servisa
Dobra praksa je provjeriti jesu li isključene manje sigurne postavke kao što je mogućnost nekriptirane komunikacije, mogućnost autentikacije lozinkom i slično. Naredba za izlistavanje konfiguracije servisa je:
winrm get winrm/config/Service
winrm set winrm/config/service '@{AllowUnencrypted="false"}' winrm set winrm/config/service/Auth '@{Basic="false"}'
Konfiguracija host varijabli
Na Linux poslužitelju je potrebno još konfigurirati host varijable koje će reći Ansibleu s kojim se parametrima spaja na Windows hosta.
ansible_connection: winrm ansible_winrm_scheme: https ansible_port: 5986 ansible_winrm_transport: certificate ansible_winrm_cert_pem: /etc/ansible/certs/ansible.pem ansible_winrm_cert_key_pem: /etc/ansible/certs/ansible_key.pem ansible_winrm_server_cert_validation: ignore
Postavka “ansible_winrm_server_cert_validation: ignore” je nužna kada koristimo self-signed certifikat, budući da nije moguće izvršiti njegovu validaciju.
Ove vrijednosti se spremaju u YAML formatu.
Test komunikacije
Kada smo dovršili cjelokupnu konfiguraciju, možemo provjeriti funkcionira li komunikacija između Ansiblea i Windows hosta ispravno. Za to ćemo koristiti win_ping
modul iz ansible.windows
kolekcije. Ovisno kako nam je podešen Ansible inventory (popis grupa i hostova) za test komunikacije pokrenemo neku od ovih naredbi:
ansible -m win_ping imeposlužitelja
ansible imeposlužitelja -i imegrupehosta -m win_ping
Sada možemo početi s pisanjem playbooka. Playbook je, kulinarskim rječnikom rečeno, recept. To je skupina naredbi i pripadajućih parametara, a zajedno čine cjelinu koja radi na izvršenju određenog zadatka. Tako recimo možete napisati playbook koji će odrađivati instalaciju Windows updatea, ili koji će u intervalima provjeravati je li na upravljanom računalu instalirana neka značajka, ili koji će pod određenim uvjetima ponovno pokrenuti neki servis, i slično.