Ansible + auto git เบ”เบถเบ‡เบขเบนเปˆเปƒเบ™เบเบธเปˆเบกเบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบเบชเบฐเป€เปเบทเบญเบ™เบขเบนเปˆเปƒเบ™เบ„เบฅเบฒเบง

Ansible + auto git เบ”เบถเบ‡เบขเบนเปˆเปƒเบ™เบเบธเปˆเบกเบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบเบชเบฐเป€เปเบทเบญเบ™เบขเบนเปˆเปƒเบ™เบ„เบฅเบฒเบง

เบกเบทเป‰เบ—เบตเปˆเบ”เบต

เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบกเบตโ€‹เบเบธเปˆเบกโ€‹เบŸเบฑเบ‡โ€‹เบˆเปเบฒโ€‹เบ™เบงเบ™โ€‹เบซเบ™เบถเปˆเบ‡โ€‹เบ—เบตเปˆโ€‹เบกเบตโ€‹เบˆเปเบฒโ€‹เบ™เบงเบ™โ€‹เบ‚เบฐโ€‹เบซเบ™เบฒเบ”โ€‹เปƒเบซเบเปˆโ€‹เบ‚เบญเบ‡ virtual machines เปƒเบ™โ€‹เปเบ•เปˆโ€‹เบฅเบฐโ€‹. เบžเบงเบเป€เบฎเบปเบฒเป€เบ›เบฑเบ™เป€เบˆเบปเป‰เบฒเบžเบฒเบšเบ—เบฑเบ‡เบซเบกเบปเบ”เบ™เบตเป‰เบขเบนเปˆ Hetzner. เปƒเบ™เปเบ•เปˆเบฅเบฐเบเบธเปˆเบกเบžเบงเบเป€เบฎเบปเบฒเบกเบตเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเปเบšเบšเบซเบ™เบถเปˆเบ‡, เบžเบฒเบšเบ–เปˆเบฒเบเป„เบ”เป‰เบ–เบทเบเป€เบญเบปเบฒเบกเบฒเบˆเบฒเบเบกเบฑเบ™เปเบฅเบฐเปเบˆเบเบขเบฒเบเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เปƒเบซเป‰เบเบฑเบšเป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบ virtual เบ—เบฑเบ‡เบซเบกเบปเบ”เบžเบฒเบเปƒเบ™เบเบธเปˆเบก.

เป‚เบ„เบ‡เบเบฒเบ™เบ™เบตเป‰เบšเปเปˆเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰ gitlab-runners เบ•เบฒเบกเบ›เบปเบเบเบฐเบ•เบด, เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบšเบฑเบ™เบซเบฒเบซเบผเบฒเบเบขเปˆเบฒเบ‡เป€เบเบตเบ”เบ‚เบทเป‰เบ™เป€เบกเบทเปˆเบญเบœเบนเป‰เปเบฅเปˆเบ™เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™เบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบซเบผเบฒเบ, เป€เบŠเบดเปˆเบ‡เบเบฐเบ•เบธเป‰เบ™เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบŠเบญเบเบซเบฒเบงเบดเบ—เบตเปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเปเบฅเบฐเบ‚เบฝเบ™เบšเบปเบ”เบ„เบงเบฒเบก / เบ„เบนเปˆเบกเบทเบ™เบตเป‰.

เบ™เบตเป‰เบญเบฒเบ”เบˆเบฐเบšเปเปˆเปเบกเปˆเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”, เปเบ•เปˆเบเบฒเบ™เปเบเป‰เป„เบ‚เบ™เบตเป‰เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบชเบฐเบ”เบงเบเปเบฅเบฐเบ‡เปˆเบฒเบเบ”เบฒเบเป€เบ—เบปเปˆเบฒเบ—เบตเปˆเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰.

เบชเปเบฒเบฅเบฑเบš tutorial, เบเบฐเบฅเบธเบ™เบฒเป€เบšเบดเปˆเบ‡ cat.

เบŠเบธเบ”เบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบšเบปเบ”:

  • python
  • เป„เบ›
  • เป„เบŸเบฅเปŒเบ—เบตเปˆเบกเบตเบ›เบธเปˆเบก ssh

