Ansible + ืึทื•ื˜ืึธ ื’ื™ื˜ ืฆื™ืขืŸ ืื™ืŸ ืึท ืงื ื•ื™ืœ ืคื•ืŸ ื•ื•ื™ืจื˜ื•ืึทืœ ืžืืฉื™ื ืขืŸ ืื™ืŸ ื“ื™ ื•ื•ืึธืœืงืŸ

Ansible + ืึทื•ื˜ืึธ ื’ื™ื˜ ืฆื™ืขืŸ ืื™ืŸ ืึท ืงื ื•ื™ืœ ืคื•ืŸ ื•ื•ื™ืจื˜ื•ืึทืœ ืžืืฉื™ื ืขืŸ ืื™ืŸ ื“ื™ ื•ื•ืึธืœืงืŸ

ื ื’ื•ื˜ืŸ ื˜ืื’

ืžื™ืจ ื”ืึธื‘ืŸ ืขื˜ืœืขื›ืข ื•ื•ืึธืœืงืŸ ืงืœืึทืกื˜ืขืจื– ืžื™ื˜ ืึท ื’ืจื•ื™ืก ื ื•ืžืขืจ ืคื•ืŸ ื•ื•ื™ืจื˜ื•ืึทืœ ืžืืฉื™ื ืขืŸ ืื™ืŸ ื™ืขื“ืขืจ. ื“ืขื ื’ืึทื ืฆืŸ ื’ืขืฉืขืคึฟื˜ ืžื™ืจ ื‘ืึทื”ืึทืœื˜ืŸ ื‘ืฒึท ื”ืขืฆื ืขืจ. ืื™ืŸ ื™ืขื“ืขืจ ืงื ื•ื™ืœ ืžื™ืจ ื”ืึธื‘ืŸ ืื™ื™ืŸ ื‘ืขืœ ืžืึทืฉื™ืŸ, ืึท ืžืึธืžืขื ื˜ื‘ื™ืœื“ ืื™ื– ื’ืขื ื•ืžืขืŸ ืคื•ืŸ ืขืก ืื•ืŸ ืื•ื™ื˜ืึธืžืึทื˜ื™ืฉ ืคื•ื ืื ื“ืขืจื’ืขื˜ื™ื™ืœื˜ ืฆื• ืึทืœืข ื•ื•ื™ืจื˜ื•ืึทืœ ืžืืฉื™ื ืขืŸ ืื™ืŸ ื“ืขื ืงื ื•ื™ืœ.

ื“ืขืจ ืกื›ืขืžืข ืงืขืŸ ื ื™ืฉื˜ ืœืึธื–ืŸ ืื•ื ื“ื– ื ืึธืจืžืึทืœื™ ื ื•ืฆืŸ ื’ื™ื˜ืœืึทื‘-ืจืึทื ืขืจื–, ื•ื•ื™ื™ึทืœ ืคื™ืœืข ืคึผืจืึธื‘ืœืขืžืก ืฉื˜ื™ื™ืขืŸ ื•ื•ืขืŸ ืคื™ืœืข ื™ื™ื“ืขื ื™ืงืึทืœ ืจืขื’ื™ืกื˜ืจื™ืจื˜ ืจืึทื ืขืจื– ื“ืขืจืฉื™ื™ึทื ืขืŸ, ื•ื•ืึธืก ืคึผืจืึทืžืคึผื˜ื™ื“ ืื•ื ื“ื– ืฆื• ื’ืขืคึฟื™ื ืขืŸ ืึท ื•ื•ืึธืจืงืึทืจืึธื•ื ื“ ืื•ืŸ ืฉืจื™ื™ึทื‘ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ / ืžืึทื ื•ืึทืœ.

ื“ืึธืก ืื™ื– ืžื™ืกื˜ืึธืžืข ื ื™ืฉื˜ ื“ืขืจ ื‘ืขืกื˜ืขืจ ืคื™ืจ, ืึธื‘ืขืจ ื“ื™ ืœื™ื™ื–ื•ื ื’ ืื™ื– ื’ืขื•ื•ืขืŸ ื•ื•ื™ ื‘ืึทืงื•ื•ืขื ืื•ืŸ ืคึผืฉื•ื˜ ื•ื•ื™ ืžืขื’ืœืขืš.

ืคึฟืึทืจ ื“ื™ ื˜ื•ื˜ืึธืจื™ืึทืœ, ื‘ื™ื˜ืข ื–ืขืŸ ืงืึทืฅ.

ืคืืจืœืื ื’ื˜ ืคึผืึทืงืึทื“ื–ืฉืึทื– ืื•ื™ืฃ ื“ื™ ื‘ืขืœ ืžืึทืฉื™ืŸ:

  • ืคึผื™ื˜ื”ืึธืŸ
  • ื’ื™ื™ืŸ
  • ื˜ืขืงืข ืžื™ื˜ ssh ืฉืœื™ืกืœืขืŸ

