ΠΠ΅ΠΎΡΠ΄Π°Π²Π½Π° ΡΡΡΠ±Π²Π°ΡΠ΅ Π΄Π° Π½Π°ΠΏΠΈΡΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ Ansible playbooks, Π·Π° Π΄Π° ΠΏΠΎΠ΄Π³ΠΎΡΠ²Ρ ΡΡΡΠ²ΡΡΠ° Π·Π° Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π½Π° Rails ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π, ΠΈΠ·Π½Π΅Π½Π°Π΄Π²Π°ΡΠΎ, Π½Π΅ Π½Π°ΠΌΠ΅ΡΠΈΡ ΠΏΡΠΎΡΡΠΎ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ ΡΡΡΠΏΠΊΠ° ΠΏΠΎ ΡΡΡΠΏΠΊΠ°. ΠΠ΅ ΠΈΡΠΊΠ°Ρ Π΄Π° ΠΊΠΎΠΏΠΈΡΠ°ΠΌ Π½Π΅ΡΠΈΡ Π΄ΡΡΠ³Π° ΠΊΠ½ΠΈΠ³Π°, Π±Π΅Π· Π΄Π° ΡΠ°Π·Π±ΠΈΡΠ°ΠΌ ΠΊΠ°ΠΊΠ²ΠΎ ΡΠ΅ ΡΠ»ΡΡΠ²Π°, ΠΈ Π² ΠΊΡΠ°ΠΉΠ½Π° ΡΠΌΠ΅ΡΠΊΠ° ΡΡΡΠ±Π²Π°ΡΠ΅ Π΄Π° ΠΏΡΠΎΡΠ΅ΡΠ° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡΠ°, ΡΡΠ±ΠΈΡΠ°ΠΉΠΊΠΈ Π²ΡΠΈΡΠΊΠΎ ΡΠ°ΠΌ. ΠΠΎΠΆΠ΅ Π±ΠΈ ΠΌΠΎΠ³Π° Π΄Π° ΠΏΠΎΠΌΠΎΠ³Π½Π° Π½Π° Π½ΡΠΊΠΎΠ³ΠΎ Π΄Π° ΡΡΠΊΠΎΡΠΈ ΡΠΎΠ·ΠΈ ΠΏΡΠΎΡΠ΅Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ.
ΠΡΡΠ²ΠΎΡΠΎ Π½Π΅ΡΠΎ, ΠΊΠΎΠ΅ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΡΠ΅ Π΅, ΡΠ΅ ansible Π²ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ ΡΠ΄ΠΎΠ±Π΅Π½ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π·Π° ΠΈΠ·Π²ΡΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½ ΡΠΏΠΈΡΡΠΊ ΠΎΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Π½Π° ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½ ΡΡΡΠ²ΡΡ(ΠΈ) ΡΡΠ΅Π· SSH. Π’ΡΠΊ Π½ΡΠΌΠ° ΠΌΠ°Π³ΠΈΡ, Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ ΠΏΠ»ΡΠ³ΠΈΠ½ ΠΈ Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π½Π° Π²Π°ΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±Π΅Π· ΠΏΡΠ΅ΠΊΡΡΠ²Π°Π½Π΅ Ρ Π΄ΠΎΠΊΠ΅Ρ, ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ ΠΈ Π΄ΡΡΠ³ΠΈ Π΅ΠΊΡΡΡΠΈ. ΠΠ° Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ ΠΊΠ½ΠΈΠ³Π°-ΠΈΠ³ΡΠ°, ΡΡΡΠ±Π²Π° Π΄Π° Π·Π½Π°Π΅ΡΠ΅ ΠΊΠ°ΠΊΠ²ΠΎ ΡΠΎΡΠ½ΠΎ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΠΈ ΠΊΠ°ΠΊ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅. ΠΡΠΎ Π·Π°ΡΠΎ Π½Π΅ ΡΡΠΌ Π΄ΠΎΠ²ΠΎΠ»Π΅Π½ ΠΎΡ Π³ΠΎΡΠΎΠ²ΠΈ ΠΊΠ½ΠΈΠ³ΠΈ Π·Π° ΠΈΠ³ΡΠΈ ΠΎΡ GitHub ΠΈΠ»ΠΈ ΡΡΠ°ΡΠΈΠΈ ΠΊΠ°ΡΠΎ: βΠΠΎΠΏΠΈΡΠ°ΠΉ ΠΈ ΡΡΠ°ΡΡΠΈΡΠ°ΠΉ, ΡΠ΅ ΡΠ°Π±ΠΎΡΠΈ.β
ΠΠ°ΠΊΠ²ΠΎ Π½ΠΈ ΡΡΡΠ±Π²Π°?
ΠΠ°ΠΊΡΠΎ Π²Π΅ΡΠ΅ ΠΊΠ°Π·Π°Ρ , Π·Π° Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ ΠΊΠ½ΠΈΠ³Π°-ΠΈΠ³ΡΠ° ΡΡΡΠ±Π²Π° Π΄Π° Π·Π½Π°Π΅ΡΠ΅ ΠΊΠ°ΠΊΠ²ΠΎ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΠΈ ΠΊΠ°ΠΊ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅. ΠΠ° ΡΠ΅ΡΠΈΠΌ ΠΊΠ°ΠΊΠ²ΠΎ Π½ΠΈ ΡΡΡΠ±Π²Π°. ΠΠ° Rails ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠ΅ Π½ΠΈ ΡΡΡΠ±Π²Π°Ρ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈ ΠΏΠ°ΠΊΠ΅ΡΠ°: nginx, postgresql (redis ΠΈ Ρ.Π½.). ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π° ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅ΠΌ ΠΎΡ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½Π° Π²Π΅ΡΡΠΈΡ Π½Π° ruby. ΠΠ°ΠΉ-Π΄ΠΎΠ±ΡΠ΅ Π΅ Π΄Π° Π³ΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ ΡΡΠ΅Π· rbenv (rvm, asdf...). ΠΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° Π²ΡΠΈΡΠΊΠΎ ΡΠΎΠ²Π° ΠΊΠ°ΡΠΎ root ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π» Π²ΠΈΠ½Π°Π³ΠΈ Π΅ Π»ΠΎΡΠ° ΠΈΠ΄Π΅Ρ, ΡΠ°ΠΊΠ° ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ ΠΎΡΠ΄Π΅Π»Π΅Π½ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π» ΠΈ Π΄Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΡΠ΅ Π½Π΅Π³ΠΎΠ²ΠΈΡΠ΅ ΠΏΡΠ°Π²Π°. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΡΡΠ±Π²Π° Π΄Π° ΠΊΠ°ΡΠΈΡΠ΅ Π½Π°ΡΠΈΡ ΠΊΠΎΠ΄ Π½Π° ΡΡΡΠ²ΡΡΠ°, Π΄Π° ΠΊΠΎΠΏΠΈΡΠ°ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈΡΠ΅ Π·Π° nginx, postgres ΠΈ Ρ.Π½. ΠΈ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ Π²ΡΠΈΡΠΊΠΈ ΡΠ΅Π·ΠΈ ΡΡΠ»ΡΠ³ΠΈ.
Π ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΡΠΎΠ²Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎΡΡΡΠ° ΠΎΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Π΅ ΡΠ»Π΅Π΄Π½Π°ΡΠ°:
- ΠΠ»Π΅Π·ΡΠ΅ ΠΊΠ°ΡΠΎ root
- ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΉΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΈ
- ΡΡΠ·Π΄Π°ΠΉΡΠ΅ Π½ΠΎΠ² ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π», ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΠΉΡΠ΅ ΠΏΡΠ°Π²Π°, ssh ΠΊΠ»ΡΡ
- ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΠΉΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΈ (nginx ΠΈ Ρ.Π½.) ΠΈ Π³ΠΈ ΡΡΠ°ΡΡΠΈΡΠ°ΠΉΡΠ΅
- Π‘ΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π» Π² Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ (ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²Π΅Π΄Π½Π°Π³Π° Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ)
- ΠΠ»Π΅Π·ΡΠ΅ ΠΊΠ°ΡΠΎ Π½ΠΎΠ² ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»
- ΠΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΉΡΠ΅ rbenv ΠΈ ruby
- ΠΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠ°
- ΠΠ°ΡΠ²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ΄Π° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ
- Π‘ΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° Puma ΡΡΡΠ²ΡΡ
ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π°, ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ Π΅ΡΠ°ΠΏΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ Π½Π°ΠΏΡΠ°Π²Π΅Π½ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° capistrano, ΠΏΠΎΠ½Π΅ ΠΈΠ·Π²ΡΠ½ ΠΊΡΡΠΈΡΡΠ° ΡΠΎΠΉ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΊΠΎΠΏΠΈΡΠ° ΠΊΠΎΠ΄ Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ Π·Π° ΠΈΠ·Π΄Π°Π²Π°Π½Π΅, Π΄Π° ΠΏΡΠ΅Π²ΠΊΠ»ΡΡΠ²Π° ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ΡΠΎ ΡΡΡ ΡΠΈΠΌΠ²ΠΎΠ»Π½Π° Π²ΡΡΠ·ΠΊΠ° ΠΏΡΠΈ ΡΡΠΏΠ΅ΡΠ½ΠΎ ΡΠ°Π·Π³ΡΡΡΠ°Π½Π΅, Π΄Π° ΠΊΠΎΠΏΠΈΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΠΎΡ ΡΠΏΠΎΠ΄Π΅Π»Π΅Π½Π° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ, Π΄Π° ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ° puma ΠΈ Ρ.Π½. ΠΡΠΈΡΠΊΠΎ ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Ansible, Π½ΠΎ Π·Π°ΡΠΎ?
Π€Π°ΠΉΠ»ΠΎΠ²Π° ΡΡΡΡΠΊΡΡΡΠ°
Ansible ΠΈΠΌΠ° ΡΡΡΠΎΠ³
ΠΡΠΎΡΡΠ° ΠΊΠ½ΠΈΠ³Π° Π·Π° ΠΈΠ³ΡΠ°
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 ΠΊΠ°Π·Π²Π°, ΡΠ΅ Π½Π΅ Π·Π½Π°Π΅ Π½ΠΈΡΠΎ Π΅Π΄ΠΈΠ½ Ρ
ΠΎΡΡ, ΠΊΠΎΠΉΡΠΎ Π΄Π° ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²Π° Π½Π° ΡΠΏΠΈΡΡΠΊΠ° Ρ Π²ΡΠΈΡΠΊΠΈ. Π’Π΅ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π°Ρ ΠΈΠ·Π±ΡΠΎΠ΅Π½ΠΈ Π² ΡΠΏΠ΅ΡΠΈΠ°Π»Π΅Π½
ΠΠ΅ΠΊΠ° Π³ΠΎ ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ Π² ΡΡΡΠ°ΡΠ° 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).
ΠΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ Π²ΡΡΠ·ΠΊΠ°ΡΠ° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΎΡΠΎ ΠΈΠΌΠ΅, ΠΏΠΎΠ΄ ΠΊΠΎΠ΅ΡΠΎ ΡΡΠ΅ Π²Π»Π΅Π·Π»ΠΈ Π² ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ°. ΠΠ°ΠΉ-Π²Π΅ΡΠΎΡΡΠ½ΠΎ Π½ΡΠΌΠ° Π΄Π° Π΅ Π½Π° Ρ ΠΎΡΡΠ°. ΠΡΠ² ΡΠ°ΠΉΠ»Π° Π½Π° ΠΊΠ½ΠΈΠ³Π°ΡΠ° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΠΎΡΠΎΡΠΈΡΠ΅ ΠΊΠΎΠΉ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π» Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ Π·Π° ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Π°ΡΠ° remote_user. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡΡΠ° Π·Π° ΠΎΡΠ΄Π°Π»Π΅ΡΠ΅Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ° ΡΠ΅ΡΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π²ΠΈ Π΅ Π½Π΅Π½ΡΠΆΠ½Π° ΠΈ Π½Π΅ ΡΡΡΠ±Π²Π° Π΄Π° Π³ΡΠ±ΠΈΡΠ΅ Π²ΡΠ΅ΠΌΠ΅ Π·Π° Π½Π΅ΠΉΠ½ΠΎΡΠΎ ΡΡΠ±ΠΈΡΠ°Π½Π΅. Π’Π°Π·ΠΈ Π·Π°Π΄Π°ΡΠ° ΠΌΠΎΠΆΠ΅ ΡΡΡΠΎ Π΄Π° Π±ΡΠ΄Π΅ Π΄Π΅Π°ΠΊΡΠΈΠ²ΠΈΡΠ°Π½Π°:
---
- name: Simple playbook
hosts: all
remote_user: root
become: true
gather_facts: no
ΠΠΏΠΈΡΠ°ΠΉΡΠ΅ ΠΎΡΠ½ΠΎΠ²ΠΎ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ ΠΊΠ½ΠΈΠ³Π°ΡΠ° ΠΈ ΡΠ΅ ΡΠ²Π΅ΡΠ΅ΡΠ΅, ΡΠ΅ Π²ΡΡΠ·ΠΊΠ°ΡΠ° ΡΠ°Π±ΠΎΡΠΈ. (ΠΠΊΠΎ ΡΡΠ΅ ΠΏΠΎΡΠΎΡΠΈΠ»ΠΈ root ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ, ΡΠΎΠ³Π°Π²Π° ΡΡΡΠ±Π²Π° ΡΡΡΠΎ Π΄Π° ΠΏΠΎΡΠΎΡΠΈΡΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Π°ΡΠ° become: true, Π·Π° Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ ΠΏΠΎΠ²ΠΈΡΠ΅Π½ΠΈ ΠΏΡΠ°Π²Π°. ΠΠ°ΠΊΡΠΎ Π΅ Π½Π°ΠΏΠΈΡΠ°Π½ΠΎ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡΠ°: become set to βtrueβ/βyesβ to activate privilege escalation.
Π²ΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ Π½Π΅ Π΅ Π½Π°ΠΏΡΠ»Π½ΠΎ ΡΡΠ½ΠΎ Π·Π°ΡΠΎ).
ΠΠΎΠΆΠ΅ Π±ΠΈ ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ Π³ΡΠ΅ΡΠΊΠ°, ΠΏΡΠΈΡΠΈΠ½Π΅Π½Π° ΠΎΡ ΡΠ°ΠΊΡΠ°, ΡΠ΅ ansible Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠ° Π½Π° Python, ΡΠΎΠ³Π°Π²Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΎ ΠΏΠΎΡΠΎΡΠΈΡΠ΅ ΡΡΡΠ½ΠΎ:
ansible_python_interpreter: /usr/bin/python3
ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΡΠ΅ ΠΊΡΠ΄Π΅ ΠΈΠΌΠ°ΡΠ΅ python Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° whereis python
.
ΠΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΈ
Π‘ΡΠ°Π½Π΄Π°ΡΡΠ½Π°ΡΠ° Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΡ Π½Π° Ansible Π²ΠΊΠ»ΡΡΠ²Π° ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠΎΠ΄ΡΠ»ΠΈ Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΈ, ΡΠ°ΠΊΠ° ΡΠ΅ Π½Π΅ ΡΠ΅ Π½Π°Π»Π°Π³Π° Π΄Π° ΠΏΠΈΡΠ΅ΠΌ bash ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅ ΠΏΠΎ Π½ΡΠΊΠ°ΠΊΠ²Π° ΠΏΡΠΈΡΠΈΠ½Π°. Π‘Π΅Π³Π° ΠΈΠΌΠ°ΠΌΠ΅ Π½ΡΠΆΠ΄Π° ΠΎΡ Π΅Π΄ΠΈΠ½ ΠΎΡ ΡΠ΅Π·ΠΈ ΠΌΠΎΠ΄ΡΠ»ΠΈ, Π·Π° Π΄Π° Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° ΠΈ Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΈ. ΠΠΌΠ°ΠΌ 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, ΠΊΠΎΠΉΡΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ ΡΠ΅Π³Π°. ΠΡΠ½ΠΎΠ²ΠΎ, ΡΡΡΠ±Π²Π° Π΄Π° Π·Π½Π°Π΅ΡΠ΅ ΠΈ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΡΠΎΠ²Π°; ansible ΡΠ°ΠΌ ΠΏΠΎ ΡΠ΅Π±Π΅ ΡΠΈ Π½ΡΠΌΠ° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈ ΡΠΎΠ²Π°.
ΠΠΏΠΈΡΠ°ΠΉΡΠ΅ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ ΠΎΡΠ½ΠΎΠ²ΠΎ ΠΊΠ½ΠΈΠ³Π°ΡΠ° ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠ΅ΡΠ΅ Π΄Π°Π»ΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΈΡΠ΅ ΡΠ° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ΠΈ.
Π‘ΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° Π½ΠΎΠ²ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ.
ΠΠ° ΡΠ°Π±ΠΎΡΠ° Ρ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ 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) ΠΈ ΡΠ΅ ΡΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠΈΠΌΠΈ Π·Π° Π²ΡΠΈΡΠΊΠΈ Ρ
ΠΎΡΡΠΎΠ²Π΅ (all).
ΠΠΈΠ·Π°ΠΉΠ½ΡΡ ΡΡΡΠΎ Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ΅Π½ "{{ 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
(main Π΅ ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΡ ΡΠ°ΠΉΠ», ΠΊΠΎΠΉΡΠΎ ΡΠ΅ Π±ΡΠ΄Π΅ Π·Π°ΡΠ΅Π΄Π΅Π½ ΠΈ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½, ΠΊΠΎΠ³Π°ΡΠΎ Π΄Π°Π΄Π΅Π½Π° ΡΠΎΠ»Ρ Π΅ ΡΠ²ΡΡΠ·Π°Π½Π° Ρ playbook; Π΄ΡΡΠ³ΠΈ ΡΠΎΠ»Π΅Π²ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΡΠ²ΡΡΠ·Π°Π½ΠΈ ΠΊΡΠΌ Π½Π΅Π³ΠΎ). Π‘Π΅Π³Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠ΅Ρ
Π²ΡΡΠ»ΠΈΡΠ΅ Π²ΡΠΈΡΠΊΠΈ Π·Π°Π΄Π°ΡΠΈ, ΡΠ²ΡΡΠ·Π°Π½ΠΈ Ρ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ, Π² ΡΠΎΠ·ΠΈ ΡΠ°ΠΉΠ»:
# 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 ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΈ Π·Π° ΡΠΎΠ²Π° ΠΈ ΡΠ΅ ΠΏΡΠΎΠΏΡΡΠ½Π΅ Π·Π°Π΄Π°ΡΠ°ΡΠ°. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π° ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ΡΠ΅ Π½ΡΠΌΠ° Π΄Π° Π±ΡΠ΄Π°Ρ ΠΊΠΎΠΏΠΈΡΠ°Π½ΠΈ, Π°ΠΊΠΎ Π½Π°ΠΏΡΠ»Π½ΠΎ ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²Π°Ρ Π½Π° ΡΠΎΠ²Π°, ΠΊΠΎΠ΅ΡΠΎ Π²Π΅ΡΠ΅ Π΅ Π½Π° ΡΡΡΠ²ΡΡΠ°. ΠΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΠ΅ Π²ΡΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΎΡ ΡΠΎΠ²Π° ΠΈ Π΄Π° ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ 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 ΠΊΡΠΌ Π³Π»Π°Π²Π½Π°ΡΠ° ΠΊΠ½ΠΈΠ³Π° Π·Π° ΠΈΠ³ΡΠ°.
ΠΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ Π½Π° ruby ββββΡΡΠ΅Π· 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
ΠΠΈΠ΅ ΠΎΡΠ½ΠΎΠ²ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Π°ΡΠ° become_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
Π Π½Π°ΠΊΡΠ°Ρ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΉΡΠ΅ ruby. Π’ΠΎΠ²Π° ΡΡΠ°Π²Π° ΡΡΠ΅Π· 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 ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ° Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Π² ΡΡΡΠΈΡ ΡΠΊΡΠΈΠΏΡ.
Π‘Π»Π΅Π΄Π²Π°ΡΠΈΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΡΠ΅ Π΄ΡΠ»ΠΆΠΈ Π½Π° ΡΠ°ΠΊΡΠ°, ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° Π½Π° ΠΎΠ±Π²ΠΈΠ²ΠΊΠ°ΡΠ° Π½ΡΠΌΠ° ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ ΠΎΡ Π°Π½Π·ΠΈΠ±ΠΈΠ»Π½Π° Π³Π»Π΅Π΄Π½Π° ΡΠΎΡΠΊΠ°. Π’ΠΎΠ΅ΡΡ Π½ΡΠΌΠ° Π΄Π° ΠΈΠΌΠ° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π΄Π°Π»ΠΈ ΡΠ°Π·ΠΈ Π²Π΅ΡΡΠΈΡ Π½Π° ruby ββΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π° ΠΈΠ»ΠΈ Π½Π΅. ΠΠΎΠΆΠ΅ΠΌ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ ΡΠΎΠ²Π° ΡΠ°ΠΌΠΈ:
- 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
ΠΡΠΈΡΠΊΠΎ, ΠΊΠΎΠ΅ΡΠΎ ΠΎΡΡΠ°Π²Π°, Π΅ Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ bundler:
- 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 Vault
ΠΠ΅ΡΠ΅ ΡΠ΅ Π½Π°ΡΡΠΊΠ½Π°Ρ
ΠΌΠ΅ Π½Π° ΡΠ°ΠΊΡΠ°, ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΡΠ΄ΡΡΠΆΠ°Ρ ΡΠ΅ΠΊΡΠ΅ΡΠ½ΠΈ Π΄Π°Π½Π½ΠΈ, ΠΊΠ°ΡΠΎ ΠΏΠ°ΡΠΎΠ»Π°ΡΠ° Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ. ΠΠΊΠΎ ΡΡΠ΅ ΡΡΠ·Π΄Π°Π»ΠΈ .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
ΡΠ°ΠΉΠ»ΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ Π΄Π΅ΡΠΈΡΡΠΈΡΠ°Π½, ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠ°Π½ ΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΠΎΡΠ½ΠΎΠ²ΠΎ ΠΊΡΠΈΠΏΡΠΈΡΠ°Π½.
ΠΠ΅ Π΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° Π΄Π΅ΡΠΈΡΡΠΈΡΠ°ΡΠ΅ ΡΠ°ΠΉΠ»Π°, Π·Π° Π΄Π° ΡΠ°Π±ΠΎΡΠΈ. Π‘ΡΡ
ΡΠ°Π½ΡΠ²Π°ΡΠ΅ Π³ΠΎ ΡΠΈΡΡΠΎΠ²Π°Π½ ΠΈ ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ ΠΊΠ½ΠΈΠ³Π°ΡΠ° Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° --ask-vault-pass
. Ansible ΡΠ΅ ΠΏΠΎΠΈΡΠΊΠ° ΠΏΠ°ΡΠΎΠ»Π°ΡΠ°, ΡΠ΅ ΠΈΠ·Π²Π»Π΅ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡΠ΅ ΠΈ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΠΈ Π·Π°Π΄Π°ΡΠΈΡΠ΅. ΠΡΠΈΡΠΊΠΈ Π΄Π°Π½Π½ΠΈ ΡΠ΅ ΠΎΡΡΠ°Π½Π°Ρ ΠΊΡΠΈΠΏΡΠΈΡΠ°Π½ΠΈ.
ΠΡΠ»Π½Π°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π° Π·Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π³ΡΡΠΏΠΈ Ρ ΠΎΡΡΠΎΠ²Π΅ ΠΈ ansible vault ΡΠ΅ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΏΠΎ ΡΠ»Π΅Π΄Π½ΠΈΡ Π½Π°ΡΠΈΠ½:
ansible-playbook -i inventory ./playbook.yml -l "staging" --ask-vault-pass
ΠΠΎ Π½ΡΠΌΠ° Π΄Π° Π²ΠΈ Π΄Π°ΠΌ ΠΏΡΠ»Π½ΠΈΡ ΡΠ΅ΠΊΡΡ Π½Π° ΠΊΠ½ΠΈΠ³ΠΈΡΠ΅ ΠΈ ΡΠΎΠ»ΠΈΡΠ΅, Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ Π³ΠΎ ΡΠ°ΠΌΠΈ. Π’ΡΠΉ ΠΊΠ°ΡΠΎ ansible Π΅ ΡΠ°ΠΊΠ° - Π°ΠΊΠΎ Π½Π΅ ΡΠ°Π·Π±ΠΈΡΠ°ΡΠ΅ ΠΊΠ°ΠΊΠ²ΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ, ΡΠΎΠ³Π°Π²Π° ΡΠΎΠΉ Π½ΡΠΌΠ° Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈ Π²ΠΌΠ΅ΡΡΠΎ Π²Π°Ρ.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com