Ansible Playbooks
கட்டளைகளை தனித்தனியே இயக்குவதற்கு பதிலாக ஒரு கோப்பில் எழுதி, அக்கோப்பினை இயக்குவதன் மூலம் அனைத்து வேலைகளையும் செய்து கொள்ளலாம். இதற்கு Playbook என்று பெயர். இது yaml வடிவில் .yml என்ற extension கொண்டு சேமிக்கப்படுகிறது. இதில் குறிப்பிடப்படுகின்ற ஒவ்வொரு வேலையும் task என்று அழைக்கப்படுகின்றன.
Ansible ஆனது இந்த Playbook-ல் உள்ளவற்றைப் படித்து, hosts-ல் உள்ள ஒவ்வொரு கணிணியாக login செய்து, தரப்பட்ட கட்டளைகளை இயக்கிவிடும். பின் நமது கணிணிக்குத் திரும்பிவிடும்.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
– hosts: all | |
become: true | |
tasks: | |
– name: Update apt | |
apt: update_cache=yes | |
– name: Install mysql | |
apt: name=mysql-client state=latest |
நிரலுக்கான விளக்கம்:
hosts:all என்பது hosts கோப்பில் உள்ள எல்லாக் கணினிகளையும் குறிக்கும். இவ்வாறு அல்லாமல் ஒரு குறிப்பிட்ட பெயரை அளித்து அக்குழுவில் உள்ள கணினிகளில் மட்டும் இயக்குமாறும் செய்யலாம்.
become:true என்பது sudo-ஆக கட்டளைகளை இயக்க உதவும்.
tasks: இதன் கீழ் அனைத்து வேலைகளும் தொடர்ச்சியாக கொடுக்கப்படுகின்றன. ஒவ்வொன்றுக்கும் -name ஐத் தொடர்ந்து ஒரு பெயர் அளிக்கப்படுகிறது. பின் apt என்ற மாடியூலைப் பயன்படுத்தி apt-get update-ஐ இயக்கியபின் docker-ஐ நிறுவுவதற்கான கட்டளை கொடுக்கப்பட்டுள்ளது.
ansible-playbook என்ற கட்டளை மூலம் இதை நாம் இயக்கலாம்.
$ ansible-playbook playbook1.yml
வெளியீட்டின் விளக்கம்:
Ansible சூழலை ஆராயும் என்று ஏற்கெனவே பார்த்தோம் அல்லவா! அதேபோல் முதல் வேலையாக சூழலை ஆராய்ந்து TASK [Gathering Facts] என்பதன் கீழ், ஒரு சர்வரில் எல்லாம் சரியாக உள்ளது. மற்றொரு சர்வரில் sudo கொண்டு கட்டளையை இயக்கும் போது பாஸ்வேர்ட் கேட்டு நிற்கிறது என்பதை வெளிப்படுத்தியுள்ளது. இதுவே failed=1 என கடைசியில் வெளிப்படக் காரணம். ஆகவே எந்த சர்வரில் எல்லாம் சரியாக உள்ளதோ அதில் மட்டும் சென்று மற்ற இரண்டு வேலைகளை செய்கிறது. பொதுவாக Ansible செய்ய வேண்டிய வேலை அக்கணினியில் ஏற்கனவே செய்யப்பட்டிருந்தால் அதனை ok எனவும், அவ்வாறில்லாமல் Ansible மூலம் செய்யப்பட்டால் அதனை changed எனவும் வெளிப்படுத்தும். இங்கு Update apt எனும் வேலையின் கீழ் changed எனவும், Install docker எனும் வேலையின் கீழ் ok எனவும் வெளிப்படுத்தியுள்ளதைக் காணலாம். அதாவது update apt கட்டளையை இயக்கி வேலை செய்துள்ளதால் அதனை changed எனவும், docker ஏற்கனவே இன்ஸ்டால் செய்யப்பட்டிருப்பதால் அதனை ok எனவும் வெளிப்படுத்தியுள்ளது.
அடுத்து failed என வந்துள்ள சர்வரில் சென்று sudo கொண்டு கட்டளையை இயக்கிப் பார்க்கவும்.
$ ssh shrini@139.59.47.5
$ sudo apt-get install docker
ஆம். பாஸ்வேர்ட் கேட்டு நிற்கிறது. எனவே தான் Ansible-ஆல் இந்த சர்வரில் எதுவும் செய்ய முடியவில்லை. இதைத் தவிர்க்க /etc/sudoers.d எனும் கோப்பில் சில மாற்றங்களை செய்ய வேண்டும். இது பின்வருமாறு.
$ sudo visudo
shrini ALL=(ALL) NOPASSWD:ALL
ctrl+O, Enter, ctrl+X
இப்போது sudo கட்டளையை இயக்கிப் பார்த்தால், அது பாஸ்வேர்ட் எதுவும் கேட்காமல் இயங்குவதைக் காணலாம்.
ஆகவே மீண்டும் ஒருமுறை playbook-ஐ இயக்கவும். அது எவ்விதத் தடையும் இன்றி இரு சர்வர்களிலும் கட்டளைகளை இயக்கி முடிப்பதைக் காணலாம்.
Modules
அடுத்ததாக பல்வேறு வேலைகளைச் செய்ய உதவும் பல்வேறு Modules-ஐப் பற்றி இந்தப் பகுதியில் காணலாம். அனைத்து சர்வர்களிலும் சென்று ஒரு டைரக்டரியை உருவாக்குதல், நீக்குதல் போன்ற விஷயங்களை மாடியூல் கொண்டு எவ்வாறு செய்வது என playbook2.yml எனும் கோப்பிற்குள் கொடுத்துள்ளோம். மேலும் kafka-வை பதிவிறக்கம் செய்து extract செய்தல், அதன் config கோப்புகளில் மாற்றம் செய்தல் போன்ற விஷயங்களை செய்வதற்கான கட்டளைகளை ஏற்கனவே பார்த்தோம். அவற்றை மாடியூல் கொண்டு எவ்வாறு செய்வது எனவும் இங்கு குறிப்பிட்டுள்ளோம். இவை பின்வருமாறு.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
– hosts: all | |
become: true | |
tasks: | |
– name: create directory | |
file: state=directory path=kafka_test | |
file: state=directory path=/opt/kafka_test | |
– name: delete directory | |
file: state=absent path=kafka_test | |
– name: Download kafka | |
get_url: | |
url: downloads.apache.org/kafka/2.5.0/kafka_2.12-2.5.0.tgz | |
dest: /opt/kafka_test/ | |
– name: Extract archive | |
unarchive: | |
src: /opt/kafka_test/kafka_2.12-2.5.0.tgz | |
dest: /opt/kafka_test | |
remote_src: yes | |
– name: Edit config file | |
lineinfile: | |
path: /opt/kafka_test/kafka_2.12-2.5.0/config/server.properties | |
line: listeners=PLAINTEXT://localhost:9092 | |
insertbefore: BOF |
நிரலுக்கான விளக்கம்:
இதில் kafka_test எனும் டைரக்டரி, ஹோம் ஃபோல்டரின் கீழும், /opt ஃபோல்டரின் கீழும் உருவாக்கப்பட்டுள்ளது. பின் ஹோம் ஃபோல்டரின் கீழ் உருவானது நீக்கப்படுகிறது. இவ்விரண்டு செயல்களுக்கும் file எனும் மாடியூல் பயன்படுகிறது. பின் get_url எனும் மாடியூலுக்கு எந்த முகவரியிலிருந்து பதிவிறக்கம் செய்ய வேண்டும், எந்த இடத்தில் செய்ய வேண்டும் என்பதை parameters-ஆக அளிப்பதன் மூலம் kafka பதிவிறக்கம் செய்யப்படுகிறது. unarchive என்ற மாடியூல் மூலம் extract செய்யப்படுகிறது. பின் அதன் config ஃபோல்டருக்குள் server.properties எனும் கோப்பில் listeners-ன் மதிப்பை localhost என அமைப்பதற்கு lineinfile எனும் மாடியூல் பயன்படுகிறது.
ansible-playbook என்ற கட்டளை மூலம் இதனை இயக்கவும்.
$ ansible-playbook playbook2.yml
அதன் வெளியீடு பின்வருமாறு.
Variables & Handlers
Playbook2-ல் குறிப்பிட்டுள்ள அனைத்து வேலைகளுக்கும் வெவ்வேறு மாடியூல்களைப் பயன்படுத்தாமல், வெறும் ஷெல் மாடியூலை மட்டும் வைத்துக் கூட எழுதலாம். இது பின்வருமாறு.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
– hosts: all | |
vars: | |
url: "downloads.apache.org/kafka/2.5.0/kafka_2.12-2.5.0.tgz" | |
become: true | |
tasks: | |
– name: kafka steps | |
shell: | |
cmd: mkdir kafka_test | |
cmd: mkdir /opt/kafka_test | |
cmd: rmdir kafka_test | |
cmd: cd /opt/kafka_test | |
cmd: wget "{{url}}" | |
cmd: tar -xzf kafka_2.12-2.5.0.tgz | |
cmd: cd kafka_2.12-2.5.0/config/ | |
cmd: echo "listeners=PLAINTEXT://localhost:9092" >> server.properties | |
notify: | |
– start services | |
– stop services | |
handlers: | |
– name: start services | |
shell: | |
cmd: /opt/kafka_test/kafka_2.12-2.5.0/bin/zookeeper-server-start.sh /opt/kafka_test/kafka_2.12-2.5.0/config/zookeeper.properties & | |
– name: stop services | |
shell: | |
cmd: exit |
ஆனால், இந்த முறை சரியானது அல்ல. ஒரு bash script செய்யும் வேலையை மட்டுமே இது செய்கிறது. Indempotence அதாவது ஒரே வேலையை எந்த பாதிப்பும் இன்றி, எத்தனை முறை வேண்டுமானாலும் இயக்கிப் பார்க்கும் வசதியை module-கள் மட்டுமே தருகின்றன. சரியான module-ஐப் பயன்படுத்துவதன் மூலம், எந்தப் பிழையும் இன்றி கட்டளைகள் இயங்குவதை உறுதிபடுத்தலாம்.
இதில் variables மற்றும் handlers ஆகியவை பயன்படுத்தப்பட்டுள்ளது. vars எனும் பகுதியின் கீழ் variable-களை வரையறுக்கலாம். இங்கு url எனும் variable வரையறுக்கப்பட்டு, அது wget எனும் கட்டளையைத் தொடர்ந்து பயன்படுத்தப்பட்டுள்ளது.
Handlers என்பதும் Task போலத்தான். ஒரு வேலையைச் செய்ய உதவும். ஆனால், இதை வேறு ஒரு Task வழியாகவே இயக்கமுடியும். அதாவது ஒரு செயலுக்காகக் காத்திருந்து, அது நடந்தவுடன் தன் செயலைத் துவங்கும். Event System போல. இதன் மூலம் பல துணைச் செயல்களைச் செய்யலாம். உதாரணம், ஒரு Network service நிறுவியவுடன், அதைத் தொடங்குதல். ஒரு configuration file மாற்றியவுடன், அதன் service ஐ reload செய்தல் போன்றவை.
இங்கு நாம் எழுதிய handlers ன் பெயர் start services, stop services. இதை kafka- வின் config file- ஐ மாற்றியவுடன் நாம் அழைத்துள்ளோம்.. ஒரு Task ல் Notify பகுதி இருந்தால், Task முடிந்தவுடன், Notify ல் கூறப்பட்டுள்ள handler-ஆனது இயக்கப்படுகிறது. அது முடிந்தவுடன் மீண்டும் Task-ல் கூறப்பட்டுள்ள அடுத்த வேலையைச் செய்ய சென்று விடுகிறது. ஆகவே இதனை ஒரு function-க்குச் சமமாகக் கூறலாம்.
இதனை இயக்குவதற்கான கட்டளை பின்வருமாறு.
$ ansible-playbook playbook3.yml
Roles
Modules, Variables, Handlers போன்ற அனைத்தையும் ஒரே playbook- இன் பல்வேறு பகுதிகளாக வரையறுக்காமல் Role என்ற ஒன்றை உருவாக்கி அதன்கீழ் அமையும் கோப்புகளுக்குள் ஒவ்வொன்றையும் தனித்தனியே வரையறுக்கலாம். பின் மற்றொரு playbook வழியே இந்த role-ஐ இயக்குவதன் மூலம் அனைத்தையும் ஒன்றாக இயக்கலாம்.
ansible-galaxy என்ற கட்டளை Role- ஐ உருவாக்கப் பயன்படுகிறது. இங்கு playbook4 எனும் பெயரில் role உருவாக்கப்பட்டுள்ளது. அதன்கீழ் பல்வேறு directories அமைந்திருப்பதைக் காணலாம்.
$ ansible-galaxy init playbook4
ஒவ்வொரு டைரக்டரியின் கீழும் பல்வேறு விஷயங்களுக்கான yml கோப்புகள் காணப்படும்.
$ tree playbook4
மேற்கண்ட பகுதியில் நாம் மொத்தமாக ஒரே பிளேபுக்கில் எழுதிய நிரல்களை இப்போது தனித்தனியாகப் பிரித்து அதற்கான கோப்பில் சென்று தனித்தனியாக எழுதி சேமிக்கவும்.
கடைசியாக ஒரு புதிய playbook-ஐ உருவாக்கி அதற்குள் நம்முடைய role- ஐப் பின்வருமாறு அழைப்பதன் மூலம் அனைத்து செயல்களையும் செய்து விடலாம்.
இதன் வெளியீடு பின்வருமாறு.