Upravljanje Windows hostovima uz Ansible

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

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

Ansible OpenSSL kreiranje certifikata

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

Ansible kreiranje certifikata

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

Ansible winrm

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.

Povezani članci

Odgovori