మంచి రోజు
మేము అనేక క్లౌడ్ క్లస్టర్లను కలిగి ఉన్నాము, ప్రతి దానిలో పెద్ద సంఖ్యలో వర్చువల్ మిషన్లు ఉన్నాయి. మేము ఈ మొత్తం వ్యాపారాన్ని Hetzner వద్ద హోస్ట్ చేస్తాము. ప్రతి క్లస్టర్లో మనకు ఒక మాస్టర్ మెషీన్ ఉంటుంది, దాని నుండి ఒక స్నాప్షాట్ తీసుకోబడుతుంది మరియు క్లస్టర్లోని అన్ని వర్చువల్ మిషన్లకు స్వయంచాలకంగా పంపిణీ చేయబడుతుంది.
ఈ పథకం సాధారణంగా గిట్లాబ్-రన్నర్లను ఉపయోగించడానికి అనుమతించదు, ఎందుకంటే చాలా మంది ఒకేలాంటి నమోదిత రన్నర్లు కనిపించినప్పుడు చాలా సమస్యలు తలెత్తుతాయి, ఇది ఒక పరిష్కారాన్ని కనుగొని, ఈ కథనం/మాన్యువల్ని వ్రాయడానికి మమ్మల్ని ప్రేరేపించింది.
ఇది బహుశా ఉత్తమ అభ్యాసం కాదు, కానీ ఈ పరిష్కారం సాధ్యమైనంత సౌకర్యవంతంగా మరియు సరళంగా అనిపించింది.
ట్యుటోరియల్ కోసం, దయచేసి పిల్లిని చూడండి.
మాస్టర్ మెషీన్లో అవసరమైన ప్యాకేజీలు:
- పైథాన్
- వెళ్ళండి
- ssh కీలతో ఫైల్
అన్ని వర్చువల్ మెషీన్లపై ఆటోమేటిక్ గట్ పుల్ని అమలు చేసే సాధారణ సూత్రం ఏమిటంటే, మీకు అన్సిబుల్ ఇన్స్టాల్ చేయబడే యంత్రం అవసరం. ఈ మెషీన్ నుండి, ansible git పుల్ ఆదేశాలను పంపుతుంది మరియు నవీకరించబడిన సేవను పునఃప్రారంభిస్తుంది. ఈ ప్రయోజనాల కోసం, మేము క్లస్టర్ల వెలుపల ప్రత్యేక వర్చువల్ మెషీన్ను సృష్టించాము మరియు దానిపై ఇన్స్టాల్ చేసాము:
- పైథాన్
- జవాబుదారీతనం
- గిట్లాబ్-రన్నర్
సంస్థాగత సమస్యల నుండి - మీరు gitlab-rannerని నమోదు చేసుకోవాలి, ssh-keygenని తయారు చేయాలి, ఈ మెషీన్ యొక్క పబ్లిక్ ssh కీని అప్లోడ్ చేయాలి .ssh/authorized_keys
మాస్టర్ మెషీన్లో, మాస్టర్ మెషీన్లో అన్సిబుల్ కోసం పోర్ట్ 22ని తెరవండి.
ఇప్పుడు ఆన్సిబుల్ని కాన్ఫిగర్ చేద్దాం
సాధ్యమయ్యే ప్రతిదాన్ని ఆటోమేట్ చేయడమే మా లక్ష్యం కాబట్టి. ఫైల్లో /etc/ansible/ansible.cfg
మేము లైన్ను అన్కమెంట్ చేస్తాము host_key_checking = False
తద్వారా కొత్త యంత్రాల నిర్ధారణ కోసం అన్సిబుల్ అడగదు.
తర్వాత, మీరు యాన్సిబుల్ కోసం ఆటోమేటిక్గా ఇన్వెంటరీ ఫైల్ను రూపొందించాలి, అది మీరు git పుల్ చేయాల్సిన మెషీన్ల ipని ఎక్కడ నుండి తీసుకుంటుంది.
మేము Hetzner APIని ఉపయోగించి ఈ ఫైల్ని రూపొందిస్తాము, మీరు మీ AWS, Asure, డేటాబేస్ నుండి హోస్ట్ల జాబితాను తీసుకోవచ్చు (మీ రన్నింగ్ మెషీన్లను ప్రదర్శించడానికి మీకు ఎక్కడో API ఉంది, సరియైనదా?).
ఇన్వెంటరీ ఫైల్ యొక్క నిర్మాణం అన్సిబుల్ కోసం చాలా ముఖ్యమైనది; ఇది ఇలా ఉండాలి:
[группа]
ip-адрес
ip-адрес
[группа2]
ip-адрес
ip-адрес
అటువంటి ఫైల్ను రూపొందించడానికి, మేము ఒక సాధారణ స్క్రిప్ట్ని తయారు చేస్తాము (దీనిని పిలుద్దాం vm_list
):
#!/bin/bash
echo [group] > /etc/ansible/cloud_ip &&
"ваш CLI запрос на получение IP запущенных машин в кластере" >> /etc/ansible/cloud_ip
echo " " >> /etc/ansible/cloud_ip
echo [group2] > /etc/ansible/cloud_ip &&
"ваш CLI запрос на получение IP запущенных машин в другом кластере" >> /etc/ansible/cloud_ip
ఇది Ansible పనిచేస్తుందో లేదో మరియు IP చిరునామాలను స్వీకరించడంలో స్నేహపూర్వకంగా ఉందో లేదో తనిఖీ చేయడానికి ఇది సమయం:
/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'hostname' group
అవుట్పుట్లో ఆదేశం అమలు చేయబడిన మెషీన్ల హోస్ట్నేమ్లు ఉండాలి.
సింటాక్స్ గురించి కొన్ని మాటలు:
- /etc/ansible/./vm_list - యంత్రాల జాబితాను రూపొందించండి
- -i - ఇన్వెంటరీ ఫైల్కు సంపూర్ణ మార్గం
- -m - షెల్ మాడ్యూల్ని ఉపయోగించమని అన్సిబుల్కు చెప్పండి
- -a అనేది వాదన. ఏదైనా కమాండ్ ఇక్కడ నమోదు చేయవచ్చు
- సమూహం - మీ క్లస్టర్ పేరు. మీరు దీన్ని అన్ని క్లస్టర్లలో చేయవలసి వస్తే, సమూహాన్ని అందరికీ మార్చండి
మరింత ముందుకు వెళ్దాం - మన వర్చువల్ మెషీన్లలో జిట్ పుల్ చేయడానికి ప్రయత్నిద్దాం:
/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'cd /path/to/project && git pull' group
అవుట్పుట్లో మనం ఇప్పటికే తాజాగా లేదా రిపోజిటరీ నుండి అన్లోడ్ చేస్తున్నట్లయితే, ప్రతిదీ పని చేస్తుంది.
ఇప్పుడు ఇదంతా ఉద్దేశించబడింది
గిట్లాబ్లో మాస్టర్ బ్రాంచ్కు కట్టుబడి ఉన్నప్పుడు ఆటోమేటిక్గా రన్ అయ్యేలా మన స్క్రిప్ట్ని నేర్పిద్దాం
ముందుగా, మన స్క్రిప్ట్ను మరింత అందంగా తీర్చిదిద్ది, దానిని ఎక్జిక్యూటబుల్ ఫైల్లో ఉంచుదాం (దీనిని exec_pull అని పిలుద్దాం) -
#!/bin/bash
/etc/ansible/./get_vms && ansible -i /etc/ansible/cloud_ip -m shell -a "$@"
మన గిట్లాబ్కి వెళ్లి ప్రాజెక్ట్లో ఫైల్ని క్రియేట్ చేద్దాం .gitlab-ci.yml
మేము ఈ క్రింది వాటిని లోపల ఉంచాము:
variables:
GIT_STRATEGY: none
VM_GROUP: group
stages:
- pull
- restart
run_exec_pull:
stage: pull
script:
- /etc/ansible/exec_pull 'cd /path/to/project/'$CI_PROJECT_NAME' && git pull' $VM_GROUP
only:
- master
run_service_restart:
stage: restart
script:
- /etc/ansible/exec_pull 'your_app_stop && your_app_start' $VM_GROUP
only:
- master
అన్నీ సిద్ధంగా ఉన్నాయి. ఇప్పుడు -
- ఒక నిబద్ధత చేయండి
- ప్రతిదీ పని చేస్తున్నందుకు నేను సంతోషిస్తున్నాను
.ymlని ఇతర ప్రాజెక్ట్లకు బదిలీ చేస్తున్నప్పుడు, మీరు పునఃప్రారంభించడానికి సేవ యొక్క పేరు మరియు యాన్సిబుల్ ఆదేశాలు అమలు చేయబడే క్లస్టర్ పేరును మార్చాలి.
మూలం: www.habr.com