เบซเบผเบฑเบเบเบฒเบ™เบ—เบปเปˆเบงเป„เบ›เบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบ”เบถเบ‡เบฅเปเบฒเป„เบชเป‰เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบ virtual เบ—เบฑเบ‡เบซเบกเบปเบ”เปเบกเปˆเบ™เบงเปˆเบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบเบ—เบตเปˆ Ansible เบˆเบฐเบ–เบทเบเบ•เบดเบ”เบ•เบฑเป‰เบ‡. เบˆเบฒเบเป€เบ„เบทเปˆเบญเบ‡เบ™เบตเป‰, ansible เบˆเบฐเบชเบปเปˆเบ‡เบ„เปเบฒเบชเบฑเปˆเบ‡ git pull เปเบฅเบฐ restart เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ›เบฑเบšเบ›เบธเบ‡. เบชเปเบฒเบฅเบฑเบšเบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบชเป‰เบฒเบ‡เป€เบ„เบทเปˆเบญเบ‡ virtual เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบขเบนเปˆเบ™เบญเบ clusters เปเบฅเบฐเบ•เบดเบ”เบ•เบฑเป‰เบ‡เบกเบฑเบ™:

  • python
  • เบ•เบญเบšเบฎเบฑเบšเป„เบ”เป‰
  • gitlab-runner

เบˆเบฒเบเบšเบฑเบ™เบซเบฒเบญเบปเบ‡เบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡ - เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™ gitlab-runner, เป€เบฎเบฑเบ” ssh-keygen, เบญเบฑเบšเป‚เบซเบฅเบ”เบฅเบฐเบซเบฑเบ” ssh เบชเบฒเบ—เบฒเบฅเบฐเบ™เบฐเบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบ™เบตเป‰เป„เบ›. .ssh/authorized_keys เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเปเบšเบš, เป€เบ›เบตเบ”เบžเบญเบ” 22 เบชเปเบฒเบฅเบฑเบš ansible เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบšเบปเบ”.

เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เป€เบฎเบปเบฒเบ•เบฑเป‰เบ‡เบ„เปˆเบฒ ansible

เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเป€เบ›เบปเป‰เบฒเบซเบกเบฒเบเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเปเบกเปˆเบ™เป€เบžเบทเปˆเบญเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบ—เบตเปˆเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰. เปƒเบ™เป„เบŸเบฅเปŒ /etc/ansible/ansible.cfg เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบˆเบฐ uncomment เป€เบชเบฑเป‰เบ™โ€‹ host_key_checking = Falseเบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™ ansible เบšเปเปˆเป„เบ”เป‰เบฎเป‰เบญเบ‡เบ‚เปเปƒเบซเป‰เบกเบตเบเบฒเบ™เบขเบทเบ™เบขเบฑเบ™เป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบเปƒเบซเบกเปˆ.

เบ•เปเปˆเป„เบ›, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบชเป‰เบฒเบ‡เป„เบŸเบฅเปŒเบ„เบปเบ‡เบ„เบฑเบ‡เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบชเปเบฒเบฅเบฑเบš ansible, เบˆเบฒเบเบšเปˆเบญเบ™เบ—เบตเปˆเบกเบฑเบ™เบˆเบฐเป€เบญเบปเบฒ ip เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบเบ—เบตเปˆเบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบฎเบฑเบ” git เบ”เบถเบ‡.

เบžเบงเบเป€เบฎเบปเบฒเบชเป‰เบฒเบ‡เป„เบŸเบฅเปŒเบ™เบตเป‰เป‚เบ”เบเปƒเบŠเป‰ API เบ‚เบญเบ‡ Hetzner, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบญเบปเบฒเบฅเบฒเบเบŠเบทเปˆเป€เบˆเบปเป‰เบฒเบžเบฒเบšเบˆเบฒเบเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™ AWS, Asure, เบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒ (เป€เบˆเบปเป‰เบฒเบกเบต API เบขเบนเปˆเบšเปˆเบญเบ™เปƒเบ”เบšเปˆเบญเบ™เบซเบ™เบถเปˆเบ‡เป€เบžเบทเปˆเบญเบชเบฐเปเบ”เบ‡เป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบเปเบฅเปˆเบ™เบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒ, เปเบกเปˆเบ™เบšเป?).

เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ‚เบญเบ‡เป„เบŸเบฅเปŒเบชเบดเบ™เบ„เป‰เบฒเบ„เบปเบ‡เบ„เบฑเบ‡เปเบกเปˆเบ™เบกเบตเบ„เบงเบฒเบกเบชเปเบฒเบ„เบฑเบ™เบซเบผเบฒเบเบชเปเบฒเบฅเบฑเบš Ansible เบกเบฑเบ™เบ„เบงเบ™เบˆเบฐเบกเบตเบฅเบฑเบเบชเบฐเบ™เบฐเบ™เบตเป‰:

[ะณั€ัƒะฟะฟะฐ]
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

เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ„เบงเบ™เบˆเบฐเบกเบตเบŠเบทเปˆเป‚เบฎเบ”เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบเบ—เบตเปˆเบ„เปเบฒเบชเบฑเปˆเบ‡เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”.
เบชเบญเบ‡เบชเบฒเบกเบ„เปเบฒเบเปˆเบฝเบงเบเบฑเบš syntax:

  • /etc/ansible/./vm_list โ€” เบชเป‰เบฒเบ‡เบฅเบฒเบเบŠเบทเปˆเป€เบ„เบทเปˆเบญเบ‡
  • -i - เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบขเปˆเบฒเบ‡เปเบ—เป‰เบˆเบดเบ‡เป„เบ›เบซเบฒเป„เบŸเบฅเปŒเบชเบดเบ™เบ„เป‰เบฒเบ„เบปเบ‡เบ„เบฑเบ‡
  • -m - เบšเบญเบ ansible เปƒเบซเป‰เปƒเบŠเป‰เป‚เบกเบ”เบนเบ™ shell
  • -a เปเบกเปˆเบ™เบเบฒเบ™เป‚เบ•เป‰เบ–เบฝเบ‡. เบชเบฒเบกเบฒเบ”เปƒเบชเปˆเบ„เปเบฒเบชเบฑเปˆเบ‡เปƒเบ”เป† เบ—เบตเปˆเบ™เบตเป‰
  • เบเบธเปˆเบก โ€” เบŠเบทเปˆโ€‹เบ‚เบญเบ‡โ€‹เบเบธเปˆเบกโ€‹เบ‚เบญเบ‡โ€‹เบ—เปˆเบฒเบ™โ€‹. เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰เปƒเบ™เบ—เบธเบเบเบธเปˆเบก, เบ›เปˆเบฝเบ™เบเบธเปˆเบกเป€เบ›เบฑเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”

เบชเบทเบšเบ•เปเปˆเป„เบ› - เบฅเบญเบ‡เป€เบฎเบฑเบ” git pull เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡ virtual เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ:

/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'cd /path/to/project && git pull' group 

เบ–เป‰เบฒเบซเบฒเบเบงเปˆเบฒเบขเบนเปˆเปƒเบ™เบœเบปเบ™เบœเบฐเบฅเบดเบ”เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป€เบซเบฑเบ™เปเบฅเป‰เบงเป€เบ–เบดเบ‡เบงเบฑเบ™เบ—เบตเบซเบผเบท unloading เบˆเบฒเบ repository, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เปเบกเปˆเบ™เป€เบฎเบฑเบ”เบงเบฝเบ.

เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบ™เบตเป‰เปเบกเปˆเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเบกเบฑเบ™เบซเบกเบฒเบเป€เบ–เบดเบ‡เบ—เบฑเบ‡เบซเบกเบปเบ”

เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบชเบญเบ™ script เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเปƒเบซเป‰เป€เบฎเบฑเบ”เบงเบฝเบเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆ committing เบเบฑเบšเบชเบฒเบ‚เบฒเบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบšเปƒเบ™ gitlab

เบ—เปเบฒเบญเบดเบ”, เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเป€เบฎเบฑเบ”เปƒเบซเป‰ script เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบ‡เบฒเบกเบ‚เบถเป‰เบ™เปเบฅเบฐเปƒเบชเปˆเปƒเบ™เป„เบŸเบฅเปŒเบ›เบฐเบ•เบดเบšเบฑเบ”เป„เบ”เป‰ (เปƒเบซเป‰เป€เบญเบตเป‰เบ™เบงเปˆเบฒ exec_pull) -

#!/bin/bash

/etc/ansible/./get_vms && ansible -i /etc/ansible/cloud_ip -m shell -a "$@"

เปƒเบซเป‰เป„เบ›เบ—เบตเปˆ gitlab เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเปเบฅเบฐเบชเป‰เบฒเบ‡เป„เบŸเบฅเปŒเปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™ .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 เป„เบ›เบซเบฒเป‚เบ„เบ‡เบเบฒเบ™เบญเบทเปˆเบ™เป†, เบ—เปˆเบฒเบ™เบžเบฝเบ‡เปเบ•เปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบ›เปˆเบฝเบ™เบŠเบทเปˆเบ‚เบญเบ‡เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เป€เบžเบทเปˆเบญเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปƒเบซเบกเปˆเปเบฅเบฐเบŠเบทเปˆเบ‚เบญเบ‡เบเบธเปˆเบกเบ—เบตเปˆเบ„เปเบฒเบชเบฑเปˆเบ‡ ansible เบˆเบฐเบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™