ΠΠΎΠ±Π°Ρ Π΄Π΅Π½
ΠΠΌΠ°ΠΌΠ΅ Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΠΎΠ±Π»Π°ΠΊ ΠΊΠ»Π°ΡΡΠ΅ΡΠΈ ΡΠΎ Π³ΠΎΠ»Π΅ΠΌ Π±ΡΠΎΡ Π²ΠΈΡΡΡΠ΅Π»Π½ΠΈ ΠΌΠ°ΡΠΈΠ½ΠΈ Π²ΠΎ ΡΠ΅ΠΊΠΎΡΠ° ΠΎΠ΄ Π½ΠΈΠ². ΠΠΈΠ΅ ΡΠΌΠ΅ Π΄ΠΎΠΌΠ°ΡΠΈΠ½ΠΈ Π½Π° ΡΠ΅Π»ΠΈΠΎΡ ΠΎΠ²ΠΎΡ Π±ΠΈΠ·Π½ΠΈΡ Π²ΠΎ Π₯Π΅ΡΠ½Π΅Ρ. ΠΠΎ ΡΠ΅ΠΊΠΎΡ ΠΊΠ»Π°ΡΡΠ΅Ρ ΠΈΠΌΠ°ΠΌΠ΅ Π΅Π΄Π½Π° ΠΌΠ°ΡΡΠ΅Ρ ΠΌΠ°ΡΠΈΠ½Π°, ΠΎΠ΄ Π½Π΅Π° ΡΠ΅ Π·Π΅ΠΌΠ° ΡΠ»ΠΈΠΊΠ° ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΡΠΊΠΈ ΡΠ΅ Π΄ΠΈΡΡΡΠΈΠ±ΡΠΈΡΠ° Π΄ΠΎ ΡΠΈΡΠ΅ Π²ΠΈΡΡΡΠ΅Π»Π½ΠΈ ΠΌΠ°ΡΠΈΠ½ΠΈ Π²ΠΎ ΠΊΠ»Π°ΡΡΠ΅ΡΠΎΡ.
ΠΠ²Π°Π° ΡΠ΅ΠΌΠ° Π½Π΅ Π½ΠΈ Π΄ΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π½ΠΎΡΠΌΠ°Π»Π½ΠΎ Π΄Π° Π³ΠΈ ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ gitlab-runners, Π±ΠΈΠ΄Π΅ΡΡΠΈ ΠΌΠ½ΠΎΠ³Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ ΡΠ΅ ΡΠ°Π²ΡΠ²Π°Π°Ρ ΠΊΠΎΠ³Π° ΡΠ΅ ΠΏΠΎΡΠ°Π²ΡΠ²Π°Π°Ρ ΠΌΠ½ΠΎΠ³Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΠΈ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°Π½ΠΈ ΡΡΠΊΠ°ΡΠΈ, ΡΡΠΎ Π½Π΅ ΠΏΠΎΡΡΠΈΠΊΠ½Π° Π΄Π° Π½Π°ΡΠ΄Π΅ΠΌΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΈ Π΄Π° Π³ΠΎ Π½Π°ΠΏΠΈΡΠ΅ΠΌΠ΅ ΠΎΠ²ΠΎΡ Π½Π°ΠΏΠΈΡ/ΠΏΡΠΈΡΠ°ΡΠ½ΠΈΠΊ.
ΠΠ²Π° Π²Π΅ΡΠΎΡΠ°ΡΠ½ΠΎ Π½Π΅ Π΅ Π½Π°ΡΠ΄ΠΎΠ±ΡΠ° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ°, Π½ΠΎ ΠΎΠ²Π° ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ·Π³Π»Π΅Π΄Π°ΡΠ΅ ΡΡΠΎ Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠ΄ΠΎΠ±Π½ΠΎ ΠΈ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ.
ΠΠ° ΡΠΏΠ°ΡΡΡΠ²ΠΎΡΠΎ, Π²Π΅ ΠΌΠΎΠ»ΠΈΠΌΠ΅ ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΡΠ΅ ΠΌΠ°ΡΠΊΠ°.
ΠΠΎΡΡΠ΅Π±Π½ΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΈ Π½Π° Π³Π»Π°Π²Π½Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π°:
- python
- ΠΎΠ΄ΠΈ
- Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° ΡΠΎ ssh ΠΊΠ»ΡΡΠ΅Π²ΠΈ
ΠΠΏΡΡΠΈΠΎΡ ΠΏΡΠΈΠ½ΡΠΈΠΏ Π½Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°ΡΠ΅ Π½Π° Π°Π²ΡΠΎΠΌΠ°ΡΡΠΊΠΎ ΠΏΠΎΠ²Π»Π΅ΠΊΡΠ²Π°ΡΠ΅ Π½Π° ΡΡΠ΅Π²Π°ΡΠ° Π½Π° ΡΠΈΡΠ΅ Π²ΠΈΡΡΡΠ΅Π»Π½ΠΈ ΠΌΠ°ΡΠΈΠ½ΠΈ Π΅ Π΄Π΅ΠΊΠ° Π²ΠΈ ΡΡΠ΅Π±Π° ΠΌΠ°ΡΠΈΠ½Π° Π½Π° ΠΊΠΎΡΠ° ΡΠ΅ ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ° Ansible. ΠΠ΄ ΠΎΠ²Π°Π° ΠΌΠ°ΡΠΈΠ½Π°, ansible ΡΠ΅ ΠΈΡΠΏΡΠ°ΡΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ Π·Π° ΠΏΠΎΠ²Π»Π΅ΠΊΡΠ²Π°ΡΠ΅ Π½Π° git ΠΈ ΡΠ΅ ΡΠ° ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ° ΡΡΠ»ΡΠ³Π°ΡΠ° ΡΡΠΎ Π΅ Π°ΠΆΡΡΠΈΡΠ°Π½Π°. ΠΠ° ΠΎΠ²ΠΈΠ΅ ΡΠ΅Π»ΠΈ, ΡΠΎΠ·Π΄Π°Π΄ΠΎΠ²ΠΌΠ΅ ΠΏΠΎΡΠ΅Π±Π½Π° Π²ΠΈΡΡΡΠ΅Π»Π½Π° ΠΌΠ°ΡΠΈΠ½Π° Π½Π°Π΄Π²ΠΎΡ ΠΎΠ΄ ΠΊΠ»Π°ΡΡΠ΅ΡΠΈΡΠ΅ ΠΈ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π²ΠΌΠ΅ Π½Π° Π½Π΅Π°:
- python
- ΠΎΠ΄Π³ΠΎΠ²ΠΎΡΠ΅Π½
- gitlab-ΡΡΠΊΠ°Ρ
ΠΠ΄ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΡΠΊΠΈ ΠΏΡΠ°ΡΠ°ΡΠ° - ΡΡΠ΅Π±Π° Π΄Π° ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°ΡΠ΅ gitlab-runner, Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ssh-keygen, Π΄Π° Π³ΠΎ ΠΏΠΎΡΡΠ°Π²ΠΈΡΠ΅ ΡΠ°Π²Π½ΠΈΠΎΡ ssh ΠΊΠ»ΡΡ Π½Π° ΠΎΠ²Π°Π° ΠΌΠ°ΡΠΈΠ½Π° Π½Π° .ssh/authorized_keys
Π½Π° Π³Π»Π°Π²Π½Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π°, ΠΎΡΠ²ΠΎΡΠ΅ΡΠ΅ ΡΠ° ΠΏΠΎΡΡΠ°ΡΠ° 22 Π·Π° Π°Π½ΡΠΈΠ±ΠΈΠ» Π½Π° Π³Π»Π°Π²Π½Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π°.
Π‘Π΅Π³Π° Π°ΡΠ΄Π΅ Π΄Π° Π³ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΠΌΠ΅ ansible
ΠΠΈΠ΄Π΅ΡΡΠΈ Π½Π°ΡΠ°ΡΠ° ΡΠ΅Π» Π΅ Π΄Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ ΡΓ¨ ΡΡΠΎ Π΅ ΠΌΠΎΠΆΠ½ΠΎ. ΠΠΎ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° /etc/ansible/ansible.cfg
ΡΠ΅ ΡΠ° Π΄Π΅ΠΊΠΎΠΌΠ΅Π½ΡΠΈΡΠ°ΠΌΠ΅ Π»ΠΈΠ½ΠΈΡΠ°ΡΠ° host_key_checking = False
ΡΠ°ΠΊΠ° ΡΡΠΎ ansible Π½Π΅ Π±Π°ΡΠ° ΠΏΠΎΡΠ²ΡΠ΄Π° Π·Π° Π½ΠΎΠ²ΠΈ ΠΌΠ°ΡΠΈΠ½ΠΈ.
Π‘Π»Π΅Π΄Π½ΠΎ, ΡΡΠ΅Π±Π° Π°Π²ΡΠΎΠΌΠ°ΡΡΠΊΠΈ Π΄Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°ΡΠ΅ ΠΈΠ½Π²Π΅Π½ΡΠ°Ρ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° Π·Π° ansible, ΠΎΠ΄ ΠΊΠ°Π΄Π΅ ΡΡΠΎ ΡΠ΅ ΡΠ° Π·Π΅ΠΌΠ΅ IP-Π°ΡΠ° Π½Π° ΠΌΠ°ΡΠΈΠ½ΠΈΡΠ΅ Π½Π° ΠΊΠΎΠΈ ΡΡΠ΅Π±Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ git pull.
ΠΠΈΠ΅ ΡΠ° Π³Π΅Π½Π΅ΡΠΈΡΠ°ΠΌΠ΅ ΠΎΠ²Π°Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ Π³ΠΎ Hetzner's API, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ° Π·Π΅ΠΌΠ΅ΡΠ΅ Π»ΠΈΡΡΠ°ΡΠ° Π½Π° Π΄ΠΎΠΌΠ°ΡΠΈΠ½ΠΈ ΠΎΠ΄ Π²Π°ΡΠ°ΡΠ° Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ 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
ΠΠ·Π»Π΅Π·ΠΎΡ ΡΡΠ΅Π±Π° Π΄Π° Π³ΠΈ ΡΠΎΠ΄ΡΠΆΠΈ ΠΈΠΌΠΈΡΠ°ΡΠ° Π½Π° Π΄ΠΎΠΌΠ°ΡΠΈΠ½ΠΈΡΠ΅ Π½Π° ΠΌΠ°ΡΠΈΠ½ΠΈΡΠ΅ Π½Π° ΠΊΠΎΠΈ Π΅ ΠΈΠ·Π²ΡΡΠ΅Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ°.
ΠΠ΅ΠΊΠΎΠ»ΠΊΡ Π·Π±ΠΎΡΠΎΠ²ΠΈ Π·Π° ΡΠΈΠ½ΡΠ°ΠΊΡΠ°ΡΠ°:
- /etc/ansible/./vm_list - Π³Π΅Π½Π΅ΡΠΈΡΠ° Π»ΠΈΡΡΠ° Π½Π° ΠΌΠ°ΡΠΈΠ½ΠΈ
- -i - Π°ΠΏΡΠΎΠ»ΡΡΠ½Π° ΠΏΠ°ΡΠ΅ΠΊΠ° Π΄ΠΎ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° ΡΠΎ Π·Π°Π»ΠΈΡ ΠΈ
- -m - ΠΊΠ°ΠΆΠΈ ansible Π΄Π° Π³ΠΎ ΠΊΠΎΡΠΈΡΡΠΈ ΠΌΠΎΠ΄ΡΠ»ΠΎΡ ΡΠΊΠΎΠ»ΠΊΠ°
- -Π° Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΡ. Π‘Π΅ΠΊΠΎΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π²Π½Π΅ΡΠ΅ ΠΎΠ²Π΄Π΅
- Π³ΡΡΠΏΠ° - ΠΈΠΌΠ΅ΡΠΎ Π½Π° Π²Π°ΡΠΈΠΎΡ ΠΊΠ»Π°ΡΡΠ΅Ρ. ΠΠΊΠΎ ΡΡΠ΅Π±Π° Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΠΎΠ²Π° Π½Π° ΡΠΈΡΠ΅ ΠΊΠ»Π°ΡΡΠ΅ΡΠΈ, ΡΠΌΠ΅Π½Π΅ΡΠ΅ ΡΠ° Π³ΡΡΠΏΠ°ΡΠ° Π½Π° ΡΠΈΡΠ΅
ΠΡΠ΄Π΅ Π΄Π° ΠΎΠ΄ΠΈΠΌΠ΅ ΠΏΠΎΠ½Π°ΡΠ°ΠΌΡ - Π΄Π° ΡΠ΅ ΠΎΠ±ΠΈΠ΄Π΅ΠΌΠ΅ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌΠ΅ git pull Π½Π° Π½Π°ΡΠΈΡΠ΅ Π²ΠΈΡΡΡΠ΅Π»Π½ΠΈ ΠΌΠ°ΡΠΈΠ½ΠΈ:
/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'cd /path/to/project && git pull' group
ΠΠΊΠΎ Π½Π° ΠΈΠ·Π»Π΅Π·ΠΎΡ Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π²Π΅ΡΠ΅ Π°ΠΆΡΡΠΈΡΠ°Π½ΠΎ ΠΈΠ»ΠΈ ΠΈΡΡΠΎΠ²Π°ΡΡΠ²Π°ΡΠ΅ ΠΎΠ΄ ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ΅ΡΠΎ, ΡΠΎΠ³Π°Ρ ΡΓ¨ ΡΠ°Π±ΠΎΡΠΈ.
Π‘Π΅Π³Π° ΡΠ΅ΡΠΎ ΡΠΎΠ° Π±Π΅ΡΠ΅ Π½Π°ΠΌΠ΅Π½Π΅ΡΠΎ Π·Π° ΠΎΠ²Π°
ΠΡΠ΄Π΅ Π΄Π° ΡΠ° Π½Π°ΡΡΠΈΠΌΠ΅ Π½Π°ΡΠ°ΡΠ° ΡΠΊΡΠΈΠΏΡΠ° Π΄Π° ΡΠ°Π±ΠΎΡΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΡΠΊΠΈ ΠΊΠΎΠ³Π° ΡΠ΅ ΠΎΠ±Π²ΡΠ·ΡΠ²Π°ΠΌΠ΅ Π½Π° Π³Π»Π°Π²Π½Π°ΡΠ° Π³ΡΠ°Π½ΠΊΠ° Π²ΠΎ gitlab
ΠΡΠ²ΠΎ, Π΄Π° ΡΠ° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌΠ΅ Π½Π°ΡΠ°ΡΠ° ΡΠΊΡΠΈΠΏΡΠ° ΠΏΠΎΡΠ±Π°Π²Π° ΠΈ Π΄Π° ΡΠ° ΡΡΠ°Π²ΠΈΠΌΠ΅ Π²ΠΎ ΠΈΠ·Π²ΡΡΠ½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° (Π΄Π° ΡΠ° Π½Π°ΡΠ΅ΡΠ΅ΠΌΠ΅ 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