Managing RHEL5 with Ansible
လွန်ခဲ့တဲ့ တစ်ပတ်လောက်က မိတ်ဆွေအကိုတွေနဲ့အလုပ်ကိစ္စစကားထိုင်ပြောနေရင်း Ansible အကြောင်းရောက်သွားတယ်။ သူတို့ရုံးရဲ့ Server တွေကို Ansible နဲ့ စမ်းပြီး Manage လုပ်ကြည့်နေတာမှာ ကြုံရတဲ့ ပြဿနာတစ်ခုကိုပြောပြတယ်။ သုံးထားတဲ့ Server OS တွေက RHEL 5, 6, 7 အစုံဖြစ်နေတာကြောင့် Playbook တစ်ခုတည်းနဲ့ ပေါင်းပြီး run လိုက်တဲ့အခါကျ version အနိမ့်ဖြစ်တဲ့ RHEL 5 မှာအဆင်မပြေပဲ error တွေတက်တာပါ။ အဲ့ဒီတုန်းကတော့ connection type (Paramiko ကိုသုံးဖို့လိုတာ) ကြောင့်လို့ပဲထင်လိုက်မိတာ တကယ်တမ်းသေချာအောင် လိုက်ရှာဖတ်ကြည့်တော့မှ Ansible Version နဲ့ Managed Node ရဲ့ Python Version နဲ့မကိုက်တာကြောင့်မှန်းသိရတယ်။ အဲ့တော့ ဒီပြဿနာကိုဖြေရှင်းဖို့က နည်းလမ်း သုံးခုတော့ရှိပါတယ်။ (၁) Ansible Version အနိမ့်နဲ့ Manage လုပ်ရင်လုပ်၊ (၂) Managed Node ရဲ့ Python ကို Version မြှင့်ရင်မြှင့်၊ (၃) Ansible ရဲ့ Python မလိုတဲ့ RAW Module နဲ့ Script Module ကိုသုံးရင်သုံး၊ ဒီနည်းလမ်းတွေနဲ့ဖြေရှင်းလို့ရပါတယ်။
(၁) Ansible Version အနိမ့်နဲ့ Manage လုပ်ဖို့ဆိုတာမှာ RHEL5 လို Python 2.4 ပဲပါတဲ့ Distribution တွေအတွက် Ansible 2.3 အထိ နှိမ့်ပြီးသုံးရမှာပါ။ ပြဿနာက Ansible Engine တင်ထားမယ့် Control Node မှာ ပုံမှန်အတိုင်းဆိုရင် Repository ထဲရှိတဲ့ Version က Ansible 2.4 အနိမ့်ဆုံးပါ။ အဲဒီတော့ Ansible 2.3 ရှိတဲ့ Repository ကိုထည့်ပြီးထပ်တင်မယ်ဆိုရင်လည်း Dependency ပြဿနာကရှိနေပြန်ပါလိမ့်မယ်။ Version တစ်ခုတည်းကိုပဲ Install လုပ်ခွင့်ရမှာဖြစ်ပါတယ်။ ဒါကြောင့် Version နှစ်မျိုးလုံးသုံးလို့ရအောင် Python ရဲ့ VirtualEnv နဲ့ environment ခွဲပြီး pip (Python Package Manager) ကနေ Install လုပ်တဲ့နည်းကအရှင်းဆုံးဖြစ်မှာပါ။ နမူနာအနေနဲ့တော့ RHEL/CentOS 7 ကိုပဲအခြေခံပြီး setup လုပ်ပြပေးပါမယ်။ တခြား distribution တွေမှာတော့ အနည်းငယ်ကွဲလွဲနိုင်ပါတယ်။
pip အသုံးပြနိုင်ဖို့အတွက် လိုအပ်တဲ့ Package တွေအရင် install လုပ်ပါမယ်။
sudo yum install -y python-setuptools python-devel gcc
python-setuptools ထဲမှာပါဝင်တဲ့ easy_install ကိုအသုံးပြုပြီး pip ကို install လုပ်ပါမယ်။
sudo easy_install pip
Control Node တစ်ခုတည်းမှာ Ansible version တစ်ခုထက်ပိုပြီး ထည့်သွင်းအသုံးပြုနိုင်ဖို့အတွက် version တစ်ခုစီရဲ့ Library တွေကိုခွဲခြားထိန်းသိမ်းပေးနိုင်တဲ့ virtual environment (virtualenv) လိုအပ်ပါတယ်။ virtualenv ကိုတော့ pip ကနေတဆင့် ရယူပါမယ်။
sudo pip install virtualenv
ရလာတဲ့ virtualenv ကိုအသုံးပြုပြီး environment တည်ဆောက်ပါမယ်။ environment နာမည်ကိုတော့ ansible23 လို့ပေးလိုက်ပါမယ်။ ansible23 အစား အခြားနှစ်သက်ရာနာမည်ပေးနိုင်ပါတယ်။
virtualenv ~/ansible23
တည်ဆောက်လိုက်တဲ့ environment ကို ပြောင်းလဲအသုံးပြုနိုင်ဖို့ activate ဆိုတဲ့ script ဖိုင်ကို run ပေးရပါမယ်။
source ~/ansible23/bin/activate
ပြီးရင်တော့ လိုအပ်တဲ့ Ansible version ကို စတင် install လုပ်နိုင်ပါပြီ။
pip install ansible==2.3
လိုအပ်တဲ့ Ansible version ဟုတ်မဟုတ်ကို –version option နဲ့ စစ်ဆေးနိုင်ပါတယ်။
ansible --version
environment ထဲကနေ ပြန်ထွက်ဖို့ကိုတော့ deactivate ဆိုတဲ့ command လေး run လိုက်ရုံပါပဲ။
deactivate
ဒီနည်းအတိုင်း Ansible 2.4 အတွက် နောက်ထပ် environment တစ်ခုတည်ဆောက်ပါမယ်။
virtualenv ~/ansible24
source ~/ansible24/bin/activate
pip install ansible==2.4
ansible --version
deactivate
လိုအပ်တဲ့ version တွေကို environment ခွဲပြီး install လုပ်ပြီးပြီဆိုရင်တော့ အသုံးပြုနိုင်ပါပြီ။ သုံးချင်တဲ့ Ansible version ရဲ့ environment ကို activate script လေး run ပြီးပြောင်းလိုက်ရုံပါပဲ။
source ~/ansible23/bin/activate
တစ်ခုသတိထားရမှာက Managed Node တွေမှာ python-simplejson ဆိုတဲ့ package ရှိမနေရင် Ansible 2.3 ပြောင်းလဲအဆင်ပြေမှာမဟုတ်ပါဘူး။ "Error: ansible requires the stdlib json or simplejson module, neither was found!"
ဆိုတဲ့ Error Message တွေ့ရပါလိမ့်မယ်။ ဒါကြောင့် python-simplejson ကို install လိုက်လုပ်ပေးထားဖို့တော့လိုပါတယ်။
(၂) RHEL 5 - Managed Node တွေမှာရှိတဲ့ Python ကို Version မြှင့်ဖို့အတွက်ကတော့ Extra Packages for Enterprise Linux (EPEL) Repository သုံးပြီး မြှင့်တဲ့နည်းက အလွယ်ကူဆုံးဖြစ်မှာပါ။
wget https://archives.fedoraproject.org/pub/archive/epel/epel-release-latest-5.noarch.rpm --no-check-certificate
wget https://archives.fedoraproject.org/pub/archive/epel/RPM-GPG-KEY-EPEL-5 --no-check-certificate
rpm --import RPM-GPG-KEY-EPEL-5
yum install -y epel-release-latest-5.noarch.rpm
yum install -y python26
Python 2.6 ကို install လုပ်လိုက်တယ်ဆိုပေမယ့် Python 2.4 ကတော့ Default Interpreter အနေနဲ့ ပုံမှန်အတိုင်းဆက်ရှိနေမှာပါ။ တချို့ System Tools တွေက Python 2.4 နဲ့မှရမှာဖြစ်တဲ့အတွက် 2.6 ကို Upgrade လုပ်သွားတာမျိုးမဟုတ်ပဲ version ၂မျိုးလုံးတွဲပြီးရှိနေမှာဖြစ်ပါတယ်။ Ansible 2.4 နဲ့ Manage လုပ်တဲ့အခါ default ဖြစ်တဲ့ Python 2.4 ကို မသုံးပဲ 2.6 နဲ့ပြောင်းလဲအလုပ်လုပ်စေဖို့ကိုတော့ ansible_python_interpreter
ဆိုတဲ့ variable နဲ့ထည့်သွင်း ကြေငြာပေးဖို့လိုပါတယ်။ ဥပမာအနေနဲ့ inventory ဖိုင်ထဲမှာဆိုရင်တော့ -
[rhel5]
srv01.example.com ansible_python_interpreter=/usr/bin/python26
[rhel5]
srv01.example.com
srv02.example.com
[rhel5:vars]
ansible_python_interpreter=/usr/bin/python26
စသဖြင့် ကြေငြာပေးလို့ရပါတယ်။
(၃) နောက်ဆုံးနည်းလမ်းကတော့ Managed Node မှာရှိတဲ့ Python ကိုလုံးဝမသုံးပဲ သာမန် SSH နဲ့လှမ်းဝင်ပြီး Shell Command တွေ၊ Script တွေ Run သလိုမျိုး လုပ်ဆောင်ပေးတဲ့ Raw နဲ့ Script Module ကိုသုံးတဲ့နည်းပါပဲ။ ဒီနည်းလမ်းကိုသုံးပြီး Python version နိမ့်နေတဲ့ Managed Node တွေကို Python 2.6 install လုပ်ခိုင်းနိုင်ပါတယ်။
py26install.sh
#!/bin/bash
wget https://archives.fedoraproject.org/pub/archive/epel/epel-release-latest-5.noarch.rpm --no-check-certificate
wget https://archives.fedoraproject.org/pub/archive/epel/RPM-GPG-KEY-EPEL-5 --no-check-certificate
rpm --import RPM-GPG-KEY-EPEL-5
yum install -y epel-release-latest-5.noarch.rpm
yum install -y python26
py26install.yml
---
- name: install python 2.6 in remote legacy system
hosts: rhel5
gather_facts: no
tasks:
- name: execute py26install.sh script on target system
script:
py26install.sh
- name: execute raw command to check version
raw:
python26 -V
Python ကိုအခြေခံထားတဲ့ module တွေသုံးမရသည့်တိုင်အောင် shell command/script တွေကိုတိုက်ရိုက် run ပြီး Manage လုပ်နိုင်ပါတယ်။ Python version မကိုက်ညီတဲ့ပြဿနာရှိနေတာကြောင့် gather_facts ကိုတော့သုံးလို့ရမှာမဟုတ်ပါဘူး။ ဒါကြောင့် gather_facts: no
နဲ့ပိတ်ထားဖို့လိုပါတယ်။
အချုပ်အနေနဲ့ပြောရမယ်ဆိုရင်တော့ RHEL 5 လိုမျိုး Legacy System တွေကို မဖြစ်မနေ Ansible နဲ့ Automate လုပ်ရမယ်ဆိုရင် ဖော်ပြထားတဲ့နည်းလမ်းတွေထဲက အဆင်အပြေဆုံးနည်းလမ်းကိုသုံးလို့ရပါတယ်။ ဆယ်စုနှစ်တစ်ခုလောက် ပြဿနာမရှိပဲ run လာတဲ့ System မျိုးကို မထိရက်မကိုင်ရက်တာ နားလည်ပါတယ်။ သို့ပေမဲ့ November 30, 2020 မှာ Support ရပ်နားတော့မယ့် RHEL 5 ကို ဆက်လက်အသုံးပြုနိုင်အောင် ကြိုးစားနေတာထက် ဖြစ်နိုင်မယ်ဆိုရင် version အသစ်ကို ပြောင်းလဲအသုံးပြုဖို့ (Migration) စတင်ပြင်ဆင်တာကတော့ အကောင်းဆုံးဖြစ်မယ်လို ထင်မြင်မိပါတယ်။
Reference: Using Ansible to Manage RHEL 5 Yesterday, Today and Tomorrow