ื“ืขืจ ื’ืขื ืขืจืึทืœ ืคึผืจื™ื ืฆื™ืคึผ ืคื•ืŸ ื™ืžืคึผืœืึทืžืขื ื™ื ื’ ืึธื˜ืึทืžืึทื˜ื™ืง ื’ื•ื˜ ืฆื™ืขืŸ ืื•ื™ืฃ ืึทืœืข ื•ื•ื™ืจื˜ื•ืึทืœ ืžืืฉื™ื ืขืŸ ืื™ื– ืึทื– ืื™ืจ ื“ืึทืจืคึฟืŸ ืึท ืžืึทืฉื™ืŸ ืื•ื™ืฃ ื•ื•ืึธืก Ansible ื•ื•ืขื˜ ื–ื™ื™ืŸ ืื™ื ืกื˜ืึทืœื™ืจืŸ. ืคึฟื•ืŸ ื“ืขื ืžืึทืฉื™ืŸ, ืึทื ืกื™ื‘ืœืข ื•ื•ืขื˜ ืฉื™ืงืŸ ื’ื™ื˜ ืคึผื•ืœ ืงืึทืžืึทื ื“ื– ืื•ืŸ ืจื™ืกื˜ืึทืจื˜ ื“ื™ ืกืขืจื•ื•ื™ืก ื•ื•ืึธืก ืื™ื– ื“ืขืจื”ื™ื™ึทื ื˜ื™ืงื˜. ืคึฟืึทืจ ื“ื™ ืฆื•ื•ืขืงืŸ, ืžื™ืจ ื‘ืืฉืืคืŸ ืึท ื‘ืึทื–ื•ื ื“ืขืจ ื•ื•ื™ืจื˜ื•ืึทืœ ืžืึทืฉื™ืŸ ืึทืจื•ื™ืก ื“ื™ ืงืœืึทืกื˜ืขืจื– ืื•ืŸ ืื™ื ืกื˜ืึทืœื™ืจืŸ ืื•ื™ืฃ ืขืก:

  • ืคึผื™ื˜ื”ืึธืŸ
  • ืึทื ืกืึทื‘ืœืข
  • ื’ื™ื˜ืœืึทื‘-ืจืึทื ืขืจ

ืคึฟื•ืŸ ืึธืจื’ืึทื ืึทื–ื™ื™ืฉืึทื ืึทืœ ื™ืฉื•ื– - ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืคืึทืจืฉืจื™ื™ึทื‘ืŸ ื’ื™ื˜ืœืึทื‘-ืจืึทื ืขืจ, ืžืึทื›ืŸ ssh-keygen, ืฆื•ืคึฟืขืœื™ืงืขืจ ื“ืขื ืฆื™ื‘ื•ืจ ssh ืฉืœื™ืกืœ ืคื•ืŸ ื“ืขื ืžืึทืฉื™ืŸ ืฆื• .ssh/authorized_keys ืื•ื™ืฃ ื“ื™ ื‘ืขืœ ืžืึทืฉื™ืŸ, ืขืคึฟืขื ืขืŸ ืคึผืึธืจื˜ 22 ืคึฟืึทืจ ืึทื ืกืึทื‘ืึทืœ ืื•ื™ืฃ ื“ื™ ื‘ืขืœ ืžืึทืฉื™ืŸ.

ืื™ืฆื˜ ืœืึธื–ืŸ ืก ืงืึทื ืคื™ื’ื™ืขืจ ืึทื ืกื™ื‘ืœืข

ื–ื™ื ื˜ ืื•ื ื“ื–ืขืจ ืฆื™ืœ ืื™ื– ืฆื• ืึธื˜ืึทืžื™ื™ื˜ ืึทืœืฅ ื•ื•ืึธืก ืื™ื– ืžืขื’ืœืขืš. ืื™ืŸ ื˜ืขืงืข /etc/ansible/ansible.cfg ืžื™ืจ ื•ื•ืขืœืŸ ืึธืคึผืฉืึทืฆืŸ ื“ื™ ืฉื•ืจื” host_key_checking = Falseืึทื–ื•ื™ ืึทื– ืึทื ืกื™ื‘ืœืข ื˜ื•ื˜ ื ื™ืฉื˜ ืคืจืขื’ืŸ ืคึฟืึทืจ ื‘ืึทืฉื˜ืขื˜ื™ืงื•ื ื’ ืคื•ืŸ ื ื™ื™ึท ืžืืฉื™ื ืขืŸ.

