ΠΠ΅ΠΎΠ΄Π°ΠΌΠ½Π° ΠΌΠΈ ΡΡΠ΅Π±Π°ΡΠ΅ Π΄Π° Π½Π°ΠΏΠΈΡΠ°ΠΌ Π½Π΅ΠΊΠΎΠ»ΠΊΡ Ansible Playbook Π·Π° Π΄Π° Π³ΠΎ ΠΏΠΎΠ΄Π³ΠΎΡΠ²Π°ΠΌ ΡΠ΅ΡΠ²Π΅ΡΠΎΡ Π·Π° ΡΠ°ΡΠΏΠΎΡΠ΅Π΄ΡΠ²Π°ΡΠ΅ Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ° Rails. Π, ΠΈΠ·Π½Π΅Π½Π°Π΄ΡΠ²Π°ΡΠΊΠΈ, Π½Π΅ Π½Π°ΡΠ΄ΠΎΠ² Π΅Π΄Π½ΠΎΡΡΠ°Π²Π΅Π½ ΠΏΡΠΈΡΠ°ΡΠ½ΠΈΠΊ ΡΠ΅ΠΊΠΎΡ-ΠΏΠΎ-ΡΠ΅ΠΊΠΎΡ. ΠΠ΅ ΡΠ°ΠΊΠ°Π² Π΄Π° ΠΊΠΎΠΏΠΈΡΠ°ΠΌ ΡΡΡΠ° ΠΊΠ½ΠΈΠ³Π° Π±Π΅Π· Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ°ΠΌ ΡΡΠΎ ΡΠ΅ ΡΠ»ΡΡΡΠ²Π°, ΠΈ Π½Π° ΠΊΡΠ°ΡΠΎΡ ΠΌΠΎΡΠ°Π² Π΄Π° ΡΠ° ΠΏΡΠΎΡΠΈΡΠ°ΠΌ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ°ΡΠ°, ΡΠΎΠ±ΠΈΡΠ°ΡΡΠΈ ΡΓ¨ ΡΠ°ΠΌ. ΠΠΎΠΆΠ΅Π±ΠΈ ΠΌΠΎΠΆΠ°ΠΌ Π΄Π° ΠΏΠΎΠΌΠΎΠ³Π½Π°ΠΌ Π½Π΅ΠΊΠΎΠΌΡ Π΄Π° Π³ΠΎ Π·Π°Π±ΡΠ·Π° ΠΎΠ²ΠΎΡ ΠΏΡΠΎΡΠ΅Ρ ΡΠΎ ΠΏΠΎΠΌΠΎΡ Π½Π° ΠΎΠ²Π°Π° ΡΡΠ°ΡΠΈΡΠ°.
ΠΡΠ²ΠΎΡΠΎ Π½Π΅ΡΡΠΎ ΡΡΠΎ ΡΡΠ΅Π±Π° Π΄Π° ΡΠ΅ ΡΠ°Π·Π±Π΅ΡΠ΅ Π΅ Π΄Π΅ΠΊΠ° ansible Π²ΠΈ ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡΠ²Π° ΡΠ΄ΠΎΠ±Π΅Π½ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΡΡ Π·Π° ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ Π½Π° ΠΏΡΠ΅ΡΡ ΠΎΠ΄Π½ΠΎ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½Π° Π»ΠΈΡΡΠ° Π½Π° Π΄Π΅ΡΡΡΠ²Π° Π½Π° ΠΎΠ΄Π΄Π°Π»Π΅ΡΠ΅Π½ ΡΠ΅ΡΠ²Π΅Ρ(ΠΈ) ΠΏΡΠ΅ΠΊΡ SSH. ΠΠ΅ΠΌΠ° ΠΌΠ°Π³ΠΈΡΠ° ΠΎΠ²Π΄Π΅, Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ ΠΏΡΠΈΠΊΠ»ΡΡΠΎΠΊ ΠΈ Π΄Π° Π΄ΠΎΠ±ΠΈΠ΅ΡΠ΅ Π½ΡΠ»Π° ΠΏΡΠ΅ΠΊΠΈΠ½ Π½Π° ΡΠ°ΡΠΏΠΎΡΠ΅Π΄ΡΠ²Π°ΡΠ΅ Π½Π° Π²Π°ΡΠ°ΡΠ° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° ΡΠΎ Π΄ΠΎΠΊΠ΅Ρ, ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ ΠΈ Π΄ΡΡΠ³ΠΈ Π΄ΠΎΠ±ΡΠΈΠ½ΠΈ Π½Π°Π΄Π²ΠΎΡ ΠΎΠ΄ ΠΊΡΡΠΈΡΠ°ΡΠ°. ΠΠ° Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ ΠΊΠ½ΠΈΠ³Π° Π·Π° ΠΈΠ³ΡΠΈ, ΠΌΠΎΡΠ° Π΄Π° Π·Π½Π°Π΅ΡΠ΅ ΡΡΠΎ ΡΠΎΡΠ½ΠΎ ΡΠ°ΠΊΠ°ΡΠ΅ Π΄Π° ΠΏΡΠ°Π²ΠΈΡΠ΅ ΠΈ ΠΊΠ°ΠΊΠΎ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΡΠΎΠ°. ΠΠ°ΡΠΎΠ° Π½Π΅ ΡΡΠΌ Π·Π°Π΄ΠΎΠ²ΠΎΠ»Π΅Π½ ΡΠΎ Π³ΠΎΡΠΎΠ²ΠΈ ΠΊΠ½ΠΈΠ³ΠΈ Π·Π° ΠΈΠ³ΡΠ°ΡΠ΅ ΠΎΠ΄ GitHub ΠΈΠ»ΠΈ Π½Π°ΠΏΠΈΡΠΈ ΠΊΠ°ΠΊΠΎ: βΠΠΎΠΏΠΈΡΠ°Ρ ΠΈ ΡΡΠ°ΡΡΡΠ²Π°Ρ, ΡΠ΅ ΡΠ°Π±ΠΎΡΠΈβ.
Π¨ΡΠΎ Π½ΠΈ ΡΡΠ΅Π±Π°?
ΠΠ°ΠΊΠΎ ΡΡΠΎ Π²Π΅ΡΠ΅ ΡΠ΅ΠΊΠΎΠ², Π·Π° Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ ΠΊΠ½ΠΈΠ³Π° Π·Π° ΠΈΠ³ΡΠΈ ΡΡΠ΅Π±Π° Π΄Π° Π·Π½Π°Π΅ΡΠ΅ ΡΡΠΎ ΡΠ°ΠΊΠ°ΡΠ΅ Π΄Π° ΠΏΡΠ°Π²ΠΈΡΠ΅ ΠΈ ΠΊΠ°ΠΊΠΎ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΡΠΎΠ°. ΠΡΠ΄Π΅ Π΄Π° ΠΎΠ΄Π»ΡΡΠΈΠΌΠ΅ ΡΡΠΎ Π½ΠΈ ΡΡΠ΅Π±Π°. ΠΠ° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° Π½Π° Rails ΡΠ΅ Π½ΠΈ ΡΡΠ΅Π±Π°Π°Ρ Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΈ: nginx, postgresql (redis, ΠΈΡΠ½.). ΠΠΎΠΊΡΠ°Ρ ΡΠΎΠ°, Π½ΠΈ ΡΡΠ΅Π±Π° ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½Π° Π²Π΅ΡΠ·ΠΈΡΠ° Π½Π° ΡΡΠ±ΠΈΠ½. ΠΠ°ΡΠ΄ΠΎΠ±ΡΠΎ Π΅ Π΄Π° Π³ΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ ΠΏΡΠ΅ΠΊΡ rbenv (rvm, asdf...). ΠΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° ΡΠ΅ΡΠΎ ΠΎΠ²Π° ΠΊΠ°ΠΊΠΎ root ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊ Π΅ ΡΠ΅ΠΊΠΎΠ³Π°Ρ Π»ΠΎΡΠ° ΠΈΠ΄Π΅ΡΠ°, ΠΏΠ° Π·Π°ΡΠΎΠ° ΡΡΠ΅Π±Π° Π΄Π° ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ ΠΏΠΎΡΠ΅Π±Π΅Π½ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊ ΠΈ Π΄Π° Π³ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΡΠ΅ Π½Π΅Π³ΠΎΠ²ΠΈΡΠ΅ ΠΏΡΠ°Π²Π°. ΠΠΎΡΠ»Π΅ ΠΎΠ²Π°, ΡΡΠ΅Π±Π° Π΄Π° Π³ΠΎ ΠΏΠΎΡΡΠ°Π²ΠΈΡΠ΅ Π½Π°ΡΠΈΠΎΡ ΠΊΠΎΠ΄ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠΎΡ, Π΄Π° Π³ΠΈ ΠΊΠΎΠΏΠΈΡΠ°ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈΡΠ΅ Π·Π° nginx, postgres ΠΈΡΠ½ ΠΈ Π΄Π° Π³ΠΈ ΡΡΠ°ΡΡΡΠ²Π°ΡΠ΅ ΡΠΈΡΠ΅ ΠΎΠ²ΠΈΠ΅ ΡΡΠ»ΡΠ³ΠΈ.
ΠΠ°ΠΊΠΎ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΡΠΎΠ°, ΡΠ΅Π΄ΠΎΡΠ»Π΅Π΄ΠΎΡ Π½Π° Π΄Π΅ΡΡΡΠ²Π°ΡΠ° Π΅ ΠΊΠ°ΠΊΠΎ ΡΡΠΎ ΡΠ»Π΅Π΄ΡΠ²Π°:
- ΠΠ°ΡΠ°Π²Π΅ΡΠ΅ ΡΠ΅ ΠΊΠ°ΠΊΠΎ root
- ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΈ
- ΠΊΡΠ΅ΠΈΡΠ°ΡΡΠ΅ Π½ΠΎΠ² ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊ, ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΡΡΠ΅ ΠΏΡΠ°Π²Π°, ΠΊΠ»ΡΡ ssh
- ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΡΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΈ (nginx ΠΈΡΠ½) ΠΈ ΡΡΠ°ΡΡΡΠ²Π°ΡΡΠ΅ Π³ΠΈ
- ΠΠΈΠ΅ ΡΠΎΠ·Π΄Π°Π²Π°ΠΌΠ΅ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊ Π²ΠΎ Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ (ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²Π΅Π΄Π½Π°Ρ Π΄Π° ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ)
- ΠΠ°ΡΠ°Π²Π΅ΡΠ΅ ΡΠ΅ ΠΊΠ°ΠΊΠΎ Π½ΠΎΠ² ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊ
- ΠΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΡΠ΅ rbenv ΠΈ ΡΡΠ±ΠΈΠ½
- ΠΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΎΡ
- ΠΠΎΡΡΠ°Π²ΡΠ²Π°ΡΠ΅ Π½Π° ΠΊΠΎΠ΄ΠΎΡ Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ°
- Π‘ΡΠ°ΡΡΡΠ²Π°ΡΠ΅ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠΎΡ Puma
ΠΠΎΠΊΡΠ°Ρ ΡΠΎΠ°, ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΡΠ°Π·ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²Π°Ρ ΡΠΎ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° capistrano, Π±Π°ΡΠ΅ΠΌ Π½Π°Π΄Π²ΠΎΡ ΠΎΠ΄ ΠΊΡΡΠΈΡΠ°ΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° Π³ΠΎ ΠΊΠΎΠΏΠΈΡΠ° ΠΊΠΎΠ΄ΠΎΡ Π²ΠΎ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΠΌΠΈΡΠ΅ Π·Π° ΠΈΠ·Π΄Π°Π²Π°ΡΠ΅, Π΄Π° Π³ΠΎ ΠΏΡΠ΅ΡΡΠ»ΠΈ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ΡΠΎ ΡΠΎ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΠΊ ΠΏΠΎ ΡΡΠΏΠ΅ΡΠ½ΠΎΡΠΎ ΡΠ°ΡΠΏΠΎΡΠ΅Π΄ΡΠ²Π°ΡΠ΅, Π΄Π° ΠΊΠΎΠΏΠΈΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΠΎΠ΄ ΡΠΏΠΎΠ΄Π΅Π»Π΅Π½ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΠΌ, Π΄Π° ΡΠ° ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ° puma ΠΈΡΠ½. Π‘Π΅ΡΠΎ ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ ΡΠΎ ΠΏΠΎΠΌΠΎΡ Π½Π° Ansible, Π½ΠΎ Π·ΠΎΡΡΠΎ?
Π‘ΡΡΡΠΊΡΡΡΠ° Π½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°
Ansible ΠΈΠΌΠ° ΡΡΡΠΎΠ³ΠΈ
ΠΠ΄Π½ΠΎΡΡΠ°Π²Π½Π° Playbook
Playbook Π΅ yml-Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° ΠΊΠΎΡΠ°, ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ ΡΠΏΠ΅ΡΠΈΡΠ°Π»Π½Π° ΡΠΈΠ½ΡΠ°ΠΊΡΠ°, ΠΎΠΏΠΈΡΡΠ²Π° ΡΡΠΎ ΡΡΠ΅Π±Π° Π΄Π° ΠΏΡΠ°Π²ΠΈ Ansible ΠΈ ΠΊΠ°ΠΊΠΎ. ΠΡΠ΄Π΅ Π΄Π° ΡΠ° ΡΠΎΠ·Π΄Π°Π΄Π΅ΠΌΠ΅ ΠΏΡΠ²Π°ΡΠ° ΠΊΠ½ΠΈΠ³Π° Π·Π° ΠΈΠ³ΡΠΈ ΡΡΠΎ Π½Π΅ ΠΏΡΠ°Π²ΠΈ Π½ΠΈΡΡΠΎ:
---
- name: Simple playbook
hosts: all
ΠΠ²Π΄Π΅ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ Π²Π΅Π»ΠΈΠΌΠ΅ Π΄Π΅ΠΊΠ° Π½Π°ΡΠ°ΡΠ° ΠΈΠ³ΡΠΎΡΠ΅ΠΊΠ° ΡΠ΅ Π²ΠΈΠΊΠ° Simple Playbook
ΠΈ Π΄Π΅ΠΊΠ° Π½Π΅Π³ΠΎΠ²Π°ΡΠ° ΡΠΎΠ΄ΡΠΆΠΈΠ½Π° ΡΡΠ΅Π±Π° Π΄Π° Π±ΠΈΠ΄Π΅ ΠΈΠ·Π²ΡΡΠ΅Π½Π° Π·Π° ΡΠΈΡΠ΅ Ρ
ΠΎΡΡΠΎΠ²ΠΈ. ΠΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π³ΠΎ Π·Π°ΡΡΠ²Π°ΠΌΠ΅ Π²ΠΎ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΠΌΠΎΡ /ansible ΡΠΎ ΠΈΠΌΠ΅ΡΠΎ playbook.yml
ΠΈ ΠΎΠ±ΠΈΠ΄Π΅ΡΠ΅ ΡΠ΅ Π΄Π° ΡΡΡΠ°ΡΠ΅:
ansible-playbook ./playbook.yml
PLAY [Simple Playbook] ************************************************************************************************************************************
skipping: no hosts matched
Ansible Π²Π΅Π»ΠΈ Π΄Π΅ΠΊΠ° Π½Π΅ ΠΏΠΎΠ·Π½Π°Π²Π° Π΄ΠΎΠΌΠ°ΡΠΈΠ½ΠΈ ΡΡΠΎ ΠΎΠ΄Π³ΠΎΠ²Π°ΡΠ°Π°Ρ Π½Π° ΡΠΈΡΠ΅ ΡΠΏΠΈΡΠΎΠΊ. Π’ΠΈΠ΅ ΠΌΠΎΡΠ° Π΄Π° Π±ΠΈΠ΄Π°Ρ Π½Π°Π²Π΅Π΄Π΅Π½ΠΈ Π²ΠΎ ΠΏΠΎΡΠ΅Π±Π΅Π½
ΠΡΠ΄Π΅ Π΄Π° Π³ΠΎ ΡΠΎΠ·Π΄Π°Π΄Π΅ΠΌΠ΅ Π²ΠΎ ΠΈΡΡΠΈΠΎΡ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΠΌ:
123.123.123.123
ΠΠ°ΠΊΠ° Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ Π³ΠΎ ΠΎΠ΄ΡΠ΅Π΄ΡΠ²Π°ΠΌΠ΅ Π΄ΠΎΠΌΠ°ΡΠΈΠ½ΠΎΡ (ΠΈΠ΄Π΅Π°Π»Π½ΠΎ Π΄ΠΎΠΌΠ°ΡΠΈΠ½ΠΎΡ Π½Π° Π½Π°ΡΠΈΠΎΡ VPS Π·Π° ΡΠ΅ΡΡΠΈΡΠ°ΡΠ΅, ΠΈΠ»ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°ΡΠ΅ localhost) ΠΈ Π³ΠΎ Π·Π°ΡΡΠ²ΡΠ²Π°ΠΌΠ΅ ΠΏΠΎΠ΄ ΠΈΠΌΠ΅ΡΠΎ inventory
.
ΠΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΎΠ±ΠΈΠ΄Π΅ΡΠ΅ Π΄Π° ΠΈΠ·Π²ΡΡΠΈΡΠ΅ ansible ΡΠΎ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° ΡΠΎ Π·Π°ΠΏΠΈΡ:
ansible-playbook ./playbook.yml -i inventory
PLAY [Simple Playbook] ************************************************************************************************************************************
TASK [Gathering Facts] ************************************************************************************************************************************
PLAY RECAP ************************************************************************************************************************************
ΠΠΊΠΎ ΠΈΠΌΠ°ΡΠ΅ ssh ΠΏΡΠΈΡΡΠ°ΠΏ Π΄ΠΎ Π½Π°Π²Π΅Π΄Π΅Π½ΠΈΠΎΡ Ρ ΠΎΡΡ, ΡΠΎΠ³Π°Ρ ansible ΡΠ΅ ΡΠ΅ ΠΏΠΎΠ²ΡΠ·Π΅ ΠΈ ΡΠΎΠ±ΠΈΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π·Π° Π΄Π°Π»Π΅ΡΠΈΠ½ΡΠΊΠΈΠΎΡ ΡΠΈΡΡΠ΅ΠΌ. (ΡΡΠ°Π½Π΄Π°ΡΠ΄Π½Π° ΠΠΠΠΠ§Π [Π‘ΠΎΠ±ΠΈΡΠ°ΡΠ΅ ΡΠ°ΠΊΡΠΈ]) ΠΏΠΎ ΡΡΠΎ ΡΠ΅ Π΄Π°Π΄Π΅ ΠΊΡΠ°ΡΠΎΠΊ ΠΈΠ·Π²Π΅ΡΡΠ°Ρ Π·Π° ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ΡΠΎ (PLAY RECAP).
Π‘ΡΠ°Π½Π΄Π°ΡΠ΄Π½ΠΎ, Π²ΡΡΠΊΠ°ΡΠ° Π³ΠΎ ΠΊΠΎΡΠΈΡΡΠΈ ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΊΠΎΡΠΎ ΠΈΠΌΠ΅ ΠΏΠΎΠ΄ ΠΊΠΎΠ΅ ΡΡΠ΅ Π½Π°ΡΠ°Π²Π΅Π½ΠΈ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠΎΡ. ΠΠ°ΡΠ²Π΅ΡΠΎΡΠ°ΡΠ½ΠΎ Π½Π΅ΠΌΠ° Π΄Π° Π±ΠΈΠ΄Π΅ Π½Π° Π΄ΠΎΠΌΠ°ΡΠΈΠ½ΠΎΡ. ΠΠΎ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° Playbook, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΎΠ΄ΡΠ΅Π΄ΠΈΡΠ΅ ΠΊΠΎΡ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊ Π΄Π° ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ Π·Π° ΠΏΠΎΠ²ΡΠ·ΡΠ²Π°ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ ΡΠ° Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Π°ΡΠ° remote_user. ΠΡΡΠΎ ΡΠ°ΠΊΠ°, ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈΡΠ΅ Π·Π° Π΄Π°Π»Π΅ΡΠΈΠ½ΡΠΊΠΈΠΎΡ ΡΠΈΡΡΠ΅ΠΌ ΡΠ΅ΡΡΠΎΠΏΠ°ΡΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π²ΠΈ Π±ΠΈΠ΄Π°Ρ Π½Π΅ΠΏΠΎΡΡΠ΅Π±Π½ΠΈ ΠΈ Π½Π΅ ΡΡΠ΅Π±Π° Π΄Π° Π³ΡΠ±ΠΈΡΠ΅ Π²ΡΠ΅ΠΌΠ΅ ΡΠΎΠ±ΠΈΡΠ°ΡΡΠΈ Π³ΠΈ. ΠΠ²Π°Π° Π·Π°Π΄Π°ΡΠ° ΠΈΡΡΠΎ ΡΠ°ΠΊΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΎΠ½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠΈ:
---
- name: Simple playbook
hosts: all
remote_user: root
become: true
gather_facts: no
ΠΠ±ΠΈΠ΄Π΅ΡΠ΅ ΡΠ΅ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ Π΄Π° ΡΠ° ΡΡΠ°ΡΡΡΠ²Π°ΡΠ΅ Playbook ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠ΅ΡΠ΅ Π΄Π°Π»ΠΈ Π²ΡΡΠΊΠ°ΡΠ° ΡΠ°Π±ΠΎΡΠΈ. (ΠΠΊΠΎ ΡΡΠ΅ Π³ΠΎ Π½Π°Π²Π΅Π»Π΅ root ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠΎΡ, ΡΠΎΠ³Π°Ρ ΡΡΠ΅Π±Π° Π΄Π° ΡΠ° Π½Π°Π²Π΅Π΄Π΅ΡΠ΅ ΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Π°ΡΠ° ΡΡΠ°Π½Π΅: Π²ΠΈΡΡΠΈΠ½ΡΠΊΠ° Π·Π° Π΄Π° ΡΡΠ΅ΠΊΠ½Π΅ΡΠ΅ Π·Π³ΠΎΠ»Π΅ΠΌΠ΅Π½ΠΈ ΠΏΡΠ°Π²Π°. ΠΠ°ΠΊΠΎ ΡΡΠΎ Π΅ Π½Π°ΠΏΠΈΡΠ°Π½ΠΎ Π²ΠΎ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ°ΡΠ°: become set to βtrueβ/βyesβ to activate privilege escalation.
ΠΈΠ°ΠΊΠΎ Π½Π΅ Π΅ ΡΠΎΡΠ΅ΠΌΠ° ΡΠ°ΡΠ½ΠΎ Π·ΠΎΡΡΠΎ).
ΠΠΎΠΆΠ΅Π±ΠΈ ΡΠ΅ Π΄ΠΎΠ±ΠΈΠ΅ΡΠ΅ Π³ΡΠ΅ΡΠΊΠ° ΠΏΡΠ΅Π΄ΠΈΠ·Π²ΠΈΠΊΠ°Π½Π° ΠΎΠ΄ ΡΠ°ΠΊΡΠΎΡ Π΄Π΅ΠΊΠ° ansible Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π³ΠΎ ΠΎΠ΄ΡΠ΅Π΄ΠΈ ΡΠΎΠ»ΠΊΡΠ²Π°ΡΠΎΡ Π½Π° Python, ΡΠΎΠ³Π°Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ°ΡΠ½ΠΎ Π΄Π° Π³ΠΎ Π½Π°Π²Π΅Π΄Π΅ΡΠ΅:
ansible_python_interpreter: /usr/bin/python3
ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π΄ΠΎΠ·Π½Π°Π΅ΡΠ΅ ΠΊΠ°Π΄Π΅ ΠΈΠΌΠ°ΡΠ΅ python ΡΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° whereis python
.
ΠΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΈ
Π‘ΡΠ°Π½Π΄Π°ΡΠ΄Π½Π°ΡΠ° Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΡΠ° Π½Π° Ansible Π²ΠΊΠ»ΡΡΡΠ²Π° ΠΌΠ½ΠΎΠ³Ρ ΠΌΠΎΠ΄ΡΠ»ΠΈ Π·Π° ΡΠ°Π±ΠΎΡΠ° ΡΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΈ, ΡΠ°ΠΊΠ° ΡΡΠΎ Π½Π΅ ΠΌΠΎΡΠ° Π΄Π° ΠΏΠΈΡΡΠ²Π°ΠΌΠ΅ Π±Π°Ρ ΡΠΊΡΠΈΠΏΡΠΈ ΠΎΠ΄ ΠΊΠΎΡΠ° Π±ΠΈΠ»ΠΎ ΠΏΡΠΈΡΠΈΠ½Π°. Π‘Π΅Π³Π° Π½ΠΈ ΡΡΠ΅Π±Π° Π΅Π΄Π΅Π½ ΠΎΠ΄ ΠΎΠ²ΠΈΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΈ Π·Π° Π΄Π° Π³ΠΎ Π°ΠΆΡΡΠΈΡΠ°ΠΌΠ΅ ΡΠΈΡΡΠ΅ΠΌΠΎΡ ΠΈ Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΈ. ΠΠΌΠ°ΠΌ Ubuntu Linux Π½Π° ΠΌΠΎΡΠΎΡ VPS, ΠΏΠ° Π·Π° Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌ ΠΏΠ°ΠΊΠ΅ΡΠΈ ΠΊΠΎΡΠΈΡΡΠ°ΠΌ apt-get
ΠΈ
ΠΡΠ΄Π΅ Π΄Π° ΡΠ° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΠΌΠ΅ Π½Π°ΡΠ°ΡΠ° ΠΈΠ³ΡΠΎΡΠ΅ΠΊΠ° ΡΠΎ ΠΏΡΠ²ΠΈΡΠ΅ Π·Π°Π΄Π°ΡΠΈ:
---
- name: Simple playbook
hosts: all
remote_user: root
become: true
gather_facts: no
tasks:
- name: Update system
apt: update_cache=yes
- name: Install system dependencies
apt:
name: git,nginx,redis,postgresql,postgresql-contrib
state: present
Task Π΅ ΡΠΎΠΊΠΌΡ Π·Π°Π΄Π°ΡΠ°ΡΠ° ΡΡΠΎ Ansible ΡΠ΅ ΡΠ° ΠΈΠ·Π²ΡΡΠΈ Π½Π° ΠΎΠ΄Π΄Π°Π»Π΅ΡΠ΅Π½ΠΈΡΠ΅ ΡΠ΅ΡΠ²Π΅ΡΠΈ. ΠΠ° Π·Π°Π΄Π°ΡΠ°ΡΠ° ΠΈ Π΄Π°Π²Π°ΠΌΠ΅ ΠΈΠΌΠ΅ Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π³ΠΎ ΡΠ»Π΅Π΄ΠΈΠΌΠ΅ Π½Π΅ΡΠ·ΠΈΠ½ΠΎΡΠΎ ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ Π²ΠΎ Π΄Π½Π΅Π²Π½ΠΈΠΊΠΎΡ. Π Π½ΠΈΠ΅ ΠΎΠΏΠΈΡΡΠ²Π°ΠΌΠ΅, ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ ΡΠ° ΡΠΈΠ½ΡΠ°ΠΊΡΠ°ΡΠ° Π½Π° ΠΎΠ΄ΡΠ΅Π΄Π΅Π½ ΠΌΠΎΠ΄ΡΠ», ΡΡΠΎ ΡΡΠ΅Π±Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈ. ΠΠΎ ΠΎΠ²ΠΎΡ ΡΠ»ΡΡΠ°Ρ apt: update_cache=yes
- Π²Π΅Π»ΠΈ Π·Π° Π°ΠΆΡΡΠΈΡΠ°ΡΠ΅ Π½Π° ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΈΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠΈ ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ Π³ΠΎ ΠΌΠΎΠ΄ΡΠ»ΠΎΡ apt. ΠΡΠΎΡΠ°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π° Π΅ ΠΌΠ°Π»ΠΊΡ ΠΏΠΎΠΊΠΎΠΌΠΏΠ»ΠΈΡΠΈΡΠ°Π½Π°. ΠΠΎΠ΄Π°Π²Π°ΠΌΠ΅ Π»ΠΈΡΡΠ° Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ Π½Π° apt ΠΌΠΎΠ΄ΡΠ»ΠΎΡ ΠΈ Π²Π΅Π»ΠΈΠΌΠ΅ Π΄Π΅ΠΊΠ° ΡΠ΅ state
ΡΡΠ΅Π±Π° Π΄Π° ΡΡΠ°Π½Π΅ present
, ΠΎΠ΄Π½ΠΎΡΠ½ΠΎ Π²Π΅Π»ΠΈΠΌΠ΅ Π΄Π° Π³ΠΈ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ ΠΎΠ²ΠΈΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠΈ. ΠΠ° ΡΠ»ΠΈΡΠ΅Π½ Π½Π°ΡΠΈΠ½, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΠΈΠΌ ΠΊΠ°ΠΆΠ΅ΠΌΠ΅ Π΄Π° Π³ΠΈ ΠΈΠ·Π±ΡΠΈΡΠ°Ρ ΠΈΠ»ΠΈ Π΄Π° Π³ΠΈ Π°ΠΆΡΡΠΈΡΠ°ΠΌΠ΅ ΡΠΎ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ ΠΌΠ΅Π½ΡΠ²Π°ΡΠ΅ state
. ΠΠ΅ ΠΌΠΎΠ»ΠΈΠΌΠ΅ ΠΈΠΌΠ°ΡΡΠ΅ ΠΏΡΠ΅Π΄Π²ΠΈΠ΄ Π΄Π΅ΠΊΠ° Π·Π° ΡΠΈΠ½ΠΈΡΠ΅ Π΄Π° ΡΠ°Π±ΠΎΡΠ°Ρ ΡΠΎ postgresql Π½ΠΈ ΡΡΠ΅Π±Π° ΠΏΠ°ΠΊΠ΅ΡΠΎΡ postgresql-contrib, ΠΊΠΎΡ Π³ΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ ΡΠ΅Π³Π°. ΠΠΎΠ²ΡΠΎΡΠ½ΠΎ, ΡΡΠ΅Π±Π° Π΄Π° Π³ΠΎ Π·Π½Π°Π΅ΡΠ΅ ΠΈ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΠΎΠ²Π°; ΡΠ°Π·ΡΠΌΠ½ΠΈΠΎΡ ΡΠ°ΠΌ ΠΏΠΎ ΡΠ΅Π±Π΅ Π½Π΅ΠΌΠ° Π΄Π° Π³ΠΎ ΡΡΠΎΡΠΈ ΡΠΎΠ°.
ΠΠ±ΠΈΠ΄Π΅ΡΠ΅ ΡΠ΅ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ Π΄Π° ΡΠ° ΡΡΠ°ΡΡΡΠ²Π°ΡΠ΅ Playbook ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠ΅ΡΠ΅ Π΄Π°Π»ΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΈΡΠ΅ ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ΠΈ.
Π‘ΠΎΠ·Π΄Π°Π²Π°ΡΠ΅ Π½ΠΎΠ²ΠΈ ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΈ.
ΠΠ° ΡΠ°Π±ΠΎΡΠ° ΡΠΎ ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΈ, Ansible ΠΈΠΌΠ° ΠΈ ΠΌΠΎΠ΄ΡΠ» - ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊ. ΠΡΠ΄Π΅ Π΄Π° Π΄ΠΎΠ΄Π°Π΄Π΅ΠΌΠ΅ ΡΡΡΠ΅ Π΅Π΄Π½Π° Π·Π°Π΄Π°ΡΠ° (ΠΏΠΎΠ·Π°Π΄ΠΈ ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ΅ Π³ΠΈ ΡΠΊΡΠΈΠ² Π²Π΅ΡΠ΅ ΠΏΠΎΠ·Π½Π°ΡΠΈΡΠ΅ Π΄Π΅Π»ΠΎΠ²ΠΈ ΠΎΠ΄ ΠΊΠ½ΠΈΠ³Π°ΡΠ° Π·Π° Π΄Π° Π½Π΅ ΡΠ° ΠΊΠΎΠΏΠΈΡΠ°ΠΌ ΡΠ΅Π»ΠΎΡΠ½ΠΎ ΡΠ΅ΠΊΠΎΡ ΠΏΠ°Ρ):
---
- name: Simple playbook
# ...
tasks:
# ...
- name: Add a new user
user:
name: my_user
shell: /bin/bash
password: "{{ 123qweasd | password_hash('sha512') }}"
ΠΠΈΠ΅ ΡΠΎΠ·Π΄Π°Π²Π°ΠΌΠ΅ Π½ΠΎΠ² ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊ, ΠΏΠΎΡΡΠ°Π²ΡΠ²Π°ΠΌΠ΅ ΡΠ΅ΠΌΠ° ΠΈ Π»ΠΎΠ·ΠΈΠ½ΠΊΠ° Π·Π° Π½Π΅Π³ΠΎ. Π ΡΠΎΠ³Π°Ρ Π½Π°ΠΈΠ΄ΡΠ²Π°ΠΌΠ΅ Π½Π° Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ. Π¨ΡΠΎ Π°ΠΊΠΎ ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΊΠΈΡΠ΅ ΠΈΠΌΠΈΡΠ° ΡΡΠ΅Π±Π° Π΄Π° Π±ΠΈΠ΄Π°Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π·Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Ρ ΠΎΡΡΠΎΠ²ΠΈ? Π ΡΠΊΠ»Π°Π΄ΠΈΡΠ°ΡΠ΅ΡΠΎ Π½Π° Π»ΠΎΠ·ΠΈΠ½ΠΊΠ°ΡΠ° Π²ΠΎ ΡΠ°ΡΠ΅Π½ ΡΠ΅ΠΊΡΡ Π²ΠΎ ΠΊΠ½ΠΈΠ³Π°ΡΠ° Π·Π° ΠΈΠ³ΡΠΈ Π΅ ΠΌΠ½ΠΎΠ³Ρ Π»ΠΎΡΠ° ΠΈΠ΄Π΅ΡΠ°. ΠΠ° ΠΏΠΎΡΠ΅ΡΠΎΠΊ, Π°ΡΠ΄Π΅ Π΄Π° Π³ΠΈ ΡΡΠ°Π²ΠΈΠΌΠ΅ ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΊΠΎΡΠΎ ΠΈΠΌΠ΅ ΠΈ Π»ΠΎΠ·ΠΈΠ½ΠΊΠ°ΡΠ° Π²ΠΎ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ, Π° ΠΊΠΎΠ½ ΠΊΡΠ°ΡΠΎΡ Π½Π° ΡΡΠ°ΡΠΈΡΠ°ΡΠ° ΡΠ΅ ΠΏΠΎΠΊΠ°ΠΆΠ°ΠΌ ΠΊΠ°ΠΊΠΎ ΡΠ΅ ΡΠΈΡΡΠΈΡΠ° Π»ΠΎΠ·ΠΈΠ½ΠΊΠ°ΡΠ°.
---
- name: Simple playbook
# ...
tasks:
# ...
- name: Add a new user
user:
name: "{{ user }}"
shell: /bin/bash
password: "{{ user_password | password_hash('sha512') }}"
ΠΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡΠ΅ ΡΠ΅ ΠΏΠΎΡΡΠ°Π²Π΅Π½ΠΈ Π²ΠΎ ΠΊΠ½ΠΈΠ³ΠΈΡΠ΅ Π·Π° ΠΈΠ³ΡΠΈ ΡΠΎ ΠΏΠΎΠΌΠΎΡ Π½Π° Π΄Π²ΠΎΡΠ½ΠΈ ΠΊΠ°Π΄ΡΠ°Π²ΠΈ Π·Π°Π³ΡΠ°Π΄ΠΈ.
ΠΠ΅ Π³ΠΈ ΠΎΠ·Π½Π°ΡΠΈΠΌΠ΅ Π²ΡΠ΅Π΄Π½ΠΎΡΡΠΈΡΠ΅ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡΠ΅ Π²ΠΎ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° ΡΠΎ Π·Π°Π»ΠΈΡ ΠΈ:
123.123.123.123
[all:vars]
user=my_user
user_password=123qweasd
ΠΠ±ΡΠ½Π΅ΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Π°ΡΠ° [all:vars]
- Π²Π΅Π»ΠΈ Π΄Π΅ΠΊΠ° ΡΠ»Π΅Π΄Π½ΠΈΠΎΡ Π±Π»ΠΎΠΊ ΡΠ΅ΠΊΡΡ ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ (vars) ΠΈ ΡΠΈΠ΅ ΡΠ΅ ΠΏΡΠΈΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π·Π° ΡΠΈΡΠ΅ Ρ
ΠΎΡΡΠΎΠ²ΠΈ (ΡΠΈΡΠ΅).
ΠΠ½ΡΠ΅ΡΠ΅ΡΠ΅Π½ Π΅ ΠΈ Π΄ΠΈΠ·Π°ΡΠ½ΠΎΡ "{{ user_password | password_hash('sha512') }}"
. Π Π°Π±ΠΎΡΠ°ΡΠ° Π΅ ΡΡΠΎ ansible Π½Π΅ Π³ΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ° ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠΎΡ ΠΏΡΠ΅ΠΊΡ user_add
ΠΊΠ°ΠΊΠΎ ΡΡΠΎ Π±ΠΈ Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΠ»Π΅ ΡΠΎΠ° ΡΠ°ΡΠ½ΠΎ. Π Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Π³ΠΈ Π·Π°ΡΡΠ²ΡΠ²Π° ΡΠΈΡΠ΅ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ, ΠΏΠΎΡΠ°Π΄ΠΈ ΡΡΠΎ ΠΌΠΎΡΠ°ΠΌΠ΅ ΠΎΠ΄Π½Π°ΠΏΡΠ΅Π΄ Π΄Π° ΡΠ° ΠΏΡΠ΅ΡΠ²ΠΎΡΠΈΠΌΠ΅ Π»ΠΎΠ·ΠΈΠ½ΠΊΠ°ΡΠ° Π²ΠΎ Ρ
Π°Ρ, ΡΡΠΎ Π³ΠΎ ΠΏΡΠ°Π²ΠΈ ΠΎΠ²Π°Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°.
ΠΡΠ΄Π΅ Π΄Π° Π³ΠΎ Π΄ΠΎΠ΄Π°Π΄Π΅ΠΌΠ΅ Π½Π°ΡΠΈΠΎΡ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊ Π²ΠΎ Π³ΡΡΠΏΠ°ΡΠ° sudo. Π‘Π΅ΠΏΠ°ΠΊ, ΠΏΡΠ΅Π΄ ΠΎΠ²Π° ΡΡΠ΅Π±Π° Π΄Π° ΡΠ΅ ΡΠ²Π΅ΡΠΈΠΌΠ΅ Π΄Π΅ΠΊΠ° ΠΏΠΎΡΡΠΎΠΈ ΡΠ°ΠΊΠ²Π° Π³ΡΡΠΏΠ° Π±ΠΈΠ΄Π΅ΡΡΠΈ Π½ΠΈΠΊΠΎΡ Π½Π΅ΠΌΠ° Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈ ΠΎΠ²Π° Π·Π° Π½Π°Ρ:
---
- name: Simple playbook
# ...
tasks:
# ...
- name: Ensure a 'sudo' group
group:
name: sudo
state: present
- name: Add a new user
user:
name: "{{ user }}"
shell: /bin/bash
password: "{{ user_password | password_hash('sha512') }}"
groups: "sudo"
Π‘Γ¨ Π΅ ΠΏΡΠΈΠ»ΠΈΡΠ½ΠΎ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ, ΠΈΠΌΠ°ΠΌΠ΅ ΠΈ Π³ΡΡΠΏΠ΅Π½ ΠΌΠΎΠ΄ΡΠ» Π·Π° ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ Π³ΡΡΠΏΠΈ, ΡΠΎ ΡΠΈΠ½ΡΠ°ΠΊΡΠ° ΠΌΠ½ΠΎΠ³Ρ ΡΠ»ΠΈΡΠ½Π° Π½Π° apt. Π’ΠΎΠ³Π°Ρ Π΄ΠΎΠ²ΠΎΠ»Π½ΠΎ Π΅ Π΄Π° ΡΠ° ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°ΡΠ΅ ΠΎΠ²Π°Π° Π³ΡΡΠΏΠ° Π½Π° ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠΎΡ (groups: "sudo"
).
ΠΡΡΠΎ ΡΠ°ΠΊΠ°, ΠΊΠΎΡΠΈΡΠ½ΠΎ Π΅ Π΄Π° Π΄ΠΎΠ΄Π°Π΄Π΅ΡΠ΅ ssh ΠΊΠ»ΡΡ Π½Π° ΠΎΠ²ΠΎΡ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊ Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΡΠ°Π²ΠΈΠΌΠ΅ ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ Π³ΠΎ Π±Π΅Π· Π»ΠΎΠ·ΠΈΠ½ΠΊΠ°:
---
- name: Simple playbook
# ...
tasks:
# ...
- name: Ensure a 'sudo' group
group:
name: sudo
state: present
- name: Add a new user
user:
name: "{{ user }}"
shell: /bin/bash
password: "{{ user_password | password_hash('sha512') }}"
groups: "sudo"
- name: Deploy SSH Key
authorized_key:
user: "{{ user }}"
key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
state: present
ΠΠΎ ΠΎΠ²ΠΎΡ ΡΠ»ΡΡΠ°Ρ, Π΄ΠΈΠ·Π°ΡΠ½ΠΎΡ Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ΅Π½ "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
β ΡΠ° ΠΊΠΎΠΏΠΈΡΠ° ΡΠΎΠ΄ΡΠΆΠΈΠ½Π°ΡΠ° Π½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° id_rsa.pub (Π²Π°ΡΠ΅ΡΠΎ ΠΈΠΌΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π΅ ΡΠ°Π·Π»ΠΈΡΠ½ΠΎ), ΠΎΠ΄Π½ΠΎΡΠ½ΠΎ ΡΠ°Π²Π½ΠΈΠΎΡ Π΄Π΅Π» ΠΎΠ΄ ΠΊΠ»ΡΡΠΎΡ ssh ΠΈ Π³ΠΎ ΠΏΡΠΈΠΊΠ°ΡΡΠ²Π° Π½Π° ΡΠΏΠΈΡΠΎΠΊΠΎΡ ΡΠΎ ΠΎΠ²Π»Π°ΡΡΠ΅Π½ΠΈ ΠΊΠ»ΡΡΠ΅Π²ΠΈ Π·Π° ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠΎΡ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠΎΡ.
Π£Π»ΠΎΠ³ΠΈ
Π‘ΠΈΡΠ΅ ΡΡΠΈ Π·Π°Π΄Π°ΡΠΈ Π·Π° ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ ΡΠΏΠΎΡΡΠ΅Π±Π° ΠΌΠΎΠΆΠ΅ Π»Π΅ΡΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΊΠ»Π°ΡΠΈΡΠΈΡΠΈΡΠ°Π°Ρ Π²ΠΎ Π΅Π΄Π½Π° Π³ΡΡΠΏΠ° Π·Π°Π΄Π°ΡΠΈ ΠΈ Π±ΠΈ Π±ΠΈΠ»ΠΎ Π΄ΠΎΠ±ΡΠ° ΠΈΠ΄Π΅ΡΠ° ΠΎΠ²Π°Π° Π³ΡΡΠΏΠ° Π΄Π° ΡΠ΅ ΡΠΊΠ»Π°Π΄ΠΈΡΠ° ΠΎΠ΄Π΄Π΅Π»Π½ΠΎ ΠΎΠ΄ Π³Π»Π°Π²Π½Π°ΡΠ° ΠΊΠ½ΠΈΠ³Π° Π·Π° Π΄Π° Π½Π΅ ΡΠ°ΡΡΠ΅ ΠΏΡΠ΅ΠΌΠ½ΠΎΠ³Ρ. ΠΠ° ΡΠ°Π° ΡΠ΅Π», Ansible ΠΈΠΌΠ°
Π‘ΠΏΠΎΡΠ΅Π΄ ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° Π½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° Π½Π°Π²Π΅Π΄Π΅Π½Π° Π½Π° ΡΠ°ΠΌΠΈΠΎΡ ΠΏΠΎΡΠ΅ΡΠΎΠΊ, ΡΠ»ΠΎΠ³ΠΈΡΠ΅ ΠΌΠΎΡΠ° Π΄Π° Π±ΠΈΠ΄Π°Ρ ΡΠΌΠ΅ΡΡΠ΅Π½ΠΈ Π²ΠΎ ΠΏΠΎΡΠ΅Π±Π΅Π½ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΠΌ ΡΠΎ ΡΠ»ΠΎΠ³ΠΈ, Π·Π° ΡΠ΅ΠΊΠΎΡΠ° ΡΠ»ΠΎΠ³Π° ΠΈΠΌΠ° ΠΏΠΎΡΠ΅Π±Π΅Π½ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΠΌ ΡΠΎ ΠΈΡΡΠΎ ΠΈΠΌΠ΅, Π²ΠΎ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΠΌΠΎΡ Π·Π°Π΄Π°ΡΠΈ, Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ, ΡΠ°Π±Π»ΠΎΠ½ΠΈ ΠΈΡΠ½.
ΠΡΠ΄Π΅ Π΄Π° ΡΠΎΠ·Π΄Π°Π΄Π΅ΠΌΠ΅ ΡΡΡΡΠΊΡΡΡΠ° Π½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°: ./ansible/roles/user/tasks/main.yml
(Π³Π»Π°Π²Π½Π° Π΅ Π³Π»Π°Π²Π½Π°ΡΠ° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° ΡΡΠΎ ΡΠ΅ ΡΠ΅ Π²ΡΠΈΡΠ° ΠΈ ΡΠ΅ ΡΠ΅ ΠΈΠ·Π²ΡΡΠΈ ΠΊΠΎΠ³Π° Π½Π΅ΠΊΠΎΡΠ° ΡΠ»ΠΎΠ³Π° Π΅ ΠΏΠΎΠ²ΡΠ·Π°Π½Π° ΡΠΎ ΠΊΠ½ΠΈΠ³Π°ΡΠ° Π·Π° ΠΈΠ³ΡΠΈ; ΡΠΎ Π½Π΅Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΠΎΠ²ΡΠ·Π°Ρ ΠΈ Π΄ΡΡΠ³ΠΈ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ ΡΠΎ ΡΠ»ΠΎΠ³ΠΈ). Π‘Π΅Π³Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΈ ΠΏΡΠ΅ΡΡΠ»ΠΈΡΠ΅ ΡΠΈΡΠ΅ Π·Π°Π΄Π°ΡΠΈ ΠΏΠΎΠ²ΡΠ·Π°Π½ΠΈ ΡΠΎ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠΎΡ Π²ΠΎ ΠΎΠ²Π°Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°:
# Create user and add him to groups
- name: Ensure a 'sudo' group
group:
name: sudo
state: present
- name: Add a new user
user:
name: "{{ user }}"
shell: /bin/bash
password: "{{ user_password | password_hash('sha512') }}"
groups: "sudo"
- name: Deploy SSH Key
authorized_key:
user: "{{ user }}"
key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
state: present
ΠΠΎ Π³Π»Π°Π²Π½Π°ΡΠ° ΠΊΠ½ΠΈΠ³Π°, ΠΌΠΎΡΠ° Π΄Π° Π½Π°Π²Π΅Π΄Π΅ΡΠ΅ Π΄Π° ΡΠ° ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ ΡΠ»ΠΎΠ³Π°ΡΠ° Π½Π° ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠΎΡ:
---
- name: Simple playbook
hosts: all
remote_user: root
gather_facts: no
tasks:
- name: Update system
apt: update_cache=yes
- name: Install system dependencies
apt:
name: git,nginx,redis,postgresql,postgresql-contrib
state: present
roles:
- user
ΠΡΡΠΎ ΡΠ°ΠΊΠ°, ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° ΡΠΌΠΈΡΠ»Π° Π΄Π° ΡΠ΅ Π°ΠΆΡΡΠΈΡΠ° ΡΠΈΡΡΠ΅ΠΌΠΎΡ ΠΏΡΠ΅Π΄ ΡΠΈΡΠ΅ Π΄ΡΡΠ³ΠΈ Π·Π°Π΄Π°ΡΠΈ; Π·Π° Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΠΎΠ²Π°, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΎ ΠΏΡΠ΅ΠΈΠΌΠ΅Π½ΡΠ²Π°ΡΠ΅ Π±Π»ΠΎΠΊΠΎΡ tasks
Π²ΠΎ ΠΊΠΎΡ ΡΠ΅ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½ΠΈ Π²ΠΎ pre_tasks
.
ΠΠΎΡΡΠ°Π²ΡΠ²Π°ΡΠ΅ Π½Π° nginx
ΠΠ΅ΡΠ΅ ΡΡΠ΅Π±Π° Π΄Π° ΠΈΠΌΠ°ΠΌΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ΠΎ Nginx; ΡΡΠ΅Π±Π° Π΄Π° Π³ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΈ Π΄Π° Π³ΠΎ ΠΈΠ·Π²ΡΡΠΈΠΌΠ΅. ΠΡΠ΄Π΅ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΠΌΠ΅ ΡΠΎΠ° Π²Π΅Π΄Π½Π°Ρ Π²ΠΎ ΡΠ»ΠΎΠ³Π°ΡΠ°. ΠΡΠ΄Π΅ Π΄Π° ΡΠΎΠ·Π΄Π°Π΄Π΅ΠΌΠ΅ ΡΡΡΡΠΊΡΡΡΠ° Π½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°:
- ansible
- roles
- nginx
- files
- tasks
- main.yml
- templates
Π‘Π΅Π³Π° Π½ΠΈ ΡΡΠ΅Π±Π°Π°Ρ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ ΠΈ ΡΠ°Π±Π»ΠΎΠ½ΠΈ. Π Π°Π·Π»ΠΈΠΊΠ°ΡΠ° ΠΌΠ΅ΡΡ Π½ΠΈΠ² Π΅ ΡΡΠΎ ansible Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Π³ΠΈ ΠΊΠΎΠΏΠΈΡΠ° Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈΡΠ΅, ΠΊΠ°ΠΊΠΎ ΡΡΠΎ Π΅. Π ΡΠ°Π±Π»ΠΎΠ½ΠΈΡΠ΅ ΠΌΠΎΡΠ° Π΄Π° ΠΈΠΌΠ°Π°Ρ Π½Π°ΡΡΠ°Π²ΠΊΠ° j2 ΠΈ ΡΠΈΠ΅ ΠΌΠΎΠΆΠ°Ρ Π΄Π° ΠΊΠΎΡΠΈΡΡΠ°Ρ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π²ΡΠ΅Π΄Π½ΠΎΡΡΠΈ ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ Π³ΠΈ ΠΈΡΡΠΈΡΠ΅ Π΄Π²ΠΎΡΠ½ΠΈ ΠΊΠ°Π΄ΡΠ°Π²ΠΈ Π·Π°Π³ΡΠ°Π΄ΠΈ.
ΠΡΠ΄Π΅ Π΄Π° Π³ΠΎ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠΈΠΌΠ΅ nginx Π²ΠΎ main.yml
Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°. ΠΠ° ΠΎΠ²Π° ΠΈΠΌΠ°ΠΌΠ΅ ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΈ ΠΌΠΎΠ΄ΡΠ»:
# Copy nginx configs and start it
- name: enable service nginx and start
systemd:
name: nginx
state: started
enabled: yes
ΠΠ²Π΄Π΅ Π½Π΅ ΡΠ°ΠΌΠΎ ΡΡΠΎ Π²Π΅Π»ΠΈΠΌΠ΅ Π΄Π΅ΠΊΠ° nginx ΠΌΠΎΡΠ° Π΄Π° ΡΠ΅ ΡΡΠ°ΡΡΡΠ²Π° (Ρ.Π΅. Π³ΠΎ Π»Π°Π½ΡΠΈΡΠ°ΠΌΠ΅), ΡΡΠΊΡ Π²Π΅Π΄Π½Π°Ρ Π²Π΅Π»ΠΈΠΌΠ΅ Π΄Π΅ΠΊΠ° ΠΌΠΎΡΠ° Π΄Π° Π±ΠΈΠ΄Π΅ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½.
Π‘Π΅Π³Π° Π°ΡΠ΄Π΅ Π΄Π° Π³ΠΈ ΠΊΠΎΠΏΠΈΡΠ°ΠΌΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠΊΠΈΡΠ΅ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ:
# Copy nginx configs and start it
- name: enable service nginx and start
systemd:
name: nginx
state: started
enabled: yes
- name: Copy the nginx.conf
copy:
src: nginx.conf
dest: /etc/nginx/nginx.conf
owner: root
group: root
mode: '0644'
backup: yes
- name: Copy template my_app.conf
template:
src: my_app_conf.j2
dest: /etc/nginx/sites-available/my_app.conf
owner: root
group: root
mode: '0644'
ΠΠΈΠ΅ ΡΠ° ΠΊΡΠ΅ΠΈΡΠ°ΠΌΠ΅ Π³Π»Π°Π²Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠΊΠ° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° nginx (ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ° Π·Π΅ΠΌΠ΅ΡΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΠΎΠ΄ ΡΠ΅ΡΠ²Π΅ΡΠΎΡ ΠΈΠ»ΠΈ Π΄Π° ΡΠ° Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ ΡΠ°ΠΌΠΈ). Π, ΠΈΡΡΠΎ ΡΠ°ΠΊΠ°, ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠΊΠ°ΡΠ° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° Π·Π° Π½Π°ΡΠ°ΡΠ° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° Π²ΠΎ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΠΌΠΎΡ sites_available (ΠΎΠ²Π° Π½Π΅ Π΅ Π½Π΅ΠΎΠΏΡ
ΠΎΠ΄Π½ΠΎ, Π½ΠΎ ΠΊΠΎΡΠΈΡΠ½ΠΎ). ΠΠΎ ΠΏΡΠ²ΠΈΠΎΡ ΡΠ»ΡΡΠ°Ρ, Π½ΠΈΠ΅ Π³ΠΎ ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΎΡ Π·Π° ΠΊΠΎΠΏΠΈΡΠ°ΡΠ΅ Π·Π° ΠΊΠΎΠΏΠΈΡΠ°ΡΠ΅ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ (Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° ΠΌΠΎΡΠ° Π΄Π° Π±ΠΈΠ΄Π΅ Π²Π½Π°ΡΡΠ΅ /ansible/roles/nginx/files/nginx.conf
). ΠΠΎ Π²ΡΠΎΡΠ°ΡΠ°, Π³ΠΎ ΠΊΠΎΠΏΠΈΡΠ°ΠΌΠ΅ ΡΠ°Π±Π»ΠΎΠ½ΠΎΡ, Π·Π°ΠΌΠ΅Π½ΡΠ²Π°ΡΡΠΈ Π³ΠΈ Π²ΡΠ΅Π΄Π½ΠΎΡΡΠΈΡΠ΅ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡΠ΅. Π¨Π°Π±Π»ΠΎΠ½ΠΎΡ ΡΡΠ΅Π±Π° Π΄Π° Π±ΠΈΠ΄Π΅ Π²Π½Π°ΡΡΠ΅ /ansible/roles/nginx/templates/my_app.j2
). Π ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·Π³Π»Π΅Π΄Π° Π²Π°ΠΊΠ°:
upstream {{ app_name }} {
server unix:{{ app_path }}/shared/tmp/sockets/puma.sock;
}
server {
listen 80;
server_name {{ server_name }} {{ inventory_hostname }};
root {{ app_path }}/current/public;
try_files $uri/index.html $uri.html $uri @{{ app_name }};
....
}
ΠΠ±ΡΠ½Π΅ΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π²Π»ΠΎΡΠΊΠΈΡΠ΅ {{ app_name }}
, {{ app_path }}
, {{ server_name }}
, {{ inventory_hostname }}
- ΠΎΠ²Π° ΡΠ΅ ΡΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ ΡΠΈΠΈ Π²ΡΠ΅Π΄Π½ΠΎΡΡΠΈ Ansible ΡΠ΅ Π³ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈ Π²ΠΎ ΡΠ°Π±Π»ΠΎΠ½ΠΎΡ ΠΏΡΠ΅Π΄ Π΄Π° Π³ΠΈ ΠΊΠΎΠΏΠΈΡΠ°. ΠΠ²Π° Π΅ ΠΊΠΎΡΠΈΡΠ½ΠΎ Π°ΠΊΠΎ ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ ΠΊΠ½ΠΈΠ³Π° Π·Π° ΠΈΠ³ΡΠΈ Π·Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π³ΡΡΠΏΠΈ Π½Π° Π΄ΠΎΠΌΠ°ΡΠΈΠ½ΠΈ. ΠΠ° ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΡΠ° Π΄ΠΎΠ΄Π°Π΄Π΅ΠΌΠ΅ Π½Π°ΡΠ°ΡΠ° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° ΡΠΎ ΠΈΠ½Π²Π΅Π½ΡΠ°Ρ:
[production]
123.123.123.123
[staging]
231.231.231.231
[all:vars]
user=my_user
user_password=123qweasd
[production:vars]
server_name=production
app_path=/home/www/my_app
app_name=my_app
[staging:vars]
server_name=staging
app_path=/home/www/my_stage
app_name=my_stage_app
ΠΠΊΠΎ ΡΠ΅Π³Π° ΡΠ° ΡΡΠ°ΡΡΡΠ²Π°ΠΌΠ΅ Π½Π°ΡΠ°ΡΠ° ΠΊΠ½ΠΈΠ³Π° Π·Π° ΠΈΠ³ΡΠΈ, ΡΠ°Π° ΡΠ΅ Π³ΠΈ ΠΈΠ·Π²ΡΡΠΈ Π½Π°Π²Π΅Π΄Π΅Π½ΠΈΡΠ΅ Π·Π°Π΄Π°ΡΠΈ Π·Π° Π΄Π²Π°ΡΠ° Π΄ΠΎΠΌΠ°ΡΠΈΠ½ΠΈ. ΠΠΎ, Π²ΠΎ ΠΈΡΡΠΎ Π²ΡΠ΅ΠΌΠ΅, Π·Π° Π΄ΠΎΠΌΠ°ΡΠΈΠ½ Π½Π° ΡΡΠ΅Π½Π°, ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡΠ΅ ΡΠ΅ ΡΠ΅ ΡΠ°Π·Π»ΠΈΠΊΡΠ²Π°Π°Ρ ΠΎΠ΄ ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡΠΊΠΈΡΠ΅, ΠΈ Π½Π΅ ΡΠ°ΠΌΠΎ Π²ΠΎ ΡΠ»ΠΎΠ³ΠΈ ΠΈ ΠΊΠ½ΠΈΠ³ΠΈ, ΡΡΠΊΡ ΠΈ Π²ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π½Π° nginx. {{ inventory_hostname }}
Π½Π΅ ΡΡΠ΅Π±Π° Π΄Π° ΡΠ΅ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠΈΡΠ° Π²ΠΎ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° ΡΠΎ Π·Π°Π»ΠΈΡ
ΠΈ - ΠΎΠ²Π°
ΠΠΊΠΎ ΡΠ°ΠΊΠ°ΡΠ΅ Π΄Π° ΠΈΠΌΠ°ΡΠ΅ ΠΈΠ½Π²Π΅Π½ΡΠ°Ρ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° Π·Π° Π½Π΅ΠΊΠΎΠ»ΠΊΡ Ρ
ΠΎΡΡΠΎΠ²ΠΈ, Π½ΠΎ Π΄Π° ΡΠ°Π±ΠΎΡΠΈ ΡΠ°ΠΌΠΎ Π·Π° Π΅Π΄Π½Π° Π³ΡΡΠΏΠ°, ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ ΡΠΎ ΡΠ»Π΅Π΄Π½Π°Π²Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°:
ansible-playbook -i inventory ./playbook.yml -l "staging"
ΠΡΡΠ³Π° ΠΎΠΏΡΠΈΡΠ° Π΅ Π΄Π° ΠΈΠΌΠ°ΡΠ΅ ΠΏΠΎΡΠ΅Π±Π½ΠΈ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ ΡΠΎ Π·Π°Π»ΠΈΡ ΠΈ Π·Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π³ΡΡΠΏΠΈ. ΠΠ»ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΈ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠ°ΡΠ΅ Π΄Π²Π°ΡΠ° ΠΏΡΠΈΡΡΠ°ΠΏΠ° Π°ΠΊΠΎ ΠΈΠΌΠ°ΡΠ΅ ΠΌΠ½ΠΎΠ³Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π΄ΠΎΠΌΠ°ΡΠΈΠ½ΠΈ.
ΠΠ° ΡΠ΅ ββΠ²ΡΠ°ΡΠΈΠΌΠ΅ Π½Π° ΠΏΠΎΡΡΠ°Π²ΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° nginx. ΠΠΎ ΠΊΠΎΠΏΠΈΡΠ°ΡΠ΅ΡΠΎ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠΊΠΈΡΠ΅ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ, ΡΡΠ΅Π±Π° Π΄Π° ΡΠΎΠ·Π΄Π°Π΄Π΅ΠΌΠ΅ ΡΠΈΠΌΠ²ΡΡΠΊΠ° Π²ΠΎ sitest_enabled Π΄ΠΎ my_app.conf ΠΎΠ΄ sites_available. Π ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°ΡΡΠ΅ Π³ΠΎ nginx.
... # old code in mail.yml
- name: Create symlink to sites-enabled
file:
src: /etc/nginx/sites-available/my_app.conf
dest: /etc/nginx/sites-enabled/my_app.conf
state: link
- name: restart nginx
service:
name: nginx
state: restarted
ΠΠ²Π΄Π΅ ΡΓ¨ Π΅ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ - ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ Π΄ΠΎΡΡΠ°ΠΏΠ½ΠΈ ΠΌΠΎΠ΄ΡΠ»ΠΈ ΡΠΎ ΠΏΡΠΈΠ»ΠΈΡΠ½ΠΎ ΡΡΠ°Π½Π΄Π°ΡΠ΄Π½Π° ΡΠΈΠ½ΡΠ°ΠΊΡΠ°. ΠΠΎ, ΠΈΠΌΠ° Π΅Π΄Π½Π° ΡΠΎΡΠΊΠ°. ΠΠ΅ΠΌΠ° ΡΠΌΠΈΡΠ»Π° Π΄Π° ΡΠ΅ ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ° nginx ΡΠ΅ΠΊΠΎΡ ΠΏΠ°Ρ. ΠΠ°Π»ΠΈ Π·Π°Π±Π΅Π»Π΅ΠΆΠ°Π²ΡΠ΅ Π΄Π΅ΠΊΠ° Π½Π΅ ΠΏΠΈΡΡΠ²Π°ΠΌΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ ΠΊΠ°ΠΊΠΎ: βΠ½Π°ΠΏΡΠ°Π²ΠΈ Π³ΠΎ Π²Π°ΠΊΠ°β, ΡΠΈΠ½ΡΠ°ΠΊΡΠ°ΡΠ° ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΈΠ·Π³Π»Π΅Π΄Π° ΠΊΠ°ΠΊΠΎ βΠΎΠ²Π° ΡΡΠ΅Π±Π° Π΄Π° ΡΠ° ΠΈΠΌΠ° ΠΎΠ²Π°Π° ΡΠΎΡΡΠΎΡΠ±Π°β. Π Π½Π°ΡΡΠ΅ΡΡΠΎ Π²Π°ΠΊΠ° ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠ° ansible. ΠΠΊΠΎ Π³ΡΡΠΏΠ°ΡΠ° Π²Π΅ΡΠ΅ ΠΏΠΎΡΡΠΎΠΈ ΠΈΠ»ΠΈ ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΈΠΎΡ ΠΏΠ°ΠΊΠ΅Ρ Π΅ Π²Π΅ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½, ΡΠΎΠ³Π°Ρ ansible ΡΠ΅ Π³ΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΈ ΠΎΠ²Π° ΠΈ ΡΠ΅ ΡΠ° ΠΏΡΠ΅ΡΠΊΠΎΠΊΠ½Π΅ Π·Π°Π΄Π°ΡΠ°ΡΠ°. ΠΡΡΠΎ ΡΠ°ΠΊΠ°, Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈΡΠ΅ Π½Π΅ΠΌΠ° Π΄Π° ΡΠ΅ ΠΊΠΎΠΏΠΈΡΠ°Π°Ρ Π°ΠΊΠΎ ΡΠ΅Π»ΠΎΡΠ½ΠΎ ΡΠ΅ ΡΠΎΠ²ΠΏΠ°ΡΠ°Π°Ρ ΡΠΎ ΠΎΠ½Π° ΡΡΠΎ Π΅ Π²Π΅ΡΠ΅ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠΎΡ. ΠΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π³ΠΎ ΠΈΡΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ ΠΎΠ²Π° ΠΈ Π΄Π° Π³ΠΎ ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ nginx ΡΠ°ΠΌΠΎ Π°ΠΊΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠΊΠΈΡΠ΅ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ ΡΠ΅ ΡΠΌΠ΅Π½Π΅ΡΠΈ. ΠΠΎΡΡΠΎΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Π° Π·Π° ΡΠ΅Π³ΠΈΡΡΠ°Ρ Π·Π° ΠΎΠ²Π°:
# Copy nginx configs and start it
- name: enable service nginx and start
systemd:
name: nginx
state: started
enabled: yes
- name: Copy the nginx.conf
copy:
src: nginx.conf
dest: /etc/nginx/nginx.conf
owner: root
group: root
mode: '0644'
backup: yes
register: restart_nginx
- name: Copy template my_app.conf
template:
src: my_app_conf.j2
dest: /etc/nginx/sites-available/my_app.conf
owner: root
group: root
mode: '0644'
register: restart_nginx
- name: Create symlink to sites-enabled
file:
src: /etc/nginx/sites-available/my_app.conf
dest: /etc/nginx/sites-enabled/my_app.conf
state: link
- name: restart nginx
service:
name: nginx
state: restarted
when: restart_nginx.changed
ΠΠΊΠΎ ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π΅Π΄Π½Π° ΠΎΠ΄ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠΊΠΈΡΠ΅ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ, ΡΠ΅ ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ ΠΊΠΎΠΏΠΈΡΠ° ΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°ΡΠ° ΡΠ΅ Π±ΠΈΠ΄Π΅ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°Π½Π° restart_nginx
. Π ΡΠ°ΠΌΠΎ Π°ΠΊΠΎ ΠΎΠ²Π°Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° Π΅ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°Π½Π°, ΡΡΠ»ΡΠ³Π°ΡΠ° ΡΠ΅ ΡΠ΅ ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°.
Π, ΡΠ΅ ΡΠ°Π·Π±ΠΈΡΠ°, ΡΡΠ΅Π±Π° Π΄Π° ΡΠ° Π΄ΠΎΠ΄Π°Π΄Π΅ΡΠ΅ ΡΠ»ΠΎΠ³Π°ΡΠ° nginx Π²ΠΎ Π³Π»Π°Π²Π½Π°ΡΠ° ΠΊΠ½ΠΈΠ³Π°.
ΠΠΎΡΡΠ°Π²ΡΠ²Π°ΡΠ΅ postgresql
Π’ΡΠ΅Π±Π° Π΄Π° Π³ΠΎ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠΈΠΌΠ΅ postgresql ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ systemd Π½Π° ΠΈΡΡ Π½Π°ΡΠΈΠ½ ΠΊΠ°ΠΊΠΎ ΡΡΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΠ²ΠΌΠ΅ ΡΠΎ nginx, Π° ΠΈΡΡΠΎ ΡΠ°ΠΊΠ° Π΄Π° ΡΠΎΠ·Π΄Π°Π΄Π΅ΠΌΠ΅ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊ ΡΡΠΎ ΡΠ΅ Π³ΠΎ ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ Π·Π° ΠΏΡΠΈΡΡΠ°ΠΏ Π΄ΠΎ Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΈ ΡΠ°ΠΌΠ°ΡΠ° Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ.
ΠΡΠ΄Π΅ Π΄Π° ΡΠΎΠ·Π΄Π°Π΄Π΅ΠΌΠ΅ ΡΠ»ΠΎΠ³Π° /ansible/roles/postgresql/tasks/main.yml
:
# Create user in postgresql
- name: enable postgresql and start
systemd:
name: postgresql
state: started
enabled: yes
- name: Create database user
become_user: postgres
postgresql_user:
name: "{{ db_user }}"
password: "{{ db_password }}"
role_attr_flags: SUPERUSER
- name: Create database
become_user: postgres
postgresql_db:
name: "{{ db_name }}"
encoding: UTF-8
owner: "{{ db_user }}"
ΠΠ΅ΠΌΠ° Π΄Π° ΠΎΠΏΠΈΡΠ°ΠΌ ΠΊΠ°ΠΊΠΎ Π΄Π° Π΄ΠΎΠ΄Π°Π²Π°ΠΌ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π½Π° Π·Π°Π»ΠΈΡ
ΠΈΡΠ΅, ΠΎΠ²Π° Π΅ Π²Π΅ΡΠ΅ Π½Π°ΠΏΡΠ°Π²Π΅Π½ΠΎ ΠΌΠ½ΠΎΠ³Ρ ΠΏΠ°ΡΠΈ, ΠΊΠ°ΠΊΠΎ ΠΈ ΡΠΈΠ½ΡΠ°ΠΊΡΠ°ΡΠ° Π½Π° ΠΌΠΎΠ΄ΡΠ»ΠΈΡΠ΅ postgresql_db ΠΈ postgresql_user. ΠΠΎΠ²Π΅ΡΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π°ΡΠ΄Π΅ΡΠ΅ Π²ΠΎ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ°ΡΠ°. ΠΠ²Π΄Π΅ Π΅ Π½Π°ΡΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π°ΡΠ° Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Π° become_user: postgres
. Π€Π°ΠΊΡ Π΅ Π΄Π΅ΠΊΠ° ΡΡΠ°Π½Π΄Π°ΡΠ΄Π½ΠΎ, ΡΠ°ΠΌΠΎ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠΎΡ Π½Π° postgres ΠΈΠΌΠ° ΠΏΡΠΈΡΡΠ°ΠΏ Π΄ΠΎ Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ postgresql ΠΈ ΡΠ°ΠΌΠΎ Π»ΠΎΠΊΠ°Π»Π½ΠΎ. ΠΠ²Π°Π° Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Π° Π½ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° ΠΈΠ·Π²ΡΡΡΠ²Π°ΠΌΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ Π²ΠΎ ΠΈΠΌΠ΅ Π½Π° ΠΎΠ²ΠΎΡ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊ (Π°ΠΊΠΎ ΠΈΠΌΠ°ΠΌΠ΅ ΠΏΡΠΈΡΡΠ°ΠΏ, ΡΠ΅ ΡΠ°Π·Π±ΠΈΡΠ°).
ΠΡΡΠΎ ΡΠ°ΠΊΠ°, ΠΌΠΎΠΆΠ΅Π±ΠΈ ΡΠ΅ ΡΡΠ΅Π±Π° Π΄Π° Π΄ΠΎΠ΄Π°Π΄Π΅ΡΠ΅ Π»ΠΈΠ½ΠΈΡΠ° Π½Π° pg_hba.conf Π·Π° Π΄Π° Π΄ΠΎΠ·Π²ΠΎΠ»ΠΈΡΠ΅ ΠΏΡΠΈΡΡΠ°ΠΏ Π½Π° Π½ΠΎΠ² ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊ Π΄ΠΎ Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ. ΠΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ Π½Π° ΠΈΡΡ Π½Π°ΡΠΈΠ½ ΠΊΠ°ΠΊΠΎ ΡΡΠΎ ΡΠ° ΡΠΌΠ΅Π½ΠΈΠ²ΠΌΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° nginx.
Π, ΡΠ΅ ΡΠ°Π·Π±ΠΈΡΠ°, ΡΡΠ΅Π±Π° Π΄Π° ΡΠ° Π΄ΠΎΠ΄Π°Π΄Π΅ΡΠ΅ ΡΠ»ΠΎΠ³Π°ΡΠ° postgresql Π²ΠΎ Π³Π»Π°Π²Π½Π°ΡΠ° ΠΊΠ½ΠΈΠ³Π° Π·Π° ΠΈΠ³ΡΠΈ.
ΠΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ Π½Π° ΡΡΠ±ΠΈΠ½ ΠΏΡΠ΅ΠΊΡ rbenv
Ansible Π½Π΅ΠΌΠ° ΠΌΠΎΠ΄ΡΠ»ΠΈ Π·Π° ΡΠ°Π±ΠΎΡΠ° ΡΠΎ rbenv, Π½ΠΎ ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ° ΡΠΎ ΠΊΠ»ΠΎΠ½ΠΈΡΠ°ΡΠ΅ Π½Π° git ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ΅. ΠΠ°ΡΠΎΠ°, ΠΎΠ²ΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΡΡΠ°Π½ΡΠ²Π° Π½Π°ΡΠ½Π΅ΡΡΠ°Π½Π΄Π°ΡΠ΄Π΅Π½. ΠΡΠ΄Π΅ Π΄Π° ΡΠΎΠ·Π΄Π°Π΄Π΅ΠΌΠ΅ ΡΠ»ΠΎΠ³Π° Π·Π° Π½Π΅Π° /ansible/roles/ruby_rbenv/main.yml
ΠΈ Π΄Π° ΠΏΠΎΡΠ½Π΅ΠΌΠ΅ Π΄Π° Π³ΠΎ ΠΏΠΎΠΏΠΎΠ»Π½ΡΠ²Π°ΠΌΠ΅:
# Install rbenv and ruby
- name: Install rbenv
become_user: "{{ user }}"
git: repo=https://github.com/rbenv/rbenv.git dest=~/.rbenv
ΠΠΎΠ²ΡΠΎΡΠ½ΠΎ ΡΠ° ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Π°ΡΠ° ben_user Π·Π° Π΄Π° ΡΠ°Π±ΠΎΡΠΈΠΌΠ΅ ΠΏΠΎΠ΄ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠΎΡ ΡΡΠΎ Π³ΠΎ ΡΠΎΠ·Π΄Π°Π΄ΠΎΠ²ΠΌΠ΅ Π·Π° ΠΎΠ²ΠΈΠ΅ ΡΠ΅Π»ΠΈ. ΠΠΈΠ΄Π΅ΡΡΠΈ rbenv Π΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ Π²ΠΎ Π½Π΅Π³ΠΎΠ²ΠΈΠΎΡ Π΄ΠΎΠΌΠ°ΡΠ΅Π½ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΠΌ, Π° Π½Π΅ Π³Π»ΠΎΠ±Π°Π»Π½ΠΎ. Π Π½ΠΈΠ΅ ΠΈΡΡΠΎ ΡΠ°ΠΊΠ° Π³ΠΎ ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΎΡ git Π·Π° ΠΊΠ»ΠΎΠ½ΠΈΡΠ°ΡΠ΅ Π½Π° ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ΅ΡΠΎ, Π½Π°Π²Π΅Π΄ΡΠ²Π°ΡΡΠΈ repo ΠΈ dest.
Π‘Π»Π΅Π΄Π½ΠΎ, ΡΡΠ΅Π±Π° Π΄Π° Π³ΠΎ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°ΠΌΠ΅ rbenv init Π²ΠΎ bashrc ΠΈ Π΄Π° Π΄ΠΎΠ΄Π°Π΄Π΅ΠΌΠ΅ rbenv Π½Π° PATH ΡΠ°ΠΌΡ. ΠΠ° ΠΎΠ²Π° Π³ΠΎ ΠΈΠΌΠ°ΠΌΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΎΡ lineinfile:
- name: Add rbenv to PATH
become_user: "{{ user }}"
lineinfile:
path: ~/.bashrc
state: present
line: 'export PATH="${HOME}/.rbenv/bin:${PATH}"'
- name: Add rbenv init to bashrc
become_user: "{{ user }}"
lineinfile:
path: ~/.bashrc
state: present
line: 'eval "$(rbenv init -)"'
ΠΠΎΡΠΎΠ° ΡΡΠ΅Π±Π° Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ ruby_build:
- name: Install ruby-build
become_user: "{{ user }}"
git: repo=https://github.com/rbenv/ruby-build.git dest=~/.rbenv/plugins/ruby-build
Π ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Ρ ΡΡΠ±ΠΈΠ½. ΠΠ²Π° ΡΠ΅ ΠΏΡΠ°Π²ΠΈ ΠΏΡΠ΅ΠΊΡ rbenv, ΠΎΠ΄Π½ΠΎΡΠ½ΠΎ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ ΡΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° bash:
- name: Install ruby
become_user: "{{ user }}"
shell: |
export PATH="${HOME}/.rbenv/bin:${PATH}"
eval "$(rbenv init -)"
rbenv install {{ ruby_version }}
args:
executable: /bin/bash
ΠΠ°ΠΆΡΠ²Π°ΠΌΠ΅ ΠΊΠΎΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π° Π΄Π° ΡΠ° ΠΈΠ·Π²ΡΡΠΈΠΌΠ΅ ΠΈ ΡΠΎ ΡΡΠΎ. ΠΠ΅ΡΡΡΠΎΠ°, ΠΎΠ²Π΄Π΅ ΡΠ΅ ΡΡΠ΅ΡΠ°Π²Π°ΠΌΠ΅ ΡΠΎ ΡΠ°ΠΊΡΠΎΡ Π΄Π΅ΠΊΠ° ansible Π½Π΅ Π³ΠΎ ΠΈΠ·Π²ΡΡΡΠ²Π° ΠΊΠΎΠ΄ΠΎΡ ΡΠΎΠ΄ΡΠΆΠ°Π½ Π²ΠΎ bashrc ΠΏΡΠ΅Π΄ Π΄Π° Π³ΠΈ ΠΈΠ·Π²ΡΡΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡΠ΅. ΠΠ²Π° Π·Π½Π°ΡΠΈ Π΄Π΅ΠΊΠ° rbenv ΡΠ΅ ΡΡΠ΅Π±Π° Π΄Π° ΡΠ΅ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ° Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Π²ΠΎ ΠΈΡΡΠ°ΡΠ° ΡΠΊΡΠΈΠΏΡΠ°.
Π‘Π»Π΅Π΄Π½ΠΈΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΡΠ΅ Π΄ΠΎΠ»ΠΆΠΈ Π½Π° ΡΠ°ΠΊΡΠΎΡ ΡΡΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° Π½Π° ΡΠΊΠΎΠ»ΠΊΠ° Π½Π΅ΠΌΠ° ΡΠΎΡΡΠΎΡΠ±Π° ΠΎΠ΄ ΡΠ°Π·Π±ΠΈΡΠ»ΠΈΠ²Π° Π³Π»Π΅Π΄Π½Π° ΡΠΎΡΠΊΠ°. Π’ΠΎΠ° Π΅, Π½Π΅ΠΌΠ° Π΄Π° ΠΈΠΌΠ° Π°Π²ΡΠΎΠΌΠ°ΡΡΠΊΠ° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π΄Π°Π»ΠΈ ΠΎΠ²Π°Π° Π²Π΅ΡΠ·ΠΈΡΠ° Π½Π° ΡΡΠ±ΠΈΠ½ Π΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π° ΠΈΠ»ΠΈ Π½Π΅. ΠΠΈΠ΅ ΠΌΠΎΠΆΠ΅ΠΌΠ΅ ΡΠ°ΠΌΠΈ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΠΌΠ΅ ΠΎΠ²Π°:
- name: Install ruby
become_user: "{{ user }}"
shell: |
export PATH="${HOME}/.rbenv/bin:${PATH}"
eval "$(rbenv init -)"
if ! rbenv versions | grep -q {{ ruby_version }}
then rbenv install {{ ruby_version }} && rbenv global {{ ruby_version }}
fi
args:
executable: /bin/bash
ΠΡΡΠ°Π½ΡΠ²Π° ΡΠ°ΠΌΠΎ Π΄Π° ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ° ΠΏΠ°ΠΊΠ΅Ρ:
- name: Install bundler
become_user: "{{ user }}"
shell: |
export PATH="${HOME}/.rbenv/bin:${PATH}"
eval "$(rbenv init -)"
gem install bundler
Π ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ, Π΄ΠΎΠ΄Π°ΡΡΠ΅ ΡΠ° Π½Π°ΡΠ°ΡΠ° ΡΠ»ΠΎΠ³Π° ruby_rbenv Π²ΠΎ Π³Π»Π°Π²Π½Π°ΡΠ° ΠΊΠ½ΠΈΠ³Π°.
Π‘ΠΏΠΎΠ΄Π΅Π»Π΅Π½ΠΈ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ.
ΠΠΎ ΠΏΡΠΈΠ½ΡΠΈΠΏ, ΠΏΠΎΡΡΠ°Π²ΡΠ²Π°ΡΠ΅ΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π·Π°Π²ΡΡΠΈ ΠΎΠ²Π΄Π΅. Π‘Π»Π΅Π΄Π½ΠΎ, ΠΎΡΡΠ°Π½ΡΠ²Π° ΡΠ°ΠΌΠΎ Π΄Π° ΡΠ΅ ΠΈΠ·Π²ΡΡΠΈ capistrano ΠΈ ΡΠΎΡ ΡΠ°ΠΌΠΈΠΎΡ ΡΠ΅ Π³ΠΎ ΠΊΠΎΠΏΠΈΡΠ° ΠΊΠΎΠ΄ΠΎΡ, ΡΠ΅ Π³ΠΈ ΡΠΎΠ·Π΄Π°Π΄Π΅ ΠΏΠΎΡΡΠ΅Π±Π½ΠΈΡΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΠΌΠΈ ΠΈ ΡΠ΅ ΡΠ° ΡΡΠ°ΡΡΡΠ²Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ° (Π°ΠΊΠΎ ΡΓ¨ Π΅ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½ΠΎ). Π‘Π΅ΠΏΠ°ΠΊ, capistrano ΡΠ΅ΡΡΠΎ Π±Π°ΡΠ° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠΊΠΈ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ, ΠΊΠ°ΠΊΠΎ Π½Π° ΠΏΡ database.yml
ΠΈΠ»ΠΈ .env
Π’ΠΈΠ΅ ΠΌΠΎΠΆΠ°Ρ Π΄Π° ΡΠ΅ ΠΊΠΎΠΏΠΈΡΠ°Π°Ρ ΠΈΡΡΠΎ ΠΊΠ°ΠΊΠΎ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈΡΠ΅ ΠΈ ΡΠ°Π±Π»ΠΎΠ½ΠΈΡΠ΅ Π·Π° nginx. ΠΠΌΠ° ΡΠ°ΠΌΠΎ Π΅Π΄Π½Π° ΡΡΠΏΡΠΈΠ»Π½ΠΎΡΡ. ΠΡΠ΅Π΄ Π΄Π° ΠΊΠΎΠΏΠΈΡΠ°ΡΠ΅ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ, ΡΡΠ΅Π±Π° Π΄Π° ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ ΡΡΡΡΠΊΡΡΡΠ° Π½Π° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΠΌΠΈ Π·Π° Π½ΠΈΠ², Π½Π΅ΡΡΠΎ ΠΊΠ°ΠΊΠΎ ΠΎΠ²Π°:
# Copy shared files for deploy
- name: Ensure shared dir
become_user: "{{ user }}"
file:
path: "{{ app_path }}/shared/config"
state: directory
Π½ΠΈΠ΅ Π½Π°Π·Π½Π°ΡΡΠ²Π°ΠΌΠ΅ ΡΠ°ΠΌΠΎ Π΅Π΄Π΅Π½ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΠΌ ΠΈ ansible Π°Π²ΡΠΎΠΌΠ°ΡΡΠΊΠΈ ΡΠ΅ ΠΊΡΠ΅ΠΈΡΠ° ΡΠΎΠ΄ΠΈΡΠ΅Π» Π΄ΠΎΠΊΠΎΠ»ΠΊΡ Π΅ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎ.
Ansible ΡΠ²ΠΎΠ΄
ΠΠ΅ΡΠ΅ Π½Π°ΠΈΠ΄ΠΎΠ²ΠΌΠ΅ Π½Π° ΡΠ°ΠΊΡΠΎΡ Π΄Π΅ΠΊΠ° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡΠ΅ ΠΌΠΎΠΆΠ°Ρ Π΄Π° ΡΠΎΠ΄ΡΠΆΠ°Ρ ΡΠ°ΡΠ½ΠΈ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΊΠ°ΠΊΠΎ ΡΡΠΎ Π΅ Π»ΠΎΠ·ΠΈΠ½ΠΊΠ°ΡΠ° Π½Π° ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠΎΡ. ΠΠΊΠΎ ΡΡΠ΅ ΡΠΎΠ·Π΄Π°Π»Π΅ .env
Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° Π·Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ°, ΠΈ database.yml
ΡΠΎΠ³Π°Ρ ΠΌΠΎΡΠ° Π΄Π° ΠΈΠΌΠ° ΡΡΡΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅ Π²Π°ΠΊΠ²ΠΈ ΠΊΡΠΈΡΠΈΡΠ½ΠΈ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ. ΠΠΈ Π±ΠΈΠ»ΠΎ Π΄ΠΎΠ±ΡΠΎ Π΄Π° Π³ΠΈ ΡΠΊΡΠΈΠ΅ΡΠ΅ ΠΎΠ΄ ΡΡΠ±ΠΎΠΏΠΈΡΠ½ΠΈΡΠ΅ ΠΎΡΠΈ. ΠΠ° ΡΠ°Π° ΡΠ΅Π» ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ
ΠΡΠ΄Π΅ Π΄Π° ΡΠΎΠ·Π΄Π°Π΄Π΅ΠΌΠ΅ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° Π·Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ /ansible/vars/all.yml
(Π’ΡΠΊΠ° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ Π·Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π³ΡΡΠΏΠΈ Π½Π° Ρ
ΠΎΡΡΠΎΠ²ΠΈ, ΠΈΡΡΠΎ ΠΊΠ°ΠΊΠΎ Π²ΠΎ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° ΡΠΎ ΠΈΠ½Π²Π΅Π½ΡΠ°Ρ: production.yml, staging.yml, ΠΈΡΠ½.).
Π‘ΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ ΡΡΠΎ ΠΌΠΎΡΠ° Π΄Π° ΡΠ΅ ΡΠΈΡΡΠΈΡΠ°Π°Ρ ΠΌΠΎΡΠ° Π΄Π° ΡΠ΅ ΠΏΡΠ΅Π½Π΅ΡΠ°Ρ Π²ΠΎ ΠΎΠ²Π°Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ ΡΡΠ°Π½Π΄Π°ΡΠ΄Π½Π° yml ΡΠΈΠ½ΡΠ°ΠΊΡΠ°:
# System vars
user_password: 123qweasd
db_password: 123qweasd
# ENV vars
aws_access_key_id: xxxxx
aws_secret_access_key: xxxxxx
aws_bucket: bucket_name
rails_secret_key_base: very_secret_key_base
ΠΠΎΡΠ»Π΅ ΡΠΎΠ° ΠΎΠ²Π°Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΠΈΡΡΠΈΡΠ° ΡΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ°:
ansible-vault encrypt ./vars/all.yml
ΠΡΠΈΡΠΎΠ΄Π½ΠΎ, ΠΏΡΠΈ ΡΠΈΡΡΠΈΡΠ°ΡΠ΅, ΡΠ΅ ΡΡΠ΅Π±Π° Π΄Π° ΠΏΠΎΡΡΠ°Π²ΠΈΡΠ΅ Π»ΠΎΠ·ΠΈΠ½ΠΊΠ° Π·Π° Π΄Π΅ΡΠΈΡΡΠΈΡΠ°ΡΠ΅. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ ΡΡΠΎ ΡΠ΅ ΠΈΠΌΠ° Π²ΠΎ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° ΠΎΡΠΊΠ°ΠΊΠΎ ΡΠ΅ ΡΠ° ΠΏΠΎΠ²ΠΈΠΊΠ°ΡΠ΅ ΠΎΠ²Π°Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°.
Π‘ΠΎ ΠΏΠΎΠΌΠΎΡ Π½Π° ansible-vault decrypt
Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π΄Π΅ΡΠΈΡΡΠΈΡΠ°, ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠ° ΠΈ ΠΏΠΎΡΠΎΠ° ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ Π΄Π° ΡΠ΅ ΡΠΈΡΡΠΈΡΠ°.
ΠΠ΅ ΡΡΠ΅Π±Π° Π΄Π° ΡΠ° Π΄Π΅ΡΠΈΡΡΠΈΡΠ°ΡΠ΅ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° Π·Π° Π΄Π° ΡΠ°Π±ΠΎΡΠΈ. ΠΠΎ ΡΠΊΠ»Π°Π΄ΠΈΡΠ°ΡΠ΅ ΡΠΈΡΡΠΈΡΠ°Π½ΠΎ ΠΈ ΡΠ° ΡΡΠ°ΡΡΡΠ²Π°ΡΠ΅ Playbook ΡΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΡ --ask-vault-pass
. Ansible ΡΠ΅ ΠΏΠΎΠ±Π°ΡΠ° Π»ΠΎΠ·ΠΈΠ½ΠΊΠ°, ΡΠ΅ Π³ΠΈ Π²ΡΠ°ΡΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡΠ΅ ΠΈ ΡΠ΅ Π³ΠΈ ΠΈΠ·Π²ΡΡΠΈ Π·Π°Π΄Π°ΡΠΈΡΠ΅. Π‘ΠΈΡΠ΅ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΡΠ΅ ΠΎΡΡΠ°Π½Π°Ρ ΡΠΈΡΡΠΈΡΠ°Π½ΠΈ.
Π¦Π΅Π»ΠΎΡΠ½Π°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π° Π·Π° Π½Π΅ΠΊΠΎΠ»ΠΊΡ Π³ΡΡΠΏΠΈ Π½Π° Π΄ΠΎΠΌΠ°ΡΠΈΠ½ΠΈ ΠΈ ansible vault ΡΠ΅ ΠΈΠ·Π³Π»Π΅Π΄Π° Π²Π°ΠΊΠ°:
ansible-playbook -i inventory ./playbook.yml -l "staging" --ask-vault-pass
ΠΠΎ, Π½Π΅ΠΌΠ° Π΄Π° Π²ΠΈ Π³ΠΎ Π΄Π°Π΄Π°ΠΌ ΡΠ΅Π»ΠΎΡΠ½ΠΈΠΎΡ ΡΠ΅ΠΊΡΡ Π½Π° ΠΈΠ³ΡΠ°ΡΠΊΠΈΡΠ΅ ΠΈ ΡΠ»ΠΎΠ³ΠΈΡΠ΅, Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ Π³ΠΎ ΡΠ°ΠΌΠΈ. ΠΠΈΠ΄Π΅ΡΡΠΈ ansible Π΅ ΡΠ°ΠΊΠΎΠ² - Π°ΠΊΠΎ Π½Π΅ ΡΠ°Π·Π±ΠΈΡΠ°ΡΠ΅ ΡΡΠΎ ΡΡΠ΅Π±Π° Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ, ΡΠΎΠ³Π°Ρ ΡΠΎΠ° Π½Π΅ΠΌΠ° Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈ ΡΠΎΠ° Π·Π° Π²Π°Ρ.
ΠΠ·Π²ΠΎΡ: www.habr.com