Cíl
Naším cílem je vytvářet rpm balíčky s vlastním obsahem, sjednocovat skripty na libovolném počtu systémů, včetně verzování, nasazení a zrušení nasazení.
Verze operačního systému a softwaru
- Operační systém: Red Hat Enterprise Linux 7.5
- Software: rpm-build 4.11.3+
Požadavky
Privilegovaný přístup k systému pro instalaci, normální přístup pro sestavení.
Obtížnost
STŘEDNÍ
Konvence
- # – vyžaduje, aby dané linuxové příkazy byly spouštěny s právy root buď přímo jako uživatel root, nebo pomocí
sudo
příkaz - $ – dané linuxové příkazy, které mají být spouštěny jako běžný neprivilegovaný uživatel
Úvod
Jednou ze základních vlastností jakéhokoli systému Linux je, že jsou vytvořeny pro automatizaci. Pokud může být potřeba provést úlohu více než jednou – i když se některá její část při příštím spuštění změní – má správce systému k dispozici nespočet nástrojů pro její automatizaci, od jednoduchého shell
skripty spouštěné ručně na vyžádání (čímž se eliminují překlepy nebo se uloží pouze některé klávesové zkratky) až po složité skriptované systémy, kde se úlohy spouštějí z cron
v určený čas, vzájemná interakce, práce s výsledkem jiného skriptu, možná řízená centrálním řídicím systémem atd.
I když tato svoboda a bohatá sada nástrojů skutečně přispívá k produktivitě, má to jeden háček:jako správce systému napíšete užitečný skript v systému, který se ukáže jako užitečný v jiném, takže skript zkopírujete. Na třetím systému je skript také užitečný, ale s drobnými úpravami – možná nová funkce užitečná pouze v tomto systému, dosažitelná s novým parametrem. S ohledem na zobecnění rozšíříte skript tak, aby poskytoval novou funkci, a také dokončíte úkol, pro který byl napsán. Nyní máte dvě verze skriptu, první je na prvních dvou systémech, druhá na třetím systému.
V datovém centru běží 1024 počítačů a 256 z nich bude potřebovat některé funkce poskytované tímto skriptem. Časem budete mít 64 verzí skriptu, přičemž každá bude dělat svou práci. Při příštím nasazení systému potřebujete funkci, kterou si vybavíte kódovanou v nějaké verzi, ale kterou? A na kterých systémech jsou?
Na systémech založených na RPM, jako jsou varianty Red Hat, může sysadmin využít správce balíčků k vytvoření pořádku ve vlastním obsahu, včetně jednoduchých skriptů shellu, které nemusí poskytovat jiné než nástroje, které pro pohodlí napsal správce.
V tomto tutoriálu vytvoříme vlastní otáčky za minutu pro Red Hat Enterprise Linux 7.5 obsahující dva bash
skripty, parselogs.sh
a pullnews.sh
poskytnout tak, aby všechny systémy měly nejnovější verzi těchto skriptů v /usr/local/sbin
adresář, a tedy na cestě každého uživatele, který se přihlásí do systému.
Distribuce, hlavní a vedlejší verze
Obecně platí, že vedlejší a hlavní verze sestavovacího stroje by měly být stejné jako systémy, do kterých má být balíček nasazen, a také distribuce, aby byla zajištěna kompatibilita. Pokud existují různé verze dané distribuce nebo dokonce různé distribuce s mnoha verzemi ve vašem prostředí (och, radost!), měli byste nastavit sestavovací stroje pro každou z nich. Abychom to zkrátili, stačí nastavit sestavení prostředí pro každou distribuci a každou hlavní verzi a mít je na nejnižší vedlejší verzi existující ve vašem prostředí pro danou hlavní verzi. Nemusí to být nutně fyzické stroje a musí být spuštěny pouze v době sestavování, takže můžete používat virtuální stroje nebo kontejnery.
V tomto tutoriálu je naše práce mnohem jednodušší, nasadíme pouze dva skripty, které nemají vůbec žádné závislosti (kromě bash
), takže vytvoříme noarch
balíčky, které znamenají „nezávislý na architektuře“, také nebudeme specifikovat distribuci, pro kterou je balíček vytvořen. Tímto způsobem je můžeme nainstalovat a upgradovat na jakoukoli distribuci, která používá rpm
a na jakoukoli verzi – potřebujeme pouze zajistit, aby rpm-build
sestavovacího stroje balíček je na nejstarší verzi v prostředí.
Nastavení prostředí budovy
Chcete-li sestavit vlastní balíčky rpm, musíme nainstalovat rpm-build
balíček:
# yum install rpm-build
Od této chvíle nepoužíváme root
uživatele, a to z dobrého důvodu. Sestavení balíčků nevyžaduje root
privilegium a nechcete rozbít svůj stavební stroj.
Sestavení první verze balíčku
Vytvořme adresářovou strukturu potřebnou pro sestavení:
$ mkdir -p rpmbuild/SPECS
Náš balíček se nazývá admin-scripts, verze 1.0. Vytvoříme specfile
který specifikuje metadata, obsah a úlohy prováděné balíkem. Toto je jednoduchý textový soubor, který můžeme vytvořit pomocí našeho oblíbeného textového editoru, jako je vi
. Dříve nainstalovaný rpmbuild
Pokud používáte vi
, balíček vyplní váš prázdný specfile daty šablony vytvořit prázdný, ale pro tento tutoriál zvažte specifikaci níže nazvanou admin-scripts-1.0.spec
:
Name: admin-scripts
Version: 1
Release: 0
Summary: FooBar Inc. IT dept. admin scripts
Packager: John Doe
Group: Application/Other
License: GPL
URL: www.foobar.com/admin-scripts
Source0: %{name}-%{version}.tar.gz
BuildArch: noarch
%description
Package installing latest version the admin scripts used by the IT dept.
%prep
%setup -q
%build
%install
rm -rf $RPM_BUILD_ROOT
mkdir -p $RPM_BUILD_ROOT/usr/local/sbin
cp scripts/* $RPM_BUILD_ROOT/usr/local/sbin/
%clean
rm -rf $RPM_BUILD_ROOT
%files
%defattr(-,root,root,-)
%dir /usr/local/sbin
/usr/local/sbin/parselogs.sh
/usr/local/sbin/pullnews.sh
%doc
%changelog
* Wed Aug 1 2018 John Doe
- release 1.0 - initial release
Umístěte specfile do rpmbuild/SPEC
adresář, který jsme vytvořili dříve.
Potřebujeme zdroje uvedené v specfile
– v tomto případě dva skripty shellu. Pojďme vytvořit adresář pro zdroje (nazývaný jako název balíčku připojený k hlavní verzi):
$ mkdir -p rpmbuild/SOURCES/admin-scripts-1/scripts
A zkopírujte/přesuňte do něj skripty:
$ ls rpmbuild/SOURCES/admin-scripts-1/scripts/
parselogs.sh pullnews.sh
Protože tento tutoriál není o skriptování shellu, obsah těchto skriptů je irelevantní. Vytvoříme novou verzi balíčku a pullnews.sh
je skript, se kterým budeme demonstrovat, jeho zdroj v první verzi je následující:
#!/bin/bash
echo "news pulled"
exit 0
Nezapomeňte přidat příslušná práva k souborům ve zdroji – v našem případě právo provádění:
chmod +x rpmbuild/SOURCES/admin-scripts-1/scripts/*.sh
Nyní vytvoříme tar.gz
archiv ze zdroje ve stejném adresáři:
cd rpmbuild/SOURCES/ && tar -czf admin-scripts-1.tar.gz admin-scripts-1
Jsme připraveni sestavit balíček:
rpmbuild --bb rpmbuild/SPECS/admin-scripts-1.0.spec
Získáme nějaký výstup o sestavení, a pokud se něco pokazí, zobrazí se chyby (například chybějící soubor nebo cesta). Pokud vše půjde dobře, náš nový balíček se objeví v adresáři RPMS generovaném ve výchozím nastavení pod rpmbuild
adresář (seřazený do podadresářů podle architektury):
$ ls rpmbuild/RPMS/noarch/ admin-scripts-1-0.noarch.rpm
Vytvořili jsme jednoduchý, ale plně funkční rpm balíček. Můžeme se dotázat na všechna metadata, která jsme poskytli dříve:
$ rpm -qpi rpmbuild/RPMS/noarch/admin-scripts-1-0.noarch.rpm
Name : admin-scripts
Version : 1
Release : 0
Architecture: noarch
Install Date: (not installed)
Group : Application/Other
Size : 78
License : GPL
Signature : (none)
Source RPM : admin-scripts-1-0.src.rpm
Build Date : 2018. aug. 1., Wed, 13.27.34 CEST
Build Host : build01.foobar.com
Relocations : (not relocatable)
Packager : John Doe
URL : www.foobar.com/admin-scripts
Summary : FooBar Inc. IT dept. admin scripts
Description :
Package installing latest version the admin scripts used by the IT dept.
A proto jej můžeme nainstalovat (s root
privilegia):

Jak jsme nainstalovali skripty do adresáře, který je na $PATH
každého uživatele , můžete je spustit jako jakýkoli uživatel v systému z libovolného adresáře:
$ pullnews.sh
news pulled
Balíček může být distribuován tak, jak je, a může být vložen do úložišť dostupných pro libovolný počet systémů. To je mimo rozsah tohoto tutoriálu – sestavení jiné verze balíčku však rozhodně není.
Vytvoření další verze balíčku
Náš balíček a extrémně užitečné skripty v něm se okamžitě stanou populární, protože jsou dostupné kdekoli pomocí jednoduchých yum install admin-scripts
v prostředí. Brzy bude mnoho žádostí o vylepšení – v tomto příkladu mnoho hlasů pochází od spokojených uživatelů, že pullnews.sh
vytisknout další řádek při provádění, tato funkce by zachránila celou společnost. Potřebujeme vytvořit další verzi balíčku, protože nechceme instalovat další skript, ale jeho novou verzi se stejným názvem a cestou, protože na ni správci systému v naší organizaci již hodně spoléhají.
Nejprve změníme zdroj pullnews.sh
ve ZDROJÍCH k něčemu ještě složitějšímu:
#!/bin/bash echo "news pulled" echo "another line printed" exit 0
Potřebujeme znovu vytvořit tar.gz s novým zdrojovým obsahem – můžeme použít stejný název souboru jako poprvé, protože neměníme verzi, pouze vydáváme (a tedy Source0
odkaz bude stále platný). Všimněte si, že nejprve odstraníme předchozí archiv:
cd rpmbuild/SOURCES/ && rm -f admin-scripts-1.tar.gz && tar -czf admin-scripts-1.tar.gz admin-scripts-1
Nyní vytvoříme další specfile s vyšším číslem vydání:
cp rpmbuild/SPECS/admin-scripts-1.0.spec rpmbuild/SPECS/admin-scripts-1.1.spec
Na samotném balíčku toho mnoho neměníme, takže novou verzi jednoduše spravujeme, jak je uvedeno níže:
Name: admin-scripts Version: 1 Release: 1 Summary: FooBar Inc. IT dept. admin scripts Packager: John DoeGroup: Application/Other License: GPL URL: www.foobar.com/admin-scripts Source0: %{name}-%{version}.tar.gz BuildArch: noarch %description Package installing latest version the admin scripts used by the IT dept. %prep %setup -q %build %install rm -rf $RPM_BUILD_ROOT mkdir -p $RPM_BUILD_ROOT/usr/local/sbin cp scripts/* $RPM_BUILD_ROOT/usr/local/sbin/ %clean rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root,-) %dir /usr/local/sbin /usr/local/sbin/parselogs.sh /usr/local/sbin/pullnews.sh %doc %changelog * Wed Aug 22 2018 John Doe - release 1.1 - pullnews.sh v1.1 prints another line * Wed Aug 1 2018 John Doe - release 1.0 - initial release
Vše hotovo, můžeme sestavit další verzi našeho balíčku obsahující aktualizovaný skript. Všimněte si, že jako zdroj sestavení odkazujeme na specfile s vyšší verzí:
rpmbuild --bb rpmbuild/SPECS/admin-scripts-1.1.spec
Pokud je sestavení úspěšné, máme nyní v adresáři RPMS dvě verze balíčku:
ls rpmbuild/RPMS/noarch/
admin-scripts-1-0.noarch.rpm admin-scripts-1-1.noarch.rpm
A nyní můžeme nainstalovat „pokročilý“ skript nebo upgradovat, pokud je již nainstalován.

A naši správci systému vidí, že požadavek na funkci je vyřízen v této verzi:
rpm -q --changelog admin-scripts * Wed aug 22 2018 John Doe- release 1.1 - pullnews.sh v1.1 prints another line * Wed aug 01 2018 John Doe - release 1.0 - initial release
Závěr
Náš vlastní obsah jsme zabalili do verzovaných rpm balíčků. To znamená, že žádné starší verze nezůstaly rozptýlené po systémech, vše je na svém místě ve verzi, kterou jsme nainstalovali nebo na kterou jsme upgradovali. RPM umožňuje nahradit staré věci potřebné pouze v předchozích verzích, může přidávat vlastní závislosti nebo poskytovat některé nástroje či služby, na které spoléhají naše další balíčky. S úsilím můžeme zabalit téměř jakýkoli náš vlastní obsah do balíčků rpm a distribuovat jej napříč naším prostředím nejen snadno, ale také konzistentně.