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:
Gerum okkur SSH lykil fyrir ansible notandann (það má nota núverandi lykil en mér finnst það skítugra)
Þetta býr til 3072 bita lykil. Ef núverandiid_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.
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ð.
INI eða yaml, hér er notast við yaml útfærsluna.
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.
- 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.
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
installerconfig sniðmát sem notar þessar breytur.
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
- 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
.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
!!! 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.