Ansible Teil 1 - YUM und RPM-Pakete

In einem der letzten Blog-Posts hatte ich gezeigt, wie mit wenigen Schritten ein Yum-Repository für RPM-Pakete auf einem NAS angelegt werden kann. Nun soll es darum gehen, diese Pakete auf einem System mit Rocky Linux 9 via Ansible automatisiert zu installieren.

Einer der Grundbaustein von Ansible sind die Tasks in denen definiert wird, was auf einem System automatisiert werden soll. Glück für uns, für die Konfiguration von Yum-Repositories und die Installation von RPM-Paketen gibt es schon fertige Standard-Module.

Hier ein Beispiel für die YUM-Repository Konfiguration und die Installation der Oracle 23ai Free Edition:

- name: "Handle local YUM Repository"
  ansible.builtin.yum_repository:
    name: "local-yum-repo"
    baseurl: "{{ yum_repo_url }}"
    file: "local_yum_repo"
    description: "Local YUM Repo on NAS"
    enabled: yes
    gpgcheck: no
    proxy: "_none_"
    state: "present"

- name: Install Oracle RPM Packages for 23ai
  ansible.builtin.dnf:
    name: 
      - oracle-database-preinstall-23ai
      - oracle-database-free-23ai
    state: installed

In weiteren Blog-Posts werde ich zeigen, wie sich im Anschluss eine Oracle Datenbank erstellen lässt und welche weiteren Bausteine für eine Ansible Automatisierung notwendig sind.

Lokales YUM-Repository für eigene RPM-Pakete

Speziell für eigene RPM-Pakete bietet sich ein YUM-Repository im LAN an. Damit lässt sich die Installation von RPM-Paketen automatisieren und man spart sich - gerade bei großen Paketen - den Download aus dem Netz.

Für Test- und Entwicklungszwecke hat sich bei mir ein NAS der Firma Synology bewährt. Als Basis dient ein NFS-Share und der "Web Station"-Service. So lassen sich die RPM-Pakete bequem von meiner Workstation auf das NAS schieben. Das YUM-Repository lässt sich im zweiten Schritt mit dem Befehl createrepo anlegen oder aktualisieren.

Zunächst die gewünschen RPM-Pakete auf das NFS-Share verschieben / kopieren:

mv oracle-database-preinstall-23ai-1.0-2.el9.x86_64.rpm /media/web/
mv oracle-database-free-23ai-1.0-1.el9.x86_64.rpm /media/web/

Falls noch kein YUM-Repository existiert:

createrepo /media/web/

Nach diesem Aufruf gibt es ein Unterverzeichnis repodata mit den entsprechenden Metadaten des Repository.

Um die Metadaten nach dem Hinzufügen von Paketen zu aktualisieren reicht ein:

createrepo --update /media/web/

IPv6 Konfiguration bei OVH VPS Instanzen

Manchmal ist er schwer für einfache Dinge eine saubere technische Lösung zu finden. Gutes Beispiel ist die IPv6 Konfiguration für eine VPS Instanz bei der Firma OVH. Nach meiner Erfahrung ist die Netzwerkkonfiguration, gerade bei Cloud-Angeboten, je nach Hosting Anbieter etwas komplizierter. Das Angebot von OVH basiert aber auf OpenStack und die Basis-Konfiguration innerhalb der VM erfolgt via cloud-init. D.h. egal ob Amazon AWS, Microsoft Azure oder eben OVH, unter Linux kommt immer cloud-init zum Einsatz. Aber im Fall von VPS-Instanzen bei OVH werden wohl zumindest für IPv6 keine Metadaten bereitgestellt.

Dies lässt sich auf der Kommandozeile über entsprechende HTTP-Requests testen:

[root@vps593928 ~]# curl http://169.254.169.254/2009-04-04/meta-data/
ami-id
ami-launch-index
ami-manifest-path
block-device-mapping/
hostname
instance-action
instance-id
instance-type
local-hostname
local-ipv4
placement/
public-hostname
public-ipv4
public-keys/
reservation-id

Via DHCP ist es offenbar ebenfalls nicht möglich die IPv6-Einstellungen dynamisch zu beziehen. Bei IPv4 funktioniert dies, bei IPv6 aber wohl nicht. Nun könnte man die Netzwerk-Konfiguration via cloud-init abschalten und die entsprechenden Konfigurationsdateien manuell pflegen. Ich wollte aber möglichst nah an der Standard-Installation bleiben, deshalb liefere ich die fehlenden IPv6-Daten in der cloud-init Konfiguration nach.

Beim Hostnamen hatte ich ähnliche Schwierigkeiten. Die Web-GUI von OVH erlaubt zwar den Namen der VPS Instanz zu ändern, die cloud-init zur Verfügung gestellten Metadaten enthalten aber immer noch den ursprünglichen Instanz-Namen von OVH. Für den Hostnamen habe ich noch keine saubere Lösung gefunden. Hier hilft nur den Hostnamen einmalig auf den gewünschten Wert zu setzen und danach die dynamische Änderung des Hostname in cloud-init zu deaktivieren.

[root@vps593928 ~]# hostnamectl set-hostname s20.e1.fm-berger.de

Die cloud-init Konfiguration für IPv6 und Hostname erfolgt dann über neue Datei /etc/cloud/cloud.cfg.d/99-custom-networking.cfg mit folgendem Inhalt:

network:
  version: 1
  config:
  - type: physical
    name: eth0
    mac_address: fa:16:3e:07:47:dd
    subnets:
      - type: dhcp
      - type: static
        address: 2001:41d0:701:1100::ab3/128
        gateway: 2001:41d0:701:1100::1

preserve_hostname: true

Nach einem Reboot der VPS Instanz sollte die IPv6-Konfiguration richtig gesetzt sein und der Hostname dürfte nicht mehr ändern.

Oracle RAC 12c R2 – Teil 3 – Shared Storage Konfiguration

Neben den VMs für die beiden RAC-Knoten benötigen wir noch eine Shared Storage Konfiguration. Sobald die VMs ausgeschaltet sind, können in Virtualbox unter Windows sechs 10 GB Disks angelegt werden:

"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" createhd --filename C:\vm\shared\asmdisk01.vdi --size 10240 --format VDI --variant Fixed
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" createhd --filename C:\vm\shared\asmdisk02.vdi --size 10240 --format VDI --variant Fixed
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" createhd --filename C:\vm\shared\asmdisk03.vdi --size 10240 --format VDI --variant Fixed
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" createhd --filename C:\vm\shared\asmdisk04.vdi --size 10240 --format VDI --variant Fixed
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" createhd --filename C:\vm\shared\asmdisk05.vdi --size 10240 --format VDI --variant Fixed
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" createhd --filename C:\vm\shared\asmdisk06.vdi --size 10240 --format VDI --variant Fixed

Anbindung der Disks an die VMs:

"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" storageattach "ol73o122-1" --storagectl "SATA" --port 1 --device 0 --type hdd --medium C:\vm\shared\asmdisk01.vdi --mtype shareable
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" storageattach "ol73o122-2" --storagectl "SATA" --port 1 --device 0 --type hdd --medium C:\vm\shared\asmdisk01.vdi --mtype shareable

"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" storageattach "ol73o122-1" --storagectl "SATA" --port 2 --device 0 --type hdd --medium C:\vm\shared\asmdisk02.vdi --mtype shareable
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" storageattach "ol73o122-2" --storagectl "SATA" --port 2 --device 0 --type hdd --medium C:\vm\shared\asmdisk02.vdi --mtype shareable

"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" storageattach "ol73o122-1" --storagectl "SATA" --port 3 --device 0 --type hdd --medium C:\vm\shared\asmdisk03.vdi --mtype shareable
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" storageattach "ol73o122-2" --storagectl "SATA" --port 3 --device 0 --type hdd --medium C:\vm\shared\asmdisk03.vdi --mtype shareable

"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" storageattach "ol73o122-1" --storagectl "SATA" --port 4 --device 0 --type hdd --medium C:\vm\shared\asmdisk04.vdi --mtype shareable
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" storageattach "ol73o122-2" --storagectl "SATA" --port 4 --device 0 --type hdd --medium C:\vm\shared\asmdisk04.vdi --mtype shareable

"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" storageattach "ol73o122-1" --storagectl "SATA" --port 5 --device 0 --type hdd --medium C:\vm\shared\asmdisk05.vdi --mtype shareable
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" storageattach "ol73o122-2" --storagectl "SATA" --port 5 --device 0 --type hdd --medium C:\vm\shared\asmdisk05.vdi --mtype shareable

"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" storageattach "ol73o122-1" --storagectl "SATA" --port 6 --device 0 --type hdd --medium C:\vm\shared\asmdisk06.vdi --mtype shareable
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" storageattach "ol73o122-2" --storagectl "SATA" --port 6 --device 0 --type hdd --medium C:\vm\shared\asmdisk06.vdi --mtype shareable

Nach dem Start der Cluster-Knoten, müssten nun die neuen Disks via fdisk sichtbar sein:

[root@ol73o122-1 ~]# fdisk -l

Disk /dev/sda: 42.9 GB, 42949672960 bytes, 83886080 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000e44b6

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     2099199     1048576   83  Linux
/dev/sda2         2099200    83886079    40893440   8e  Linux LVM

Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/sdc: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/sdd: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/sde: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/mapper/ol-root: 37.7 GB, 37706792960 bytes, 73646080 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/mapper/ol-swap: 4160 MB, 4160749568 bytes, 8126464 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Um die Disks für den ASM Filer Driver zu labeln entpacken wir die Grid Infrastructure Software im Grid Home als OS-User grid:

[grid@ol73o122-1 ~]$ cd /opt/oracle/grid
[grid@ol73o122-1 grid]$ unzip -q /media/sf_transfer/linux_12201/linuxx64_12201_grid_home.zip

Das Labeln erfolgt wieder als root:

[root@ol73o122-1 dev]# export ORACLE_HOME=/opt/oracle/grid
[root@ol73o122-1 dev]# export ORACLE_BASE=/tmp
[root@ol73o122-1 dev]# /opt/oracle/grid/bin/asmcmd afd_label DATA1 /dev/sdb --init
[root@ol73o122-1 dev]# /opt/oracle/grid/bin/asmcmd afd_label DATA2 /dev/sdc --init
[root@ol73o122-1 dev]# /opt/oracle/grid/bin/asmcmd afd_label DATA3 /dev/sdd --init
[root@ol73o122-1 dev]# /opt/oracle/grid/bin/asmcmd afd_label DATA4 /dev/sde --init
[root@ol73o122-1 dev]# /opt/oracle/grid/bin/asmcmd afd_label DATA5 /dev/sdf --init
[root@ol73o122-1 dev]# /opt/oracle/grid/bin/asmcmd afd_label DATA6 /dev/sdg --init    

Oracle RAC 12c R2 - Teil 2 – Installation Oracle Linux 7.3

Im zweiten Teil erfolgt nun die Basisinstallation von Oracle Linux 7.3 auf den beiden Cluster Knoten. Für die VMs wurde folgende Grundkonfiguration gewählt:

  • Hauptspeichergröße je VM: 6 GB
  • Größe der lokalen Disk jeweils: 40 GB
  • RPM-Package-Auswahl: minimal mit UEK-Kernel
  • Konfiguration der Netzwerkkarten: manuel ohne DHCP

Netzwerkkonfiguration nach der Basisinstallation:

[root@ol73o122-1 ~]# ip addr show
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp0s3:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:45:95:3e brd ff:ff:ff:ff:ff:ff
    inet 192.168.56.101/24 brd 192.168.56.255 scope global enp0s3
       valid_lft forever preferred_lft forever
    inet6 fe80::56d4:7072:782f:dba2/64 scope link
       valid_lft forever preferred_lft forever
3: enp0s8:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:ad:0e:75 brd ff:ff:ff:ff:ff:ff
    inet 192.168.59.101/24 brd 192.168.59.255 scope global enp0s8
       valid_lft forever preferred_lft forever
    inet6 fe80::f08d:41a8:a861:df36/64 scope link
       valid_lft forever preferred_lft forever

Aktueller Kernel:

[root@ol73o122-1 ~]# uname -a
Linux ol73o122-1.t01.fm-berger.de 4.1.12-61.1.18.el7uek.x86_64 #2 SMP Fri Nov 4 15:48:30 PDT 2016 x86_64 x86_64 x86_64 GNU/Linux

Kurzcheck DNS:

[root@ol73o122-1 ~]# hostname
ol73o122-1.t01.fm-berger.de
[root@ol73o122-1 ~]# ping ol73o122-2.t01.fm-berger.de
PING ol73o122-2.t01.fm-berger.de (192.168.56.102) 56(84) bytes of data.
64 bytes from ol73o122-2.t01.fm-berger.de (192.168.56.102): icmp_seq=1 ttl=64 time=1.21 ms
64 bytes from ol73o122-2.t01.fm-berger.de (192.168.56.102): icmp_seq=2 ttl=64 time=0.803 ms
64 bytes from ol73o122-2.t01.fm-berger.de (192.168.56.102): icmp_seq=3 ttl=64 time=0.791 ms
^C
--- ol73o122-2.t01.fm-berger.de ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 0.791/0.934/1.210/0.197 ms
[root@ol73o122-1 ~]# ping ol73o122-2-priv.t01.fm-berger.de
PING ol73o122-2-priv.t01.fm-berger.de (192.168.59.102) 56(84) bytes of data.
64 bytes from ol73o122-2-priv.t01.fm-berger.de (192.168.59.102): icmp_seq=1 ttl=64 time=0.778 ms
64 bytes from ol73o122-2-priv.t01.fm-berger.de (192.168.59.102): icmp_seq=2 ttl=64 time=0.846 ms
64 bytes from ol73o122-2-priv.t01.fm-berger.de (192.168.59.102): icmp_seq=3 ttl=64 time=0.721 ms
^C
--- ol73o122-2-priv.t01.fm-berger.de ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 0.721/0.781/0.846/0.060 ms

Firewall für die Erstinstallation zunächst deaktivieren:

[root@ol73o122-1 ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
Removed symlink /etc/systemd/system/basic.target.wants/firewalld.service.

Installation des Oracle Preinstall-RPMs:

[root@ol73o122-1 ~]# yum install oracle-database-server-12cR2-preinstall

Zusätzlich erforderliche RPMs für die VBoxLinuxAdditions:

[root@ol73o122-1 ~]# yum install gcc kernel-uek-devel bzip2 perl

Das Preinstall-RPM hat die OS-Gruppen oinstall und dba sowie den OS-User oracle bereits angelegt, für eine RAC-Installation benötigen wir aber weitere OS-Gruppen:

[root@ol73o122-1 ~]# id -a oracle
uid=54321(oracle) gid=54321(oinstall) groups=54321(oinstall),54322(dba)
[root@ol73o122-1 ~]# groupadd -g 54323 oper
[root@ol73o122-1 ~]# groupadd -g 54324 backupdba
[root@ol73o122-1 ~]# groupadd -g 54325 dgdba
[root@ol73o122-1 ~]# groupadd -g 54326 kmdba
[root@ol73o122-1 ~]# groupadd -g 54327 asmdba
[root@ol73o122-1 ~]# groupadd -g 54328 asmoper
[root@ol73o122-1 ~]# groupadd -g 54329 asmadmin
[root@ol73o122-1 ~]# groupadd -g 54330 racdba

Neben den OS-Gruppen legen wir zusätzlich den OS-User grid als Software-Owner für die Grid Infrastructure an:

[root@ol73o122-1 ~]# useradd -u 54322 -g oinstall -G asmadmin,asmdba,asmoper,racdba,vboxsf grid
[root@ol73o122-1 ~]# id -a grid
uid=54322(grid) gid=54321(oinstall) groups=54321(oinstall),995(vboxsf),54327(asmdba),54328(asmoper),54329(asmadmin),54330(racdba)

Dem bereits bestehenden OS-User oracle fügen wir weitere OS-Gruppen hinzu:

[root@ol73o122-1 ~]# id -a oracle
uid=54321(oracle) gid=54321(oinstall) groups=54321(oinstall),54322(dba)
[root@ol73o122-1 ~]# usermod -a -G asmdba,backupdba,dgdba,kmdba,racdba,vboxsf,oper oracle
[root@ol73o122-1 ~]# id -a oracle
uid=54321(oracle) gid=54321(oinstall) groups=54321(oinstall),54322(dba),995(vboxsf),54323(oper),54324(backupdba),54325(dgdba),54326(kmdba),54327(asmdba),54330(racdba)

Vorbereitung der Installationsverzeichnisse:

[root@ol73o122-1 ~]# mkdir -p /opt/oracle/grid-base
[root@ol73o122-1 ~]# mkdir -p /opt/oracle/grid
[root@ol73o122-1 ~]# mkdir -p /opt/oracle/rdbms
[root@ol73o122-1 ~]# chown -R grid:oinstall /opt/oracle
[root@ol73o122-1 ~]# chown oracle:oinstall /opt/oracle/rdbms
[root@ol73o122-1 ~]# chmod -R 775 /opt/oracle