எளிய தமிழில் DevOps-12

Ansible

உங்களிடம் ஒரு லினக்ஸ் சர்வர் உள்ளது. இதில் இன்று நீங்கள் 8 மென்பொருட்களை நிறுவ வேண்டும். 15 மென்பொருட்களை மேம்படுத்த வேண்டும். 2 மென்பொருட்களை நீக்க வேண்டும். எப்படிச் செய்வீர்கள்? அவற்றுக்கான கட்டளைகளை ஒன்றன் பின் ஒன்றாகத்தான் தருவீர்கள். சரிதானே. இதே வேலையை 5 சர்வர்களில் செய்ய வேண்டும் என்றால்? ஒவ்வொரு சர்வராக login செய்து எல்லாக் கட்டளைகளையும் இயக்க வேண்டியதுதான். இதுவே 50 சர்வர், 100 சர்வர் என்றால்? ஒவ்வொன்றிலும் login செய்து அதே கட்டளைகளைத் திரும்பத்திரும்ப இயக்குவது என்பது சற்று கடினமான வேலை தான்.

Ansible என்பது ஒரே கணிணியில் இருந்துகொண்டே பல்வேறு கணினிகளில் உள்நுழைந்து பல்வேறு மென்பொருட்களை நிறுவுதல், நீக்குதல், மேம்படுத்துதல், நிர்வகித்தல் போன்ற பல கட்டளைகளை இயக்க உதவுகிறது. Bash script-ம் இதே வேலையைச் செய்தாலும் அதனிடம் சூழலை ஆராயும் திறன் இல்லை. உதாரணமாக ஒரு பெரிய bash script-ன் ஒரு பகுதியாக 10 மென்பொருட்களை நீக்கும் கட்டளை உள்ளது என வைத்துக் கொள்வோம். முதன்முறை அவற்றை இயக்கும்போது அதன் வேலையைச் செய்யும். அதே script-ஐ இரண்டாவது முறை இயக்கும்போது பிழைச்செய்தி வெளிப்பட்டு பாதியிலேயே நின்று விடும். ஏனெனில் அதைத்தான் ஏற்கெனவே நீக்கி விட்டதே. ஆகவே ஏற்கெனவே நீக்கப் பட்டிருந்தால், அவற்றை மீண்டும் நீக்க முயலக்கூடாது என்பதையும் நாம்தான் கட்டளையாக எழுத வேண்டும். இங்குதான் Ansible-ன் சூழலை ஆராயும் திறன் நமக்குப் பயன்படும். இதே வேலையை Ansible கொண்டு செய்யும் போது 10 மென்பொருட்களும் இருக்கின்றனவா, இல்லையா என்பதை ஆராய்ந்து, உண்மைகளைப் (Facts) பெற்று, அதனடிப்படையில் தனது வேலையைத் தொடங்கும். ஆகவே ஏற்கெனவே நீக்கப்பட்டிருந்தால் விட்டுவிடும். இல்லையெனில் நீக்கிவிடும். அவ்வளவுதான். இதனால், Ansible Script-களை எத்தனை முறை வேண்டுமானாலும் இயக்கிப் பார்க்கலாம். எந்தப் பிழையும் வெளிப்படுத்தாது.
மேலும் bash script-ல் ஒவ்வொரு சர்வருக்கும் ஏற்ப கட்டளைகள் மாறுபடும். சில சர்வர்களில் apt-get install, சிலவற்றில் yum install என ஒரே விஷயத்திற்குப் பல மாதிரி கட்டளைகள் இருக்கும். இப்பிரச்சினையையும் ansible லாவகமாகக் கையாள்கிறது. அனைத்து சர்வர்களுக்கும் பொதுவான வகையில் Module என்ற ஒன்றைப் பயன்படுத்தி அதன் மூலம் தனது வேலைகளைச் செய்கிறது. இதுபோன்று பல கணினிகளில் திரும்பத்திரும்ப செய்யப்படும் வேலைகளை தானியக்கமாகச் செய்து முடிப்பதற்கு configuration management என்ற வகையிலான மென்பொருட்கள் பயன்படுகின்றன. அவற்றில் Puppet, chef, salt, ansible போன்றவை பிரபலமான கட்டற்ற மென்பொருட்கள் ஆகும். puppet, Chef, salt போன்றவை client-server முறையில் இயங்குபவை. ஒவ்வொரு கணிணியிலும் ஒரு client மென்பொருள் இயங்க வேண்டும். ஆனால் ansible-க்கு வெறும் ssh அனுமதி மட்டுமே போதும். அதன் வழியே login செய்து எல்லா வேலைகளையும் செய்துவிடும்.

