Skip to content

Heildarumhverfi með ansible


Grunnuppsetning ansible

Hér er fjallað um hvernig ansible er sett upp á stjórntæki. Notum pakkastjórann okkar til að sækja ansible pakkann:

# pacman -S ansible

Gerum okkur SSH lykil fyrir ansible notandann (það má nota núverandi lykil en mér finnst það skítugra)

$ ssh-keygen 
Þetta býr til 3072 bita lykil. Ef núverandi id_rsa lykill er ekki notaður er mælt með að breyta heitinu, hér var notað ansible_id_rsa. Einnig er mælt með því að setja lykilorð á lykilinn.

Gerum okkur vinnumöppu. Hægt er að nota sjálfgefna staðinn /etc/ansible/, en hér hefur verið gerð git-lind sem heitir ansible, hún er klónuð á skyndaman stað og notuð sem vinnumappa.

$ git clone git@gitlab.com:notandi/ansible
$ cd ansible

Inventory skráin

Ansible notar inventory skrá til að lesa inn alla þjónana sem verka skal á. Í litlum umhverfum eins og höfundar er oft notuð ein skrá í rót vinnumöppunar, en í stærri umhverfum er hægt að hafa flóknari lista sem t.a.m. sækja upplýsingar til skýsins um hvaða þjónar eru uppi og uppfærir listann eftir því. Þá endar umhverfið með marga lista og skrár sem er gott að halda til haga í sér möppu á rótinni. Búum okkur undir framtíðina og förum þá leið.

$ mkdir inventory
Þá þarf að gera sjálfa skrána með þjónunum. Hún er annað hvort á forminu INI eða yaml, hér er notast við yaml útfærsluna.

10-hýslar
all:
  hosts:
  children:
    local:
      hosts:
        mars.heima:
        hubble.heima:
        saturnus.heima:
        sputnik.heima:
        olympus.heima:
        freebsd.heima:
    cloud:
      hosts:
        wg-hub:
    dns:
      hosts:
        mars.heima:
    monitoring:
      hosts:
        hubble.heima:
    prod:
      children:
        dns:
        monitoring:
      hosts:
        saturnus.heima:
        sputnik.heima:
        pluto.heima:
        wg-hub:
    test:
      hosts:
        freebsd.heima:

Note

Hér er þjónum skipt í nokkra hópa og margir eru hluti af fleiri en einum hóp, og sumir hópar innihalda aðra hópa. Takið eftir að hér þarf DNS að virka, annars er líka hægt að nota IP tölur.

Nú erum við tilbúin að nota ansible. Við getum notað hvatvísar skipanir á forminu ansible [mynstur] -m [eining] -a "[valmöguleikar einingar]" sem er fínt fyrir einfaldar skipanir o.þ.h., en við munum einbeita okkur að leikbókum (e. playbooks).

Uppsetning tómra þjóna

Höfundur er að vinna í því að skapa ansible leikbók sem setur upp heilt prod umhverfi þannig að því ferli verður lýst hér. Það er farið þá leið að gera forritaða uppsetningu á FreeBSD með keyranlegri .iso skrá, en það hefur í för me sér að sú skrá verður að vera gerð á FreeBSD þjóni, en libvirt þjónninn er augljóslega linux. Þá er sá hængur á að við verðum að setja upp þann þjón handvirkt. Til þess má fylgja leiðbeiningum hér. FreeBSD uppsetningarmiðillinn þarf síðan að vera sóttur, afpakkaður og rc.local og bsdinstall/script skránum þarf að vera breytt eins og lýst er.

Byrjum á því að nota ansible til að setja upp ansible notanda á libvirt þjóninum. Hér eru leikbækurnar settar í rót ansible möppunnar.

freebsd-auto-prep.yml
- name: Bætum við ansible notanda
  hosts: olympus.heima
  remote_user: thg
  become: true

  tasks:
  - name: Gerum ansible hóp
    ansible.builtin.group:
      name: byggir
      system: true

  - name: Gerum ansible notanda
    ansible.builtin.user:
      name: bubbi
      create_home: true
      group: byggir
      groups: ''
      home: /home/bubbi
      password: '!'
      system: true

  - name: Búum til SSH möppu
    ansible.builtin.file:
      path: /home/bubbi/.ssh
      state: directory
      owner: bubbi
      group: byggir
      mode: 0700

  - name: Flytjum inn lykla
    ansible.builtin.copy:
      dest: /home/bubbi/.ssh/authorized_keys
      src: /home/thg191/.ssh/ansible_id_rsa.pub
      owner: bubbi
      group: byggir
      mode: 0600

  - name: Óauðkennt sudo fyrir bubba
    ansible.builtin.lineinfile:
      create: yes
      line: "bubbi ALL=(ALL) NOPASSWD: ALL"
      path: /etc/sudoers.d/bubbi
      state: present
      validate: /usr/sbin/visudo -cf %s

  - name: Bönnum lykilorðainnskráningar bubba
    ansible.builtin.blockinfile:
      path: /etc/ssh/sshd_config
      block: "|
        Match User bubbi
        PasswordAuthentication no"

Leikbækurnar munu nota breytur sem lýsa eiginleikum sýndarvélanna sem leikbækurnar setja upp. Við skilgreinum þær í vars/prod.yml.

vars/prod.yml
prod:
  - name: dns
    memory: 512
    vcpu: 1
    network: vmbr
    cdrom: deploy.iso
    ip: 192.168.40.101
    gateway: 192.168.40.1

  - name: mon
    memory: 1024
    vcpu: 2
    network: vmbr
    cdrom: deploy.iso
    ip: 192.168.40.102
    gateway: 192.168.40.1
Næst gerum við installerconfig sniðmát sem notar þessar breytur.

templates/installerconfig
PARTITIONS=DEFAULT
DISTRIBUTIONS="kernel.txz base.txz"

#!/bin/sh

IP="{{ item.ip }}"
GW="{{ item.gateway }}"
HOSTNAME="{{ item.name }}.dæmi.is"
SSH_KEY="dreifilykill notanda"
SSH_DIR="/home/bubbi/.ssh"

# Virkjum netstillingar
ifconfig vtnet0 inet $IP netmask 255.255.255.0
route add default $GW
echo "nameserver 192.168.40.12" > /etc/resolv.conf

# Gerum netstillingar varanlegar og virkjum SSH
sysrc ifconfig_vtnet0=inet $IP netmask 255.255.255.0
sysrc defaultrouter=$GW
sysrc sshd_enable=YES
sysrc hostname=$HOSTNAME

# Bætum við ansible notanda
pw useradd -n bubbi -d /home/bubbi -m -g byggir -w no
mkdir $SSH_DIR
echo $SSH_KEY > $SSH_DIR/authorized_keys
chown bubbi:byggir $SSH_DIR
chown bubbi:byggir $SSH_DIR/authorized_keys
chmod 0700 $SSH_DIR

# Uppfærum kerfið
env ASSUME_ALWAYS_YES=YES pkg bootstrap -f | cat
env ASSUME_ALWAYS_YES=YES pkg upgrade -f | cat
freebsd-update fetch | cat
freebsd-update install | cat

# Ansible prepp
pkg install -y sudo python 
echo "bubbi ALL=(ALL) NOPASSWD: ALL" > /usr/local/etc/sudoers.d/bubbi
Við getum þá skrifað þá leikbók sem verkar á FreeBSD þjóninn og framleiðir uppsetningarmiðlana okkar.

mkisoimages.yml
- name: Framleiðsla uppsetningarmiðla
  hosts: freebsd.heima
  become: true
  vars_files:
    - vars/prod.yml

  tasks:
  - name: Mappa búin til í /var/iso
    ansible.builtin.file:
      owner: root
      path: /var/iso/freebsd-media
      state: directory

  - name: Uppsetningarmiðill sóttur
    ansible.builtin.get_url:
      dest: /var/iso/FreeBSD-13.1-RELEASE-amd64-disc1.iso
      group: wheel
      owner: root
      url: https://download.freebsd.org/releases/amd64/amd64/ISO-IMAGES/13.1/FreeBSD-13.1-RELEASE-amd64-disc1.iso

  - name: iso skrá afþjöppuð
    ansible.builtin.shell:
      cmd: "tar -xvk -C /var/iso/freebsd-media -f /tmp/FreeBSD-13.1-RELEASE-amd64-disc1.iso"

  - name: Installerconfig skrár smíðaðar
    ansible.builtin.template:
      dest: "/tmp/installerconfig_{{ item.name }}"
      src: "templates/installerconfig"
    with_items: "{{ prod }}"

  - name: iso uppsetningarmiðlar smíðaðir
    ansible.builtin.shell:
      cmd: "cp -f /tmp/installerconfig_{{ item.name }} /var/iso/etc/installerconfig && sh /usr/src/release/amd64/mkisoimages.sh -b '13_1_RELEASE_AMD64_CD' /tmp/deploy_{{ item.name }}.iso /var/iso/freebsd-media"
    with_items: "{{ prod }}"

  - name: Uppsetningarmiðlar færðir á libvirt þjón
    ansible.posix.synchronize:
      dest: /tmp/
      src: /tmp/deploy_*.iso
      mode: pull
    delegate_to: olympus.heima
