Linux distribution ပေါ်မှာမူတည်ပြီး အသုံးပြုတဲ့ package manager တွေဟာအနည်းနဲ့အများ ကွာခြားချက်တွေရှိပါတယ်။ Debian ပေါ်မှာအခြေပြုထားတဲ့ distribution တွေမှာ .deb file တွေနဲ့တွဲပြီးအသုံးပြု သော APT ဆိုတဲ့ Advanced Package Tool ကိုသုံးထားသလို Red Hat ကနေဆင်းသက်လာတဲ့ distribution မှာဆိုရင် .rpm file တွေအတွက် YUM(Yellowdog Updater Modified)/DNF(Dandified YUM) ကိုသုံးကြပြန်ပါတယ်။ ဒါ့အပြင် အခြားသော mainstream Linux distribution ထဲကနေခွဲထွက်သွားတဲ့ Arch လိုမျိုးမှာလည်း pacman ကိုအသုံးပြုကြပြန်ပါတယ်။ ဒီ့နောက်ပိုင်းမှာ ပိုပြီိးတွင်တွင်ကျယ်ကျယ် အသုံးပြုလာတဲ့ neo package manager တွေဖြစ်တဲ့ Flatpak တို့ Snap တို့လို အမျိိုးအစားတွေလည်း ရှိပြန်ပါတယ်။ ထုံးစံအတိုင်း Linux မှာက ရွေးစရာတွေအများကြီးနဲ့ ပြည့်နေတတ်ပါတယ်။ ဒါဟာလည်း opensource ကမ္ဘာက healthy competition တွေမို့ အကျိုးထူး အကျိုးမြတ်တွေရတာ end user တွေပါ။
ရွေးချယ်စရာတွေအများကြီးရှိပေမယ့်လည်း လက်တွေ့မှာ de facto standard အနေနဲ့အသုံးများနေတုန်းဖြစ်တဲ့ YUM/DNF နဲ့ APT ကိုဘယ်လိုမျိုး အသုံးပြုပြီး package manager အနေနဲ့ အသုံးချနိုင်သလဲဆိုတာ ဒီ article မှာဆွေးနွေးတင်ပြချင်ပါတယ်။
Package manager ဆိုသည်မှာ
Package manager ဆိုတဲ့ concept က Linux မှာအရင်ကတည်း ရှိနေပြီးသား tool တခုပါ။ Windows မှာတော့ အခုနောက်ပိုင်းမှာမှ Chocolatey တို့၊ Winget တို့တဖြည်းဖြည်းပေါ်လာကြပါတယ်။ ပုံမှန်အားဖြင့်ဆိုရင် Windows မှာကိုယ်လိုချင်တဲ့ software/application တခုကို အင်တာနက်ပေါ်ကနေ download ဆွဲမယ်၊ ပြီးရင် next click ... next click agree ဆိုပြီး install လုပ်ကြပါတယ်။ အဲ့လိုနဲ့ malware တွေ၊ bloatware တွေကို install လုပ်မှန်းမသိလုပ်ကြပါတော့တယ်။ Linux မှာဆိုရင် package manager တွေအသုံးပြုတဲ့အတွက် official repository ကနေလိုအပ်တဲ့ software တွေကို စိတ်ချက်လက်ချ install လုပ်လို့ရနိုင်ပါတယ်။ Unofficial repository တွေကို setup လုပ်ပြီး malware တွေရနိုင်ချေရှိသော်လည်း Linux user တယောက်အနေနဲ့ ကိုယ်ဘာဖြစ်လို့ အဲ့ unofficial repository လုပ်ထားသလဲဆိုတာ သိကြပါတယ်။ မသိရင်တော့လည်း Windows နည်းတူ၊ Linux မှာလည်း malware တို့ ransomware တို့ ကူးစက်နိုင်ချေရှိပါတယ်။ ဒါ့အပြင်... လိုအပ်တဲ့ repository တွေကို setup မလုပ်ပဲနဲ့ .deb နဲ့ .rpm file ကိုလည်း တိုက်ရိုက် install လုပ်နိုင်ပါတယ်။ ပုံမှန်အားဖြင့်ကတော့ လုပ်ရိုးလုပ်စဉ်မဟုတ်ပါ။ သို့သော်... အချို့သော software/application တွေကို အဲ့နည်းအတိုင်းနဲ့ပဲ install လုပ်ကြပါတယ်။
Windows မှာ .exe file တွေကို install လုပ်တဲ့အခါ အဲ့ဒီ installer ထဲမှာလိုအပ်တဲ့ utility တွေ၊ tool တွေတခါတည်းပါလာပြီးသားပါ။ သို့သော်... Linux မှာက package manager တွေရဲ့တာဝန်က လိုအပ်တဲ့ dependencies ကို manage လုပ်ပေးပါတယ်။ ကိုယ် packaging လုပ်တဲ့အခါမှာ ဘာတွေလိုအပ်သလဲဆိုတာ ပြောပေးလိုက်ရုံပဲဖြစ်ပါတယ်။ လိုအပ်တဲ့ အရာတွေအားလုံးကို သူဟာသူ အရင်ဆုံး install လုပ်ပြီးတော့မှ လိုရင်းဖြစ်တဲ့ software/application ကို install ဆက်လုပ်ပါတယ်။ ဒါ့အပြင် repository configuration မှာဘယ်် repository ကို subscribe လုပ်ချင်သလဲပေါ်မူတည်ပြီး လိုအပ်တဲ့ အခြား package တွေ dependency တွေကို download ဆွဲယူပါတယ်။ Centralised repository ဖြစ်တဲ့အတွက် အင်တာနက်ပေါ်ကတွေ့ကရာ .exe file ထက်တော့ အနည်းငယ်ပိုပြီးစိတ်ချနိုင်ပါတယ်။ Security အတွက် gpg ကိုအသုံးပြုပြီး အဲ့ဒီ repository ကို validate လုပ်နိုင်ပါသေးတယ်။ Package တွေဟာ အကုန်လုံး central location တခုတည်းမှာရှိတဲ့အတွက် ကိုယ်ရှာချင်တဲ့ application တွေကိုလည်း package manager တွေအသုံးပြုပြီး ရှာဖွေနိုင်ပြန်ပါတယ်။ နောက်တခုက ကိုယ့် system မှာဘယ် package ကို install လုပ်ထားသလဲဆိုတဲ့ ကိစ္စကိုလည်း package manager ကပဲတာဝန်ယူပြီး system consistency ဖြစ်ဖို့အတွက် ထိန်းသိမ်းပေးပြန်ပါတယ်။ ဒီတော့... package manager ရဲ့လုပ်ဆောင်နိုင်စွမ်းဟာ Linux system တခုအတွက် တော်တော်လေးအရေးပါပါတယ်။ အောက်မှာ Fedora ရဲ့ out-of-the-box YUM repo configuration ကို ဥပမာတခုအနေနဲ့ပြထားပါတယ်။
Copy tyla@fedora:~$ cat /etc/yum.repos.d/fedora.repo
[fedora]
name = Fedora $releasever - $basearch
#baseurl=http://download.example/pub/fedora/linux/releases/$releasever/Everything/$basearch/os/
metalink = https://mirrors.fedoraproject.org/metalink? repo = fedora- $releasever & arch = $basearch
enabled = 1
countme = 1
metadata_expire = 7d
repo_gpgcheck = 0
type = rpm
gpgcheck = 1
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora- $releasever - $basearch
skip_if_unavailable = False
[fedora-debuginfo]
name = Fedora $releasever - $basearch - Debug
#baseurl=http://download.example/pub/fedora/linux/releases/$releasever/Everything/$basearch/debug/tree/
metalink = https://mirrors.fedoraproject.org/metalink? repo = fedora-debug- $releasever & arch = $basearch
enabled = 0
metadata_expire = 7d
repo_gpgcheck = 0
type = rpm
gpgcheck = 1
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora- $releasever - $basearch
skip_if_unavailable = False
[fedora-source]
name = Fedora $releasever - Source
#baseurl=http://download.example/pub/fedora/linux/releases/$releasever/Everything/source/tree/
metalink = https://mirrors.fedoraproject.org/metalink? repo = fedora-source- $releasever & arch = $basearch
enabled = 0
metadata_expire = 7d
repo_gpgcheck = 0
type = rpm
gpgcheck = 1
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora- $releasever - $basearch
skip_if_unavailable = False
RPM package နဲ့ repository ဖြစ်ဖို့ပြင်ဆင်ပုံ
ကြိုတင်ပြင်ဆင်မူ
Fedora Packager - စာရေးသူက Fedora ကိုအသုံးပြုပြီး rpm package တခုကိုထုပ်ပိုးပြင်ဆင်ပြမှာဖြစ်တဲ့အတွက် Fedora မှာအသုံးပြုနိုင်တဲ့ package တွေကိုအရင်ဆုံး install လုပ်ဖို့လိုပါလိမ့်မယ်။ Fedora မှာတော့ sudo dnf install fedora-packager -y
သို့မဟုတ် sudo yum install fedora-packager -y
ဆိုပြီး install လုပ်ပေးလိုက်ရုံပါပဲ။ အဲ့ဒီ package ထဲမှာလိုအပ်တဲ့ components တွေအကုန်ပါတာမို့ RPM package တခုကိုပြင်ဆင်ဖို့အဆင်သင့်ဖြစ်ပါပြီ။
Ansible - Ansible မှာ role ဆိုတဲ့ concept တခုရှိပါတယ်။ Ansible automation မှာ role တွေဟာ ထပ်ခါထပ်ခါပြန်ပြီး အသုံးပြုနိုင်ဖို့အတွက် အရေးပါတဲ့အရာတခုပါ။ အောက်တွင်ဖော်ပြသွားမယ့် demo မှာအဲ့ဒီ role တွေကို create လုပ်ပြီး RPM package တခုအနေနဲ့ distribute လုပ်နိုင်အောင်ဘယ်လိုပြင်ဆင်နိုင်သလဲဆိုတာ ဖော်ပြမှာဖြစ်တဲ့အတွက် ဒီနေရာမှာ Ansible ကိုအရင် install လုပ်ခိုင်းထားခြင်းဖြစ်ပါတယ်။ မှတ်ချက် - Ansible မှာ reusable role တွေကို အလွယ်တကူ ဖြန့်ဝေနိုင်တဲ့ Ansible Galaxy ရှိပါတယ်။ သို့သော်လည်း အချို့သောလုပ်ငန်းစဉ်တွေမှာ Ansible Galaxy ကိုအဆင်မပြေနိုင်တဲ့အခါ၊ Red Hat ရဲ့ Ansible Automation Hub အတွက် subscription မရှိတဲ့အခါတွေမှာ အခုလိုမျိုး RPM ကိုအသုံးပြုပြီး Ansible role တွေကိုအလွယ်တကူ distribute လုပ်နိုင်ပါတယ်။ Ansible Automation Platform မှာ Automation Hub အပြင်အခြားသော component တွေပါဝင်ပါတယ်။ ဒီနေရာမှာတော့ Ansible role နဲ့ပတ်သတ်ပြီး စိတ်ကူးမိသမျှ လုပ်ငန်းစဉ်တွေကိုရှင်းပြနေတာပါ။
RPM package ထုပ်ပိုးပုံ လုပ်ငန်းစဉ်အဆင့်ဆင့်
အရင်ဆုံး Ansible role တခုကို ကိုယ်အလုပ်လုပ်မယ့် directory မှာဖန်တီးလိုက်ရအောင်။ ဒီနေရာမှာ ဘာအတွက်အသုံးပြုတဲ့ Ansible role လဲဆိုတာအရေးမကြီးပါဘူး။ ဘယ်လိုမျိုး RPM package တခုရအောင်ဖန်တီးသလဲဆိုတာသာ အဓိကဖြစ်တဲ့အတွက် ansible-galaxy init
command ကိုအသုံးပြုပါ့မယ်။
Copy tyla@fedora:~/code/rpm$ ansible-galaxy init myrole
- Role merole was created successfully
tyla@fedora:~/code/rpm$ ll
total 0 drwxr-xr-x. 10 tyla tyla 135 Nov 13 10:33 myrole
tyla@fedora:~/code/rpm$ tree myrole
myrole
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml
9 directories, 8 files
Ansible role တခုမှာပါရမယ့် လိုအပ်တဲ့ file တွေ directory တွေကို ansible-galaxy init က auto-magically ဖန်တီးပေးပါလိမ့်မယ်။ နောက်အဆင့်အနေနဲ့ RPM package ကိုဖန်တီးဖို့အတွက်စတင်ပြင်ဆင်လိုက်ရအောင်။
Copy tyla@fedora:~/code/rpm$ rpmdev-setuptree
tyla@fedora:~/code/rpm$ tree ~/rpmbuild/
/home/tyla/rpmbuild/
├── BUILD
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS
rpmdev-setuptree command ကို run လိုက်တာနဲ့ ကိုယ့်ရဲ့ home directory မှာ rpmbuild ဆိုတဲ့ directory တခုတည်ဆောက်ပေးပါလိမ့်မယ်။ ဒါ့အပြင် အခြားသောလိုအပ်တဲ့ sub-directory တွေကိုလည်း အလိုအလျှောက် အဲ့ဒီ directory အောက်မှာဖန်တီးသွားပါတယ်။ နောက်အဆင့်မှာ ကိုယ်ဖန်တီးထားတဲ့ Ansible role ကို tar နဲ့ .tar.gz ရလာအောင် အောက်မှာဖော်ပြပါအတိုင်း SOURCES ဆိုတဲ့ sub-directory အောက်မှာအရင်ပြင်ဆင်ပေးလိုက်ပါ။
Copy tyla@fedora:~/code/rpm$ tar czf ~/rpmbuild/SOURCES/ansible-role-myrole.tar.gz myrole/
RPM package တခုကို ဘယ်လိုမျိုး build လုပ်ချင်သလဲဆိုတာကို လမ်းညွန်ပေးမယ့် spec file တခုကို အောက်မှာဖော်ပြပေးထားသလိုမျိုး ဖန်တီးလိုက်ရအောင်။
Copy tyla@fedora:~/code/rpm$ vi ~/rpmbuild/SPECS/ansible-role-myrole.spec
Name: ansible-role-myrole
Version: 1.0.0
Release: 1%{?dist}
Summary: Ansible role for < describe your rol e >
License: MIT
Source0: %{name}.tar.gz
BuildArch: noarch
Requires: ansible
%description
This is an Ansible role for < describe your role her e > .
%prep
%setup -q -n myrole
%build
# No build steps needed
%install
mkdir -p %{buildroot}/usr/share/ansible/roles
cp -a . %{buildroot}/usr/share/ansible/roles/myrole
%files
/usr/share/ansible/roles/myrole
%changelog
* Tue Oct 29 2024 Your Name < you@example.com > - 1.0.0-1
- Initial RPM release
ဒီ spec file မှာ RPM အတွက်အရေးပါတဲ့ အချက်အလက်တွေပါဝင်ပါတယ်။ ဥပမာ - Name, Version, Release, BuildArch, Requires ဆိုတဲ့ဟာတွေကို RPM package တခုအတွက် ဘယ် version နဲ့ ဘယ် release ကိုဘယ်လိုမျိုး system ပေါ်မှာ run နိုင်သလဲဆိုတာမူတည်ပြီး အလိုက်သင့်ပြောင်းပေးရပါ့မယ်။ Ansible role ဟာ plaintext file တခုဖြစ်တဲ့အတွက် %build အတွက်ဘာမှ လုပ်စရာမလိုပါဘူး။ အားလုံးအဆင်သင့်ဖြစ်နေပြီးဆိုရင်တော့ RPM တခုဖန်တီးဖို့အတွက် စတင်လို့ရနိုင်ပါပြီ။
Copy tyla@fedora:~/code/rpm$ rpmbuild -ba ~/rpmbuild/SPECS/ansible-role-myrole.spec
Building target platforms: noarch
Building for target noarch
setting SOURCE_DATE_EPOCH=1730160000
Executing(%mkbuilddir): /bin/sh -e /var/tmp/rpm-tmp.DdpRQa
+ umask 022
+ cd /home/tyla/rpmbuild/BUILD/ansible-role-myrole-1.0.0-build
+ test -d /home/tyla/rpmbuild/BUILD/ansible-role-myrole-1.0.0-build
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w /home/tyla/rpmbuild/BUILD/ansible-role-myrole-1.0.0-build
+ /usr/bin/rm -rf /home/tyla/rpmbuild/BUILD/ansible-role-myrole-1.0.0-build
+ /usr/bin/mkdir -p /home/tyla/rpmbuild/BUILD/ansible-role-myrole-1.0.0-build
+ /usr/bin/mkdir -p /home/tyla/rpmbuild/BUILD/ansible-role-myrole-1.0.0-build/SPECPARTS
+ RPM_EC=0
++ jobs -p
+ exit 0
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.oUanG9
+ umask 022
+ cd /home/tyla/rpmbuild/BUILD/ansible-role-myrole-1.0.0-build
+ cd /home/tyla/rpmbuild/BUILD/ansible-role-myrole-1.0.0-build
+ rm -rf myrole
+ /usr/lib/rpm/rpmuncompress -x /home/tyla/rpmbuild/SOURCES/ansible-role-myrole.tar.gz
+ STATUS= 0
+ '[' 0 -ne 0 ']'
+ cd myrole
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ RPM_EC= 0
++ jobs -p
+ exit 0
Executing(%build ): /bin/sh -e /var/tmp/rpm-tmp.HB8PqY
+ umask 022
+ cd /home/tyla/rpmbuild/BUILD/ansible-role-myrole-1.0.0-build
+ CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -spec
s=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash
-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer '
+ export CFLAGS
+ CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -sp
ecs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-cla
sh-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer '
+ export CXXFLAGS
+ FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/re
dhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protect
ion -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib/gfortran/modules '
+ export FFLAGS
+ FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/r
edhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protec
tion -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib/gfortran/modules '
+ export FCFLAGS
+ VALAFLAGS=-g
+ export VALAFLAGS
+ RUSTFLAGS= '-Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none -Cforce-frame-pointers=yes --cap-lints=warn'
+ export RUSTFLAGS
+ LDFLAGS='-Wl,-z,relro -Wl,--as-needed -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 '
+ export LDFLAGS
+ LT_SYS_LIBRARY_PATH=/usr/lib:
+ export LT_SYS_LIBRARY_PATH
+ CC=gcc
+ export CC
+ CXX=g++
+ export CXX
+ cd myrole
+ RPM_EC= 0
++ jobs -p
+ exit 0
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.OrCZMu
+ umask 022
+ cd /home/tyla/rpmbuild/BUILD/ansible-role-myrole-1.0.0-build
+ '[' /home/tyla/rpmbuild/BUILD/ansible-role-myrole-1.0.0-build/BUILDROOT '!=' / ']'
+ rm -rf /home/tyla/rpmbuild/BUILD/ansible-role-myrole-1.0.0-build/BUILDROOT
++ dirname /home/tyla/rpmbuild/BUILD/ansible-role-myrole-1.0.0-build/BUILDROOT
+ mkdir -p /home/tyla/rpmbuild/BUILD/ansible-role-myrole-1.0.0-build
+ mkdir /home/tyla/rpmbuild/BUILD/ansible-role-myrole-1.0.0-build/BUILDROOT
+ CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -spec
s=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash
-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer '
+ export CFLAGS
+ CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -sp
ecs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-cla
sh-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer '
+ export CXXFLAGS
+ FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/re
dhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protect
ion -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib/gfortran/modules '
+ export FFLAGS
+ FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/r
edhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protec
tion -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib/gfortran/modules '
+ export FCFLAGS
+ VALAFLAGS=-g
+ export VALAFLAGS
+ RUSTFLAGS= '-Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none -Cforce-frame-pointers=yes --cap-lints=warn'
+ export RUSTFLAGS
+ LDFLAGS='-Wl,-z,relro -Wl,--as-needed -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 '
+ export LDFLAGS
+ LT_SYS_LIBRARY_PATH=/usr/lib:
+ export LT_SYS_LIBRARY_PATH
+ CC=gcc
+ export CC
+ CXX=g++
+ export CXX
+ cd myrole
+ mkdir -p /home/tyla/rpmbuild/BUILD/ansible-role-myrole-1.0.0-build/BUILDROOT/usr/share/ansible/roles
+ cp -a . /home/tyla/rpmbuild/BUILD/ansible-role-myrole-1.0.0-build/BUILDROOT/usr/share/ansible/roles/myrole
+ '[' '%{buildarch}' = noarch ']'
+ QA_CHECK_RPATHS= 1
+ case "${QA_CHECK_RPATHS :- }" in
+ /usr/lib/rpm/check-rpaths
+ /usr/lib/rpm/check-buildroot
+ /usr/lib/rpm/redhat/brp-ldconfig
+ /usr/lib/rpm/brp-compress
+ /usr/lib/rpm/brp-strip /usr/bin/strip
+ /usr/lib/rpm/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump
+ /usr/lib/rpm/redhat/brp-strip-lto /usr/bin/strip
+ /usr/lib/rpm/brp-strip-static-archive /usr/bin/strip
+ /usr/lib/rpm/check-rpaths
+ /usr/lib/rpm/redhat/brp-mangle-shebangs
+ /usr/lib/rpm/brp-remove-la-files
+ env /usr/lib/rpm/redhat/brp-python-bytecompile '' 1 0 -j2
+ /usr/lib/rpm/redhat/brp-python-hardlink
+ /usr/bin/add-determinism --brp -j2 /home/tyla/rpmbuild/BUILD/ansible-role-myrole-1.0.0-build/BUILDROOT
Scanned 14 directories and 8 files,
processed 0 inodes,
0 modified (0 replaced + 0 rewritten ),
0 unsupported format, 0 errors
Processing files: ansible-role-myrole-1.0.0-1.fc41.noarch
Provides: ansible-role-myrole = 1.0.0-1.fc41
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Checking for unpackaged file(s): /usr/lib/rpm/check-files /home/tyla/rpmbuild/BUILD/ansible-role-myrole-1.0.0-build/BUILDROOT
Wrote: /home/tyla/rpmbuild/SRPMS/ansible-role-myrole-1.0.0-1.fc41.src.rpm
Wrote: /home/tyla/rpmbuild/RPMS/noarch/ansible-role-myrole-1.0.0-1.fc41.noarch.rpm
Executing(rmbuild): /bin/sh -e /var/tmp/rpm-tmp.Idhmi2
+ umask 022
+ cd /home/tyla/rpmbuild/BUILD/ansible-role-myrole-1.0.0-build
+ test -d /home/tyla/rpmbuild/BUILD/ansible-role-myrole-1.0.0-build
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w /home/tyla/rpmbuild/BUILD/ansible-role-myrole-1.0.0-build
+ rm -rf /home/tyla/rpmbuild/BUILD/ansible-role-myrole-1.0.0-build
+ RPM_EC= 0
++ jobs -p
+ exit 0
tyla@fedora:~/code/rpm$ tree ~/rpmbuild/
/home/tyla/rpmbuild/
├── BUILD
├── RPMS
│ └── noarch
│ └── ansible-role-myrole-1.0.0-1.fc41.noarch.rpm
├── SOURCES
│ └── ansible-role-myrole.tar.gz
├── SPECS
│ └── ansible-role-myrole.spec
└── SRPMS
└── ansible-role-myrole-1.0.0-1.fc41.src.rpm
အထက်မှာဖော်ပြထားတဲ့အတိုင်း ~/rpmbuild/BUILD/RPMS/noarch directory အောက်မှာ ansible-role-myrole-1.0.0-1.fc41.noarch.rpm ဆိုပြီးတွေ့ရပါလိမ့်မယ်။ RPM package နှစ်ခုဖြစ်သွားအောင်လို့ အထက်ဖော်ပြပါ လုပ်ငန်းစဉ်အတိုင်း ansible-role-merole တခုကိုထပ်မံဖန်တီးလိုက်ပါ။
Copy tyla@fedora:~/code/rpm$ tree
.
├── merole
│ ├── defaults
│ │ └── main.yml
│ ├── files
│ ├── handlers
│ │ └── main.yml
│ ├── meta
│ │ └── main.yml
│ ├── README.md
│ ├── tasks
│ │ └── main.yml
│ ├── templates
│ ├── tests
│ │ ├── inventory
│ │ └── test.yml
│ └── vars
│ └── main.yml
└── myrole
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml
19 directories, 16 files
tyla@fedora:~/code/rpm$ tree ~/rpmbuild/
/home/tyla/rpmbuild/
├── BUILD
├── RPMS
│ └── noarch
│ ├── ansible-role-merole-1.0.0-1.fc41.noarch.rpm
│ └── ansible-role-myrole-1.0.0-1.fc41.noarch.rpm
├── SOURCES
│ ├── ansible-role-merole.tar.gz
│ └── ansible-role-myrole.tar.gz
├── SPECS
│ ├── ansible-role-merole.spec
│ └── ansible-role-myrole.spec
└── SRPMS
├── ansible-role-merole-1.0.0-1.fc41.src.rpm
└── ansible-role-myrole-1.0.0-1.fc41.src.rpm
7 directories, 8 files
RPM repository ဖန်တီးပုံ လုပ်ငန်းစဉ်အဆင့်ဆင့်
အထက်မှာ ထုပ်ပိုးပြီးသား RPM package တွေကို ကိုယ် repository အနေနဲ့အသုံးပြုမယ့် directory ထဲကိုအရင်ဆုံး ကူးယူလိုက်ပါ။ ကူးယူပြီးတာနဲ့ createrepo ကိုအသုံးပြုပြီး RPM repository တခုဖြစ်လာအောင် အောက်မှာဖော်ပြထားသလိုပြင်ဆင်လိုက်ပါ။
Copy tyla@fedora:~$ cd /opt
tyla@fedora:/opt$ sudo mkdir myrepo
tyla@fedora:/opt$ ll
total 0
drwxr-xr-x. 2 root root 6 Nov 13 11:59 myrepo
tyla@fedora:/opt$ sudo chown -R tyla:tyla myrepo
tyla@fedora:/opt$ cp ~/rpmbuild/RPMS/noarch/* myrepo/
tyla@fedora:/opt$ tree myrepo/
myrepo/
├── ansible-role-merole-1.0.0-1.fc41.noarch.rpm
└── ansible-role-myrole-1.0.0-1.fc41.noarch.rpm
1 directory, 2 files
tyla@fedora:/opt$ ll myrepo/
total 24
-rw-r--r--. 1 tyla tyla 10253 Nov 13 12:00 ansible-role-merole-1.0.0-1.fc41.noarch.rpm
-rw-r--r--. 1 tyla tyla 10254 Nov 13 12:00 ansible-role-myrole-1.0.0-1.fc41.noarch.rpm
tyla@fedora:/opt$ createrepo myrepo/
Directory walk started
Directory walk done - 2 packages
Temporary output repo path: myrepo/.repodata/
Pool started (with 5 workers )
Pool finished
tyla@fedora:/opt$ cd myrepo/
tyla@fedora:/opt/myrepo$ ll
total 28
-rw-r--r--. 1 tyla tyla 10253 Nov 13 12:00 ansible-role-merole-1.0.0-1.fc41.noarch.rpm
-rw-r--r--. 1 tyla tyla 10254 Nov 13 12:00 ansible-role-myrole-1.0.0-1.fc41.noarch.rpm
drwxr-xr-x. 2 tyla tyla 4096 Nov 13 12:01 repodata
ဒီ repository ကို DNF/YUM နဲ့အသုံးပြုဖို့အတွက် /etc/yum.repos.d/myrepo.repo ဆိုတဲ့ file တခုကိုအောက်မှာပြထားသလိုမျိုးအရင်ဆုံးဖန်တီးပေးလိုက်ပါ။
Copy tyla@fedora:~$ sudo vi /etc/yum.repos.d/myrepo.repo
[myrepo]
name = My Custom Repository
baseurl = file:///opt/myrepo # For a local repository
# or use a network path, such as:
# baseurl=http://192.168.1.10/myrepo
enabled = 1
gpgcheck = 0
RPM package တွေကို DNF/YUM package manager နဲ့စားသုံးခြင်း
RPM package တွေကို repository အနေနဲ့ ပြင်ဆင်ပြီးနောက် ကိုယ့်ရဲ့ package manager workflow မှာဘယ်လိုမျိုး အသုံးပြုလို့ရသလဲဆိုတာအောက်မှာတချက်လောက်ကြည့်လိုက်ရအောင်။
Copy # update the dnf repository cache
tyla@fedora:~$ sudo dnf update -y
Updating and loading repositories:
My Custom Repository 100% | 28.0 KiB/s | 2.2 KiB | 00m00s
Repositories loaded.
Nothing to do.
# install the custom Ansible role
tyla@fedora:~$ sudo dnf install ansible-role-myrole
Updating and loading repositories:
Repositories loaded.
Package Arch Version Repository Size
Installing:
ansible-role-myrole noarch 1.0.0-1.fc41 myrepo 3.1 KiB
Transaction Summary:
Installing: 1 package
Total size of inbound packages is 10 KiB. Need to download 10 KiB.
After this operation, 3 KiB extra will be used (install 3 KiB, remove 0 B ).
Is this ok [y/N]: y
[1/1] ansible-role-myrole-0:1.0.0-1.fc41.noarch 100% | 38.8 KiB/s | 10.0 KiB | 00m00s
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
[1/1] Total 100% | 38.7 KiB/s | 10.0 KiB | 00m00s
Running transaction
[1/3] Verify package files 100% | 333.0 B/s | 1.0 B | 00m00s
[2/3] Prepare transaction 100% | 11.0 B/s | 1.0 B | 00m00s
[3/3] Installing ansible-role-myrole-0:1.0.0-1.fc41.noarch 100% | 8.8 KiB/s | 5.8 KiB | 00m01s
Warning: skipped PGP checks for 1 package from repository: myrepo
Complete!
# verify its installation
tyla@fedora:~$ cd /usr/share/ansible/roles
tyla@fedora:/usr/share/ansible/roles$ tree
.
└── myrole
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml
10 directories, 8 files
# attempt to install the same rpm package to see what happens
tyla@fedora:/usr/share/ansible/roles$ cd
tyla@fedora:~$ sudo dnf install ansible-role-myrole
Updating and loading repositories:
Repositories loaded.
Package "ansible-role-myrole-1.0.0-1.fc41.noarch" is already installed.
Nothing to do.
# uninstall the rpm package
tyla@fedora:~$ sudo dnf remove ansible-role-myrole
Package Arch Version Repository Size
Removing:
ansible-role-myrole noarch 1.0.0-1.fc41 myrepo 3.1 KiB
Transaction Summary:
Removing: 1 package
Is this ok [y/N]: y
Running transaction
[1/2] Prepare transaction 100% | 10.0 B/s | 1.0 B | 00m00s
[2/2] Erasing ansible-role-myrole-0:1.0.0-1.fc41.noarch 100% | 21.0 B/s | 17.0 B | 00m01s
Complete!
# verify the uninstallation
tyla@fedora:~$ cd /usr/share/ansible/roles/
tyla@fedora:/usr/share/ansible/roles$ ll
total 0
# now reinstall both myrole and merole
tyla@fedora:/usr/share/ansible/roles$ sudo dnf install ansible-role-myrole ansible-role-merole -y
Updating and loading repositories:
Repositories loaded.
Package Arch Version Repository Size
Installing:
ansible-role-merole noarch 1.0.0-1.fc41 myrepo 3.1 KiB
ansible-role-myrole noarch 1.0.0-1.fc41 myrepo 3.1 KiB
Transaction Summary:
Installing: 2 packages
Total size of inbound packages is 20 KiB. Need to download 20 KiB.
After this operation, 6 KiB extra will be used (install 6 KiB, remove 0 B ).
[1/2] ansible-role-myrole-0:1.0.0-1.fc41.noarch 100% | 500.7 KiB/s | 10.0 KiB | 00m00s
[2/2] ansible-role-merole-0:1.0.0-1.fc41.noarch 100% | 270.6 KiB/s | 10.0 KiB | 00m00s
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
[2/2] Total 100% | 527.0 KiB/s | 20.0 KiB | 00m00s
Running transaction
[1/4] Verify package files 100% | 666.0 B/s | 2.0 B | 00m00s
[2/4] Prepare transaction 100% | 21.0 B/s | 2.0 B | 00m00s
[3/4] Installing ansible-role-merole-0:1.0.0-1.fc41.noarch 100% | 70.6 KiB/s | 5.8 KiB | 00m00s
[4/4] Installing ansible-role-myrole-0:1.0.0-1.fc41.noarch 100% | 5.3 KiB/s | 5.8 KiB | 00m01s
Warning: skipped PGP checks for 2 packages from repository: myrepo
Complete!
# verify the installation
tyla@fedora:/usr/share/ansible/roles$ tree
.
├── merole
│ ├── defaults
│ │ └── main.yml
│ ├── files
│ ├── handlers
│ │ └── main.yml
│ ├── meta
│ │ └── main.yml
│ ├── README.md
│ ├── tasks
│ │ └── main.yml
│ ├── templates
│ ├── tests
│ │ ├── inventory
│ │ └── test.yml
│ └── vars
│ └── main.yml
└── myrole
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml
19 directories, 16 files
ပြထားတဲ့အတိုင်း yum repo ကိုသေချာ configure လုပ်ပြီးသွားတာနဲ့ ကိုယ်သုံးနေကြ DNF/YUM command တွေနဲ့ လိုသလို install လုပ်လိုက်၊ uninstall လုပ်လိုက်နိုင်ပါပြီ။ တခုရှိတာက... /opt/myrepo ဆိုတဲ့ directory ထဲကိုနောက်ထပ် rpm package တွေထပ်ကူးထည့်တာပဲဖြစ်ဖြစ်၊ အချို့သော rpm package တွေကို ဖယ်ရှားပစ်တာပဲဖြစ်ဖြစ် createrepo command ကိုပြန်ပြီး run ပေးရပါလိမ့်မယ်။
Copy tyla@fedora:~$ createrepo --update /opt/myrepo
Directory walk started
Directory walk done - 2 packages
Loaded information about 2 packages
Temporary output repo path: /opt/myrepo/.repodata/
Pool started (with 5 workers )
Pool finished
New and old repodata match, not updating.
tyla@fedora:~$ cd /opt/myrepo/
tyla@fedora:/opt/myrepo$ rm -f ansible-role-merole-1.0.0-1.fc41.noarch.rpm
tyla@fedora:/opt/myrepo$ ll
total 16
-rw-r--r--. 1 tyla tyla 10254 Nov 13 12:00 ansible-role-myrole-1.0.0-1.fc41.noarch.rpm
drwxr-xr-x. 2 tyla tyla 4096 Nov 13 12:01 repodata
tyla@fedora:/opt/myrepo$ cd
tyla@fedora:~$ createrepo --update /opt/myrepo
Directory walk started
Directory walk done - 1 packages
Loaded information about 1 packages
Temporary output repo path: /opt/myrepo/.repodata/
Pool started (with 5 workers )
Pool finished
DEB package နဲ့ repository ဖြစ်ဖို့ပြင်ဆင်ပုံ
ကြိုတင်ပြင်ဆင်မူ
Dpkg-dev - ဒီ tool ဟာ .deb package တွေကိုထုပ်ပိုးဖို့ ပြင်ဆင်တဲ့အခါလိုအပ်ပါတယ်။ Fedora မှာ Fedora-packager လိုသလိုပဲ၊ Debian နဲ့ Ubuntu မှာလည်း dpkg-dev ကိုအရင်ဆုံး install လုပ်ထားဖို့လိုပါလိမ့်မယ်။ sudo apt install dpkg-dev -y
command ကိုအသုံးပြုပြီး dpkg-dev package ကို Ubuntu ပေါ်မှာ install လုပ်နိုင်ပါတယ်။
Ansible - အထက်က RPM package တွေအကြောင်းမှာရှင်းပြထားသလိုပဲ၊ စာရေးသူ Ansible role တွေကို distribute လုပ်တဲ့အခါမှာ .deb package တွေကိုဘယ်လိုမျိုး အသုံးပြုသလဲဆိုတာကို ဥပမာတခုအနေနဲ့ ပြချင်လို့ install လုပ်ရခြင်းဖြစ်ပါတယ်။
DEB package ထုပ်ပိုးပုံ လုပ်ငန်းစဉ်အဆင့်ဆင့်
အထက်မှာလည်း ရှင်းထားပြီးသားဖြစ်တဲ့အတွက် ansible-galaxy init command ကိုသုံးပြီး Ansible role နှစ်ခုကို အောက်မှာပြထားတဲ့အတိုင်း အရင်ဆုံး ဖန်တီးလိုက်ရအောင်။
Copy tyla@ubuntu:~/code/deb$ ansible-galaxy init myrole
- Role myrole was created successfully
tyla@ubuntu:~/code/deb$ ansible-galaxy init merole
- Role merole was created successfully
tyla@ubuntu:~/code/deb$ tree
.
├── merole
│ ├── defaults
│ │ └── main.yml
│ ├── handlers
│ │ └── main.yml
│ ├── meta
│ │ └── main.yml
│ ├── README.md
│ ├── tasks
│ │ └── main.yml
│ ├── tests
│ │ ├── inventory
│ │ └── test.yml
│ └── vars
│ └── main.yml
└── myrole
├── defaults
│ └── main.yml
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml
14 directories, 16 files
Ansible role နှစ်ခုကို အထက်ကအတိုင်းဖန်တီးပြီးရင် .deb package အတွက်ပြင်ဆင်စရာရှိတာကို ဆက်လက်ပြင်ဆင်ပေးလိုက်ပါ။ လုပ်ရတဲ့အဆင့်တွေက RPM နဲ့တော့ကွာခြားချက်တွေရှိပါတယ်။
Copy # prepare the required directories and copy Ansible role files and directories
tyla@ubuntu:~/code/deb$ mkdir -p ~/ansible-role-myrole/usr/share/ansible/roles/myrole
tyla@ubuntu:~/code/deb$ cp -r myrole/* ~/ansible-role-myrole/usr/share/ansible/roles/myrole/
tyla@ubuntu:~/code/deb$ mkdir ~/ansible-role-myrole/DEBIAN
# prepare the control file
tyla@ubuntu:~/code/deb$ vi ~/ansible-role-myrole/DEBIAN/control
Package: ansible-role-myrole
Version: 1.0.0
Section: misc
Priority: optional
Architecture: all
Depends: ansible
Maintainer: Your Name < you@example.co m >
Description: Ansible role for < describe your role her e >
# set permission for these two directories
tyla@ubuntu:~/code/deb$ chmod -R 755 ~/ansible-role-myrole/
tyla@ubuntu:~/code/deb$ chmod -R 755 ~/ansible-role-myrole/DEBIAN/
tyla@ubuntu:~/code/deb$ cd
tyla@ubuntu:~$ dpkg-deb --build ansible-role-myrole
dpkg-deb: building package 'ansible-role-myrole' in 'ansible-role-myrole.deb' .
အထက်မှာပြထားတဲ့အတိုင်း အဆင့်ဆင့်လုပ်ပြီးတာနဲ့ ansible-role-myrole.deb ကို ကိုယ့်ရဲ့ home directory မှာတွေ့မြင်ရမှာဖြစ်ပါတယ်။ နောက်ထပ် အသစ်တွေပြင်ဆင်မူတွေလုပ်မယ်ဆိုရင် control file မှာ version update လုပ်၊ ပြီးရင် dpkg-deb --build ansible-role-myrole
command ကိုနောက်တခါ run လိုက်ရုံပါပဲ။
ထိုနည်းတူစွာ ansible-role-merole.deb ကိုလည်း အထက်ဖော်ပြပါအဆင့်တွေအတိုင်းနောက်တခေါက်လုပ်ပြီး ဖန်တီးလိုက်ပါ။ .deb package နှစ်ခုရလာပြီဆိုရင် repository အနေနဲ့ နောက်အဆင့်မှာဆက်လက် setup လုပ်ဖို့အဆင်သင့်ဖြစ်ပါပြီ။
DEB repository ဖန်တီးပုံ လုပ်ငန်းစဉ်အဆင့်ဆင့်
RPM မှာတုန်းကလိုပဲ .deb package တွေကို /opt/myrepo directory အောက်မှာပြထားတဲ့အတိုင်းပြင်ဆင်လိုက်ပါ။ ပြီးရင် .deb package တွေကို သူ့ရဲ့ sub-directory pool ထဲကို copy ကူးထည့်လိုက်ပါ။
Copy tyla@ubuntu:~$ sudo mkdir -p /opt/myrepo/pool
tyla@ubuntu:~$ cd /opt
tyla@ubuntu:/opt$ sudo chown -R tyla:tyla myrepo/
tyla@ubuntu:/opt$ cd
tyla@ubuntu:~$ cp *.deb /opt/myrepo/pool/
tyla@ubuntu:~$ cd /opt/myrepo/pool/
tyla@ubuntu:/opt/myrepo/pool$ ll
total 16
drwxr-xr-x 2 tyla tyla 4096 Nov 13 09:30 ./
drwxr-xr-x 3 tyla tyla 4096 Nov 13 09:29 ../
-rw-r--r-- 1 tyla tyla 2230 Nov 13 09:30 ansible-role-merole.deb
-rw-r--r-- 1 tyla tyla 2238 Nov 13 09:30 ansible-role-myrole.deb
tyla@ubuntu:/opt/myrepo/pool$ cd ..
tyla@ubuntu:/opt/myrepo$ dpkg-scanpackages pool /dev/null | gzip -9c > Packages.gz
dpkg-scanpackages: warning: Packages in archive but missing from override file:
dpkg-scanpackages: warning: ansible-role-merole ansible-role-myrole
dpkg-scanpackages: info: Wrote 2 entries to output Packages file.
tyla@ubuntu:/opt/myrepo$ tree
.
├── Packages.gz
└── pool
├── ansible-role-merole.deb
└── ansible-role-myrole.deb
Repository အဆင်သင့်ဖြစ်ရင် APT package manager နဲ့တွဲပြီးအသုံးပြုလို့ရအောင် အောက်မှာပြထားတဲ့ အတိုင်း source list ကို update လုပ်ပေးရပါ့မယ်။
Copy # add deb source list
tyla@ubuntu:~$ sudo vi /etc/apt/sources.list.d/myrepo.list
deb [trusted=yes] file:///opt/myrepo ./
# update repo cache with APT package manager
tyla@ubuntu:/opt/myrepo$ sudo apt update [40/887]
Get:1 file:/opt/myrepo ./ InRelease
Ign:1 file:/opt/myrepo ./ InRelease
Get:2 file:/opt/myrepo ./ Release
Ign:2 file:/opt/myrepo ./ Release
Get:3 file:/opt/myrepo ./ Packages
Ign:3 file:/opt/myrepo ./ Packages
Get:4 file:/opt/myrepo ./ Translation-en_US
Ign:4 file:/opt/myrepo ./ Translation-en_US
Get:5 file:/opt/myrepo ./ Translation-en
Ign:5 file:/opt/myrepo ./ Translation-en
Get:3 file:/opt/myrepo ./ Packages
Ign:3 file:/opt/myrepo ./ Packages
Get:4 file:/opt/myrepo ./ Translation-en_US
Ign:4 file:/opt/myrepo ./ Translation-en_US
Get:5 file:/opt/myrepo ./ Translation-en
Ign:5 file:/opt/myrepo ./ Translation-en
Get:3 file:/opt/myrepo ./ Packages
Ign:3 file:/opt/myrepo ./ Packages
Get:4 file:/opt/myrepo ./ Translation-en_US
Ign:4 file:/opt/myrepo ./ Translation-en_US
Get:5 file:/opt/myrepo ./ Translation-en
Ign:5 file:/opt/myrepo ./ Translation-en
Get:3 file:/opt/myrepo ./ Packages [422 B]
Get:4 file:/opt/myrepo ./ Translation-en_US
Ign:4 file:/opt/myrepo ./ Translation-en_US
Get:5 file:/opt/myrepo ./ Translation-en
Ign:5 file:/opt/myrepo ./ Translation-en
Get:4 file:/opt/myrepo ./ Translation-en_US
Ign:4 file:/opt/myrepo ./ Translation-en_US
Get:5 file:/opt/myrepo ./ Translation-en
Ign:5 file:/opt/myrepo ./ Translation-en
Get:4 file:/opt/myrepo ./ Translation-en_US
Ign:4 file:/opt/myrepo ./ Translation-en_US
Get:5 file:/opt/myrepo ./ Translation-en
Ign:5 file:/opt/myrepo ./ Translation-en
Get:4 file:/opt/myrepo ./ Translation-en_US
Ign:4 file:/opt/myrepo ./ Translation-en_US
Get:5 file:/opt/myrepo ./ Translation-en
Ign:5 file:/opt/myrepo ./ Translation-en
Hit:6 http://au.archive.ubuntu.com/ubuntu jammy InRelease
Hit:7 http://au.archive.ubuntu.com/ubuntu jammy-updates InRelease
Hit:8 http://au.archive.ubuntu.com/ubuntu jammy-backports InRelease
Hit:9 http://security.ubuntu.com/ubuntu jammy-security InRelease
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
All packages are up to date.
DEB package တွေကို APT package manager နဲ့စားသုံးခြင်း
APT ကိုအသုံးပြုပြီး ကိုယ်တိုင်ဖန်တီးထားတဲ့ .deb package တွေကို ဘယ်လိုမျိုး အသုံးချနိုင်သလဲဆိုတာကိုအောက်မှာကြည့်လိုက်ရအောင်ဗျာ။
Copy # install ansible-role-myrole deb package
tyla@ubuntu:/opt/myrepo$ sudo apt install ansible-role-myrole
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following NEW packages will be installed:
ansible-role-myrole
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B/2,238 B of archives.
After this operation, 0 B of additional disk space will be used.
Get:1 file:/opt/myrepo ./ ansible-role-myrole 1.0.0 [2,238 B]
Selecting previously unselected package ansible-role-myrole.
(Reading database ... 119045 files and directories currently installed.)
Preparing to unpack .../pool/ansible-role-myrole.deb ...
Unpacking ansible-role-myrole (1.0.0) ...
Setting up ansible-role-myrole (1.0.0) ...
Scanning processes...
Scanning linux images...
Running kernel seems to be up-to-date.
No services need to be restarted.
No containers need to be restarted.
No user sessions are running outdated binaries.
No VM guests are running outdated hypervisor (qemu) binaries on this host.
# verify the installation
tyla@ubuntu:/opt/myrepo$ cd /usr/share/ansible/roles/
tyla@ubuntu:/usr/share/ansible/roles$ tree
.
└── myrole
├── defaults
│ └── main.yml
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml
7 directories, 8 files
# uninstall ansible-role-myrole
tyla@ubuntu:/usr/share/ansible/roles$ sudo apt remove ansible-role-myrole
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following packages will be REMOVED:
ansible-role-myrole
0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded.
After this operation, 0 B of additional disk space will be used.
Do you want to continue? [Y/n] Y
( Reading database ... 119062 files and directories currently installed. )
Removing ansible-role-myrole (1.0.0) ...
sh: 0: getcwd () failed: No such file or directory
# verify the uninstallation
tyla@ubuntu:/usr/share/ansible/roles$ tree
.
0 directories, 0 files
ဒီလောက်ဆိုရင် package manager ဆိုတာဘာအတွက်လဲ၊ ဘယ်လိုအသုံးဝင်သလဲ၊ ဘယ်လိုမျိုးသုံးနိုင်သလဲဆိုတာ ရိပ်စားမိမယ်လို့မျှော်လင့်ပါတယ်။