Ansible கற்றுக் கொள்ள, நம்மிடம் பல சர்வர்கள் இருக்கவேண்டிய அவசியம் இல்லை. நம்மிடம் கணிணியே போதும். அவற்றிலேயே LXC Container மூலம் பல குட்டி மாயக்கணிணிகள் உருவாக்க முடியும். மேலும் VirtualBox, Vagrant, Xen மூலமும் பல மாயக் கணிணிகள் உருவாக்கி, அவற்றை Ansbile மூலம் பராமரிக்கலாம்.

Installation

Ansible முற்றிலும் பைதான் மொழியில் எழுதப்பட்டது. எல்லா GNU/Linux கணிணிகளிலும் பைதான் இயல்பாகவே இருக்கும்.

$ sudo pip install ansible

என்ற கட்டளை வழியே எளிதில் நிறுவலாம். நிறுவியவுடன் /etc/ansible/hosts என்ற இடத்தில் சென்று நாம் தொடர்பு கொள்ள வேண்டிய அனைத்துக் கணினிகளின் ip முகவரிகளையும் குறிப்பிட வேண்டும்.

$ sudo vim /etc/ansible/hosts

[db]
139.59.47.5
35.166.185.40

இதற்கு db என்று ஒரு பொதுப்பெயர் இங்கு தரப்பட்டுள்ளது. இப்போதைக்கு இந்த பொதுப்பெயர் மட்டும் போதும். வேண்டுமெனில் பல groups, range of address, variable, dynamic inventory, fancy setup போன்ற பலவற்றையும் தரலாம். இதுவே Inventory file என்று அழைக்கப்படுகிறது.

Ansible பொதுவாக /etc/ansible/hosts என்ற கோப்பையே படிக்கிறது. வேறு இடத்தில் இந்தக் கோப்பை வைத்தால், அதன் இடத்தை தனியே குறிப்பிட்டுச் சொல்ல வேண்டும்.

இது Agentless என்ற முறையில் இயங்குவதால், இங்கு குறிப்பிட்டுள்ள முகவரிகளில் சென்று வேறு எதுவும் நிறுவத் தேவை இல்லை. அவற்றை ssh வழியே login செய்யும் அனுமதி மட்டும் இருந்தால் போதும்.
பொதுவாக Secured Shell (ssh) -ஐப் பயன்படுத்தி மற்ற கணினிகளுக்குள் நுழையும் போது ஒவ்வொரு முறையும் சரியான கடவுச்சொல்லை அளித்தால் மட்டுமே உள்நுழைய முடியும். Ansible மூலம் தானியக்க முறையில் உள்நுழையும் போது இவ்வாறு பாஸ்வேர்ட் கேட்டு நிற்கக்கூடாது. ஆகவே நமது கணினியின் ssh-க்கு பொதுத் திறவுகோல் என்று ஒன்று இருக்கும். அதற்கான சான்றிதழை எடுத்து நமது கணினி மற்றும் மற்ற கணினிகளின் அங்கீகரிக்கப்பட்ட திறவுகோல்களின் பட்டியலில் இணைக்க வேண்டும். இது பின்வருமாறு.

$ ssh-keygen

இக்கட்டளை நமது home directory-ல் .rsa எனும் folder-ஐ உருவாக்கி, அதற்குள் பின்வருமாறு கோப்புகளை உருவாக்கும்.
• id_rsa (தனிப்பட்ட திறவுகோல்)
• id_rsa.pub (பொதுவான திறவுகோல்)
• authorised_keys (அங்கீகரிக்கப்பட்ட திறவுகோல்கள்)
இதில் id_rsa.pub என்பதுதான் SSH-க்கான சான்றிதழ். இதனை நம் கணினியின் authorised_keys என்பதற்குள் போட வேண்டும்..

$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys 

அவ்வாறே மற்ற கணினிகளுக்குள்ளும் ssh மூலம் உள்நுழைந்து private key, public key, authorised_keys ஆகிய மூன்றையும் உருவாக்க வேண்டும். இங்கு பாஸ்வேர்ட் கொடுத்து உள்நுழைந்துள்ளோம்.

$ ssh shrini@139.59.47.5
$ ssh-keygen

இக்கணினியில் பாஸ்வேர்டுக்கு நிகரான pem file மூலம் உள்நுழைந்துள்ளோம்.
$ ssh -i /home/shrini/shrini-freepem.pem ubuntu@35.166.185.40
$ ssh-keygen

பின் SCP மூலம் நம் கணினியின் பொதுத் திறவுகோலை இவ்விரு கணினிகளின் authorised_keys உள்ளும் போட வேண்டும்..

