Automatizovaná správa systémov

Dominik Rehák, xrehak2@fi.muni.cz

Prečo?

Nástroje

CFEngine

Ukážka 1: konfigurácia CFEngine (vytvorenie lokálnych uživateľov)

body common control
{
  inputs => { "$(sys.libdir)/stdlib.cf" };
}

bundle agent main
{
  vars:
  "users" slist => { "adam", "eva" };
  users:
    "$(users)"
    policy => "present",
    home_dir => "/home/$(users)",
    group_primary => "users",
    groups_secondary => { "security", "webadmin" },
    shell => "/bin/bash/",
    home_bundle => setup_home_dir("$(users)");
}

bundle agent setup_home_dir(user)
{
  vars:
    "keys" slist => { "id_rsa", "id_rsa.pub" };
  files:
    "/home/$(user)/." create => "true";
    "/home/$(user)/.ssh/." create => "true";
    "/home/$(user)/.ssh/$(keys)" copy_from => local_cp("/tmp/$(keys)");
}

synctool

Puppet

Ukážka 2: konfigurácia Puppet (pravidlá pre firewall)

class my_firewall::pre {
  Firewall {
    require => undef,
  }
     firewall { '000 accept all icmp':
       proto  => 'icmp',
       action => 'accept',
     }
     firewall { '001 accept all to lo interface':
       proto   => 'all',
       iniface => 'lo',
       action  => 'accept',
     }
     firewall { '002 reject local traffic not on loopback interface':
       iniface     => '! lo',
       proto       => 'all',
       destination => '127.0.0.1/8',
       action      => 'reject',
     }
     firewall { '003 accept related established rules':
       proto  => 'all',
       state  => ['RELATED', 'ESTABLISHED'],
       action => 'accept',
     }
   }

Chef

Ansible

Proprietárne nástroje

Ansible (detailne)

Štruktúra

Najčastejšie príkazy

ansible(1) - spustí jeden task na zadaných systémoch

ansible-playbook(1) - spustí playbook na zadaných systémoch

ansible-galaxy(1) - spravuje lokálne kolekcie

Ukážka 3: inventár Ansiblu, formát YAML (/etc/ansible/hosts)

all:  # implicitná skupina, nie je nutné ju definovať
  children:  # definuje podskupiny v skupine
    redhat:
      hosts:  # definuje systémy v skupine
        199.19.225.75:  # IP / FQDN
        209.141.43.37:  # každá položka musí byť slovník - ak treba, aj prázdny (':' na konci)
    debian:
      hosts:
        debian1:  # alias pre IP adresu - môžeme ním v rámci Ansiblu adresovať stroj
          ansible_host: 205.185.115.4
        debian2:
          ansible_host: 205.185.116.236

Ukážka 4: playbook pre uvedený inventár (playbook.yml)

- name: Prologue  # názov "playu" - jednej sekvencie taskov v playbooku
  hosts: all
  tasks:
  - name: Greet  # názov tasku
    command: echo ahoj :)  # modul, ktorý sa spustí a jeho argumenty
  # command v playbookoch sám o sebe nevypíše nič
  # ak nutne potrebujeme vidieť výstup, je treba uložiť si ho do premennej...
  - name: Get the time
    command: date
    register: date
  # ...a z tej vybrať štandartný výstup a vypísať ho modulom "debug"
  - name: Tell the time
    debug:
      var: date.stdout

- name: RedHat
  hosts: redhat  # spustí play iba na systémoch v skupine "redhat"
  tasks:
  - name: Update all packages
    dnf:
      name: "*"  # ekvivalent `dnf -y update`
      state: latest
  - name: Ensure EPEL is installed
    dnf:
      name: epel-release
      state: present  # ak balík nie je nainštalovaný, pokúsi sa ho nainštalovať

- name: Debian
  hosts: debian
  tasks:
  - name: Update all packages
    apt:
      update_cache: yes  # nie je default
      name: "*"  # ekvivalent `apt-get update`
      state: latest

- name: Services
  hosts: all
  tasks:
  - name: Ensure cups is installed
  # package je všeobecný wrapper nad špecializovanejšími modulmi (apt, dnf, pacman...)
  # v porovnaní s nimi vie oveľa menej, prakticky len nainštalovať/odstrániť balíky
    package:
      name: cups
      state: present  # ak balík nie je nainštalovaný, pokúsi sa ho nainštalovať
  - name: Ensure cups is running
    systemd:
      name: cups
      state: started

Použité zdroje a užitočná dokumentácia