ื“ืขืจื ืึธืš, ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืื•ื™ื˜ืึธืžืึทื˜ื™ืฉ ื“ื–ืฉืขื ืขืจื™ื™ื˜ ืึทืŸ ื™ื ื•ื•ืึทื ื˜ืึธืจื™ ื˜ืขืงืข ืคึฟืึทืจ ืึทื ืกื™ื‘ืœืข, ืคึฟื•ืŸ ื•ื•ื• ืขืก ื•ื•ืขื˜ ื ืขืžืขืŸ ื“ื™ IP ืคื•ืŸ ื“ื™ ืžืืฉื™ื ืขืŸ ืื•ื™ืฃ ื•ื•ืึธืก ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ื˜ืึธืŸ ื’ื™ื˜.

ืžื™ืจ ื“ื–ืฉืขื ืขืจื™ื™ื˜ ื“ืขื ื˜ืขืงืข ื ื™ืฆืŸ Hetzner's API, ืื™ืจ ืงืขื ืขืŸ ื ืขืžืขืŸ ื“ื™ ืจืฉื™ืžื” ืคื•ืŸ ืžื—ื ื•ืช ืคึฟื•ืŸ ื“ื™ื™ืŸ AWS, Asure, ื“ืึทื˜ืึทื‘ื™ื™ืก (ืื™ืจ ื”ืึธื˜ ืึทืŸ ืึทืคึผื™ ืขืจื’ืขืฅ ืฆื• ื•ื•ื™ื™ึทื–ืŸ ื“ื™ื™ืŸ ืคืœื™ืกื ื“ื™ืง ืžืืฉื™ื ืขืŸ, ืจืขื›ื˜?).

ื“ื™ ืกื˜ืจื•ืงื˜ื•ืจ ืคื•ืŸ ื“ื™ ื™ื ื•ื•ืึทื ื˜ืึธืจื™ ื˜ืขืงืข ืื™ื– ื–ื™ื™ืขืจ ื•ื•ื™ื›ื˜ื™ืง ืคึฟืึทืจ 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

ื“ืขืจ ืจืขื–ื•ืœื˜ืึทื˜ ื–ืึธืœ ืึทื ื˜ื”ืึทืœื˜ืŸ ื“ื™ ื”ืึธืกื˜ื ืึทืžืขืก ืคื•ืŸ ื“ื™ ืžืืฉื™ื ืขืŸ ืื•ื™ืฃ ื•ื•ืึธืก ื“ื™ ื‘ืึทืคึฟืขืœ ืื™ื– ืขืงืกืึทืงื™ื•ื˜ืึทื“.
ืขื˜ืœืขื›ืข ื•ื•ืขืจื˜ืขืจ ื•ื•ืขื’ืŸ ืกื™ื ื˜ืึทืงืก:

  • /etc/ansible/./vm_list - ื“ื–ืฉืขื ืขืจื™ื™ื˜ ืึท ืจืฉื™ืžื” ืคื•ืŸ ืžืืฉื™ื ืขืŸ
  • -ืื™ืš - ืึทื‘ืกืึธืœื•ื˜ ื“ืจืš ืฆื• ื“ื™ ื™ื ื•ื•ืึทื ื˜ืึธืจื™ ื˜ืขืงืข
  • -m - ื–ืึธื’ืŸ ืึทื ืกื™ื‘ืœืข ืฆื• ื ื•ืฆืŸ ื“ื™ ืฉืึธืœ ืžืึธื“ื•ืœืข
  • -ืึท ืื™ื– ื“ืขืจ ืึทืจื’ื•ืžืขื ื˜. ื™ืขื“ืขืจ ื‘ืึทืคึฟืขืœ ืงืขื ืขืŸ ื–ื™ื™ืŸ ืืจื™ื™ืŸ ื“ืึธ
  • ื’ืจื•ืคึผืข - ื“ืขืจ ื ืึธืžืขืŸ ืคื•ืŸ ื“ื™ื™ืŸ ืงื ื•ื™ืœ. ืื•ื™ื‘ ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ื˜ืึธืŸ ื“ืึธืก ืื•ื™ืฃ ืึทืœืข ืงืœืึทืกื˜ืขืจื–, ื˜ื•ื™ืฉืŸ ื“ื™ ื’ืจื•ืคึผืข ืฆื• ืึทืœืข

ืœืึธืžื™ืจ ื’ื™ื™ืŸ ื•ื•ื™ื™ื˜ืขืจ - ืœืึธืžื™ืจ ืคึผืจื•ึผื•ื•ื˜ ืฆื• ื˜ืึธืŸ ื’ื™ื˜ ืคึผื•ืœ ืื•ื™ืฃ ืื•ื ื“ื–ืขืจ ื•ื•ื™ืจื˜ื•ืึทืœ ืžืืฉื™ื ืขืŸ:

/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

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’