Þá eru allar .iso skrárnar komnar undir /tmp og umhverfið er tilbúið til uppsetningar.

Warning

Fyrstu tvö leikatriðin eru sjálfvalda (e. idempotent), þ.e. að þau skilgreina ástand sem verður framfylgt óháð fyrra ástandi. Afþjöppunin er einnig sjálfvalda vegna -k flagginu, en það yfirskrifar ekki gamlar skrár, en þar sem Ansible er ekki að keyra módúl heldur beina skipun þá skynjar Ansible þetta sem að ástandi hafi verið breytt þó það sé ekki raunin.

Iso uppsetningarskipunin er ekki sjálfvalda, hún mun alltaf gera eins marga uppsetningamiðla og eru skilgreindir í vars/prod.yml. Þetta er líklega hægt að laga með því að breyta skipuninni í módúl þannig að hún framleiði einungis .iso skrár fyrir þá þjóna sem eru ekki skilgreindir á libvirt þjóninum.

Að mati höfundar er snyrtilegra að setja upp sýndarvél frá XML skrá frekar en með langri virt-install skipun, sé þetta gert með ansible. Vandamálið er það að verða sér úti um þá XML skrá, þessi er tekin frá ný-uppsettri FreeBSD sýndarvél, en afritið frá eins vél og þið hyggist setja upp. Breytið í template þannig að gildin fyrir nafn, minni, iso skrá og netstillingu séu til staðar:

``` xml title=templates/vm.xml.j2 {{ item.name }} {{ item.memory }} {{ item.vcpu }}

!!! note

    Fjarlægið einnig allar upplýsingar sem eru einstakar hvað varðar þessa vél, svoesem `UUID` gildi vélarinnar og `MAC` fang netaldsins. Vélin fær ný gildi þegar hún er skilgreind.

Nú getum við notað þetta XML template ásamt breytunum okkar til að setja upp allar vélarnar.

``` yaml title=deploy.yml
- name: Keyri uppsetningarleikbók
  ansible.builtin.import_playbook: mkisoimages.yml

- name: Setjum upp grunnþjóna í prod
  hosts: olympus.heima
  become: true
  vars_files:
    - vars/prod.yml

# Byrjum á því að smíða iso skrárnar
- import_playbook: mkisoimages.yml

  tasks:
  - name: Gerum ZFS gagnasettin
    community.general.zfs:
      name: "fast/vm/{{ item.name }}"
      state: present
    with_items: "{{ prod }}"

  - name: Setjum vélarnar upp
    community.libvirt.virt:
      command: "define"
      xml: "{{ lookup('template', 'templates/vm.xml.j2') }}"
    with_items: "{{ prod }}"

  - name: Búum til diskana
    ansible.builtin.shell:
      cmd: "qemu-img create -f qcow2 /fast/vm/{{ item.name }}/{{ item.name }}.qcow2 16G"
    with_items: "{{ prod }}"

  - name: Ræsi þjóna
    ansible.libvirt.virt:
     name: "{{ item.name }}"
     state: running
    with_items: "{{ prod }}"

Núna eru allir þjónarnir skilgreindir og komnir í gang. Þeir byrja á því að keyra í gegnum uppsetningarferlið og endurræsa sig að því loknu, það getur tekið nokkrar mínútur.

Á þessu stigi málsins erum við komin með alla þá þjóna sem við viljum í umhverfinu okkar tóma þjóna tilbúna fyrir fleiri ansible leikbækur.

!!!

Óskastaðan væri þannig að við gætum einfaldlega bætt þjónum við `vars/prod.yml` og leikbókin myndi ekki hafa áhrif á keyrandi þjóna og bara verka á þá sem eru ekki skilgreindir, en ýmsar skipanir eru ekki sjálfvalda, t.d. myndi fyrri leikbókin sem smíðar `.iso` skrárnar yfirskrifa þær gömlu, og höfundur `community.libvirt.virt` módúlsins tekur fram að `define` skipunin sé ekki sjálfvalda, sem þýðir að hún gæti yfirskrifað þjóninn sé þetta keyrt oftar en einu sinni.

Viljum við bæta við fleiri þjónum á þennan hátt getum við gert nýja skrá með breytum fyrir þá þjóna, t.d. vars/fleira.yml, settt þá - vars_files: fleira.yml í leikbókunum og keyrt.