$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ scp ~/.ssh/id_rsa.pub shrini@139.59.47.5:/home/shrini/.ssh/authorized_keys
$ scp -i /home/shrini/shrini-freepem.pem ~/.ssh/id_rsa.pub ubuntu@35.166.185.40:/home/ubuntu/.ssh/authorized_keys

அவ்வளவுதான்! இனி மேல் ஒரே கணினியில் இருந்து கொண்டே மற்ற இரு கணினிகளுக்கு உள்ளும் கடவுச்சொல் இல்லாமலேயே உள்நுழைந்து வேண்டிய வேலைகளைச் செய்து கொள்ளலாம்..

Commands

இப்போது குறிப்பிட்ட சில கட்டளைகளை அனைத்து சர்வர்களிலும் இயக்கிப் பார்க்கலாமா?
Ansible-ஐப் பொறுத்த வரை ஒவ்வொரு பணிக்கும் ஓவ்வொரு Module-ஐப் பயன்படுத்துகிறது. Module மூலம் மென்பொருள் நிறுவுதல், கோப்புகளை நகல் எடுத்தல், உருவாக்குதல், திருத்துதல் என Commandline-ல் நாம் செய்யும் எதையும் செய்யலாம். நேரடியாக command மூலம் செய்யாமல், அவற்றுக்கான module மூலம் செய்தால், பலன்கள் அதிகம்.
இந்த Modules-தான் என்ன செய்ய வேண்டுமோ அவை ஏற்கனவே அக்கணினிகளில் செய்யப்பட்டு விட்டதா என்பதை ஆராய்ந்து உண்மைகளை(Facts) பெற்று, அதனடிப்படையில் செயல்களைத் தொடங்குவதற்கு ஆதாரமாக இருக்கின்றன.
ping என்ற கட்டளையை எல்லா சர்வர்களிலும் இயக்குவதற்கான ansible கட்டளை கீழ்க்கண்டவாறு அமையும். -m என்பதைத் தொடர்ந்து ping என்ற module-ஐக் கொடுப்பதன் மூலம் இதனை செய்கிறது. all என்பது அனைத்து சர்வர்களிலும் இந்த மாடியூலை இயக்க வேண்டும் என்பதைக் குறிக்கிறது.

$ ansible all -m ping

JSON வடிவில் இருக்கும் இதன் வெளியீட்டில் ஒரு சர்வரில் மட்டும் சென்று வெற்றிகரமாக ping செய்துள்ளதைக் காணலாம். 35.166.185.40 என்ற சர்வரைத் தொடர்பு கொள்ள முடியாமல் பிழைச்செய்தியை வெளிப்படுத்தியுள்ளது. ஏனெனில் shrini என்ற பயனராக Ansbile script-ஐ இயக்கும்போது, உங்கள் சர்வர்களிலும் அதே பயனராகவே login செய்யப்படும். எனவேதான் shrini என்ற பயனரைக் கொண்ட ஒரு கணினியில் கட்டளை வெற்றிகரமாக இயக்கப்பட்டுவிட்டது. ஆனால் மற்றொரு கணினியிலோ ubuntu என்ற பயனராக உள்நுழைய வேண்டும். அதனால்தான் பிழைச்செய்தி ஏற்பட்டுள்ளது. ஆகவே host file-ல் ஐ.பி முகவரியைக் குறிப்பிடும் இடத்திலேயே எந்தப் பயனராக உள்நுழைய வேண்டும் என்பதையும் குறிப்பிடுவதன் மூலம் இப்பிரச்சினையைத் தவிர்க்கலாம்.

$ vim /etc/ansible/hosts
35.166.185.40 ansible_user=ubuntu 

மீண்டும் ping செய்து பார்க்கவும். இப்போது இரண்டு சர்வர்களிலும் கட்டளை வெற்றிகரமாக இயக்கப்பட்டு விட்டது.

அடுத்ததாக அனைத்து சர்வர்களிலும் சென்று date என்ற ஷெல் கட்டளையை இயக்குவதற்கான ansible கட்டளை கீழ்க்கண்டவாறு அமையும். இதில் -m என்பதைத் தொடர்ந்து ஷெல் மாடியூல் கொடுக்கப்பட்டுள்ளது. பின் அதன் argument-ஆக date என்ற கட்டளை அளிக்கப்பட்டுள்ளது.

$ ansible all -m shell -a ‘date’

இது அனைத்து சர்வர்களிலும் சென்று date-ஐ வெளிப்படுத்தியுள்ளதைக் காணலாம்.

%d bloggers like this: