ΠΠ΅ ΡΠ°ΠΊ Π΄Π°Π²Π½ΠΎ ΠΌΠ½Π΅ Π±ΡΠ»ΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°ΠΏΠΈΡΠ°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ansible playbooks Π΄Π»Ρ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΊ Π΄Π΅ΠΏΠ»ΠΎΡ rails ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. Π, Π½Π° ΡΠ΄ΠΈΠ²Π»Π΅Π½ΠΈΠ΅, Ρ Π½Π΅ Π½Π°ΡΠ΅Π» ΠΏΡΠΎΡΡΠΎΠ³ΠΎ ΠΏΠΎΡΠ°Π³ΠΎΠ²ΠΎΠ³ΠΎ ΠΌΠ°Π½ΡΠ°Π»Π°. ΠΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠΆΠΎΠΉ ΠΏΠ»Π΅ΠΉΠ±ΡΠΊ Π±Π΅Π· ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΡΡΠ΅Π³ΠΎ Ρ Π½Π΅ Ρ ΠΎΡΠ΅Π» ΠΈ Π² ΠΈΡΠΎΠ³Π΅ ΠΏΡΠΈΡΠ»ΠΎΡΡ ΡΠΈΡΠ°ΡΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ, ΡΠΎΠ±ΠΈΡΠ°Ρ Π²ΡΠ΅ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ. ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠΌΡ-ΡΠΎ Ρ ΡΠΌΠΎΠ³Ρ ΠΏΠΎΠΌΠΎΡΡ ΡΡΠΎΡ ΠΏΡΠΎΡΠ΅ΡΡ ΡΡΠΊΠΎΡΠΈΡΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ Π΄Π°Π½Π½ΠΎΠΉ ΡΡΠ°ΡΡΠΈ.
ΠΠ΅ΡΠ²ΡΠΌ Π΄Π΅Π»ΠΎΠΌ ΡΡΠΎΠΈΡ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡΡ, ΡΡΠΎ ansible ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π²Π°ΠΌ ΡΠ΄ΠΎΠ±Π½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π·Π°ΡΠ°Π½Π΅Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΏΠΈΡΠΊΠ° Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ Π½Π° ΡΠ΄Π°Π»Π΅Π½Π½ΠΎΠΌ ΡΠ΅ΡΠ²Π΅ΡΠ΅ (ΡΠ΅ΡΠ²Π΅ΡΠ°Ρ ) ΡΠ΅ΡΠ΅Π· SSH. Π’ΡΡ Π½Π΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΌΠ°Π³ΠΈΠΈ, Π½Π΅Π»ΡΠ·Ρ ΠΏΠΎΡΡΠ°Π²ΠΈΡΡ ΠΏΠ»Π°Π³ΠΈΠ½ ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΈΠ· ΠΊΠΎΡΠΎΠ±ΠΊΠΈ zero downtime Π΄Π΅ΠΏΠ»ΠΎΠΉ ΡΠ²ΠΎΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Ρ Π΄ΠΎΠΊΠ΅ΡΠΎΠΌ, ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ΠΎΠΌ ΠΈ ΠΏΡΠΎΡΠΈΠΌΠΈ ΠΏΠ»ΡΡΠΊΠ°ΠΌΠΈ. ΠΠ»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΠΏΠ»Π΅ΠΉΠ±ΡΠΊ Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ Π·Π½Π°ΡΡ ΡΡΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ ΡΠ΄Π΅Π»Π°ΡΡ ΠΈ ΠΊΠ°ΠΊ ΡΡΠΎ ΡΠ΄Π΅Π»Π°ΡΡ. ΠΠΎΡΡΠΎΠΌΡ ΠΌΠ΅Π½Ρ Π½Π΅ ΡΡΡΡΠ°ΠΈΠ²Π°ΡΡ Π³ΠΎΡΠΎΠ²ΡΠ΅ ΠΏΠ»Π΅ΠΉΠ±ΡΠΊΠΈ Ρ Π³ΠΈΡΡ Π°Π±Π°, ΠΈΠ»ΠΈ ΡΡΠ°ΡΡΠΈ Π²ΠΈΠ΄Π°: βΠ‘ΠΊΠΎΠΏΠΈΡΡΠΉΡΠ΅ ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΠ΅, β Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡβ.
Π§ΡΠΎ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ?
ΠΠ°ΠΊ Ρ ΡΠΆΠ΅ Π³ΠΎΠ²ΠΎΡΠΈΠ», Π΄Π»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΠΏΠ»Π΅ΠΉΠ±ΡΠΊ Π½Π°Π΄ΠΎ Π·Π½Π°ΡΡ, ΡΡΠΎ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ ΡΠ΄Π΅Π»Π°ΡΡ ΠΈ ΠΊΠ°ΠΊ ΡΡΠΎ ΡΠ΄Π΅Π»Π°ΡΡ. ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌΡΡ Ρ ΡΠ΅ΠΌ, ΡΡΠΎ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ. ΠΠ»Ρ Rails ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΡ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ²: nginx, postgresql (redis, e.t.c.). ΠΠΎΠΌΠΈΠΌΠΎ ΡΡΠΎΠ³ΠΎ Π½Π°ΠΌ Π½ΡΠΆΠ΅Π½ ruby ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ. Π‘ΡΠ°Π²ΠΈΡΡ Π΅Π³ΠΎ Π»ΡΡΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΡΠ΅ΡΠ΅Π· rbenv (rvm, asdfβ¦). ΠΠ°ΠΏΡΡΠΊΠ°ΡΡ Π²ΡΠ΅ ΡΡΠΎ ΠΈΠ· ΠΏΠΎΠ΄ root ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ β Π²ΡΠ΅Π³Π΄Π° ΠΏΠ»ΠΎΡ Π°Ρ ΠΈΠ΄Π΅Ρ, ΠΏΠΎΡΡΠΎΠΌΡ Π½Π°Π΄ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΠΈ Π½Π°ΡΡΡΠΎΠΈΡΡ Π΅ΠΌΡ ΠΏΡΠ°Π²Π°. ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°Π»ΠΈΡΡ Π½Π°Ρ ΠΊΠΎΠ΄ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ, ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΠΈ Π΄Π»Ρ nginx, postgres, e.t.c. ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΡ Π²ΡΠ΅ ΡΡΠΈ ΡΠ΅ΡΠ²ΠΈΡΡ.
Π ΠΈΡΠΎΠ³Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ ΡΠ°ΠΊΠ°Ρ:
- ΠΠΎΠ³ΠΈΠ½ΠΈΠΌΡΡ ΠΏΠΎΠ΄ ΡΡΡΠΎΠΌ
- ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡ
- ΡΠΎΠ·Π΄Π°Π΅ΠΌ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌ ΠΏΡΠ°Π²Π°, ssh ΠΊΠ»ΡΡ
- Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡ (nginx e.t.c) ΠΈ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΠΈΡ
- Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π² ΠΠ (ΠΌΠΎΠΆΠ½ΠΎ ΡΡΠ°Π·Ρ ΠΈ Π±Π°Π·Ρ ΡΠΎΠ·Π΄Π°ΡΡ)
- ΠΠΎΠ³ΠΈΠ½ΠΈΠΌΡΡ Π½ΠΎΠ²ΡΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ
- Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ rbenv ΠΈ ruby
- Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Π±Π°Π½Π΄Π»Π΅Ρ
- ΠΠ°Π»ΠΈΠ²Π°Π΅ΠΌ ΠΊΠΎΠ΄ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
- ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΠΌ Puma ΡΠ΅ΡΠ²Π΅Ρ
ΠΡΠΈΡΠ΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ ΡΡΠ°ΠΏΡ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°ΡΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ capistrano, ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅ ΠΎΠ½Π° ΠΈΠ· ΠΊΠΎΡΠΎΠ±ΠΊΠΈ ΡΠΌΠ΅Π΅Ρ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ Π² ΡΠ΅Π»ΠΈΠ·Π½ΡΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ, ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ°ΡΡ ΡΠ΅Π»ΠΈΠ· ΡΠΈΠΌΠ»ΠΈΠ½ΠΊΠΎΠΌ ΠΏΡΠΈ ΡΡΠΏΠ΅ΡΠ½ΠΎΠΌ Π΄Π΅ΠΏΠ»ΠΎΠ΅, ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΠΈ ΠΈΠ· shared Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ, ΡΠ΅ΡΡΠ°ΡΡΠΎΠ²Π°ΡΡ puma ΠΈ.Ρ.Π΄. ΠΡΠ΅ ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΠΈ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ Ansible, Π½ΠΎ Π·Π°ΡΠ΅ΠΌ?
Π€Π°ΠΉΠ»ΠΎΠ²Π°Ρ ΡΡΡΡΠΊΡΡΡΠ°
Ansible ΠΈΠΌΠ΅Π΅Ρ ΡΡΡΠΎΠ³ΡΡ
Simple Playbook
Playbook β ΡΡΠΎ yml ΡΠ°ΠΉΠ», Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ° ΠΎΠΏΠΈΡΠ°Π½ΠΎ, ΡΡΠΎ ΠΈ ΠΊΠ°ΠΊ ansible Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ΄Π΅Π»Π°ΡΡ. ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΏΠ΅ΡΠ²ΡΠΉ ΠΏΠ»Π΅ΠΉΠ±ΡΠΊ, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ Π½ΠΈΡΠ΅Π³ΠΎ:
---
- name: Simple playbook
hosts: all
ΠΠ΄Π΅ΡΡ ΠΌΡ ΠΏΡΠΎΡΡΠΎ Π³ΠΎΠ²ΠΎΡΠΈΠΌ, ΡΡΠΎ Π½Π°Ρ playbook Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ Simple Playbook
ΠΈ ΡΡΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π΅Π³ΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π΄Π»Ρ Π²ΡΠ΅Ρ
Ρ
ΠΎΡΡΠΎΠ². ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΡ
ΡΠ°Π½ΠΈΡΡ Π΅Π³ΠΎ Π² /ansible Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ playbook.yml
ΠΈ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ Π·Π°ΠΏΡΡΡΠΈΡΡ:
ansible-playbook ./playbook.yml
PLAY [Simple Playbook] ************************************************************************************************************************************
skipping: no hosts matched
Ansible Π³ΠΎΠ²ΠΎΡΠΈΡ ΡΡΠΎ Π½Π΅ Π·Π½Π°Π΅Ρ Ρ
ΠΎΡΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π±Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΠ²ΠΎΠ²Π°Π»ΠΈ ΡΠΏΠΈΡΠΊΡ all. ΠΡ
Π½Π°Π΄ΠΎ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»ΠΈΡΡ Π² ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠΌ
ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π΅Π³ΠΎ Π² ΡΠΎΠΉ ΠΆΠ΅ ansible Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ:
123.123.123.123
ΠΠΎΡ ΡΠ°ΠΊ ΠΏΡΠΎΡΡΠΎ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ Ρ
ΠΎΡΡ (Π² ΠΈΠ΄Π΅Π°Π»Π΅ Ρ
ΠΎΡΡ ΡΠ²ΠΎΠ΅Π³ΠΎ VPS Π΄Π»Ρ ΡΠ΅ΡΡΠΎΠ², ΠΈΠ»ΠΈ ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ localhost ΠΏΡΠΎΠΏΠΈΡΠ°ΡΡ) ΠΈ ΡΠΎΡ
ΡΠ°Π½ΡΠ΅ΠΌ Π΅Π³ΠΎ ΠΏΠΎΠ΄ ΠΈΠΌΠ΅Π½Π΅ΠΌ inventory
.
ΠΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ Π·Π°ΠΏΡΡΡΠΈΡΡ ansible Ρ invetory ΡΠ°ΠΉΠ»ΠΎΠΌ:
ansible-playbook ./playbook.yml -i inventory
PLAY [Simple Playbook] ************************************************************************************************************************************
TASK [Gathering Facts] ************************************************************************************************************************************
PLAY RECAP ************************************************************************************************************************************
ΠΡΠ»ΠΈ Ρ Π²Π°Ρ Π΅ΡΡΡ Π΄ΠΎΡΡΡΠΏ ΠΏΠΎ ssh ΠΊ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡ Ρ ΠΎΡΡΡ ΡΠΎ ansible ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡΡ ΠΈ ΡΠΎΠ±Π΅ΡΠ΅Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΠ± ΡΠ΄Π°Π»Π΅Π½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅. (Π΄Π΅ΡΠΎΠ»ΡΠ½ΡΠΉ TASK [Gathering Facts] ) ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ Π΄Π°ΡΡ ΠΊΡΠ°ΡΠΊΠΈΠΉ ΠΎΡΡΠ΅Ρ ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ (PLAY RECAP).
ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π΄Π»Ρ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΈΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΠΎΠ΄ ΠΊΠΎΡΠΎΡΡΠΌ Π²Ρ Π·Π°Π»ΠΎΠ³ΠΈΠ½Π΅Π½Ρ Π² ΡΠΈΡΡΠ΅ΠΌΠ΅. ΠΠ° Ρ ΠΎΡΡΠ΅ Π΅Π³ΠΎ, ΡΠΊΠΎΡΠ΅Π΅ Π²ΡΠ΅Π³ΠΎ, Π½Π΅ Π±ΡΠ΄Π΅Ρ. Π playbook ΡΠ°ΠΉΠ»Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ ΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Ρ remote_user. Π’Π°ΠΊ ΠΆΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΠ± ΡΠ΄Π°Π»Π΅Π½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅ Π²Π°ΠΌ ΡΠ°ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π½Π΅Π½ΡΠΆΠ½Π° ΠΈ Π½Π΅ ΡΡΠΎΠΈΡ ΡΡΡΠ°ΡΠΈΡΡ Π²ΡΠ΅ΠΌΡ Π½Π° Π΅Π΅ ΡΠ±ΠΎΡ. ΠΡΡ Π·Π°Π΄Π°ΡΡ ΡΠ°ΠΊ ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠΊΠ»ΡΡΠΈΡΡ:
---
- name: Simple playbook
hosts: all
remote_user: root
become: true
gather_facts: no
ΠΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ Π΅ΡΠ΅ ΡΠ°Π· Π·Π°ΠΏΡΡΡΠΈΡΡ playbook ΠΈ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ ΡΡΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ. (ΠΡΠ»ΠΈ Π²Ρ ΡΠΊΠ°Π·Π°Π»ΠΈ root ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΡΠΎ ΡΠ°ΠΊ ΠΆΠ΅ Π½Π°Π΄ΠΎ ΡΠΊΠ°Π·Π°ΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Ρ become: true, ΡΡΠΎ Π±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΏΠΎΠ²ΡΡΠ΅Π½Π½ΡΠ΅ ΠΏΡΠ°Π²Π°. ΠΠ°ΠΊ Π½Π°ΠΏΠΈΡΠ°Π½ΠΎ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ: become set to βtrueβ/βyesβ to activate privilege escalation.
Ρ
ΠΎΡΡ Π½Π΅ ΡΠΎΠ²ΡΠ΅ΠΌ ΠΏΠΎΠ½ΡΡΠ½ΠΎ, Π·Π°ΡΠ΅ΠΌ).
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ ΠΎΡΠΈΠ±ΠΊΡ Π²ΡΠ·ΡΠ²Π°Π½Π½ΡΡ ΡΠ΅ΠΌ, ΡΡΠΎ ansible Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡ ΠΏΠΈΡΠΎΠ½Π°, ΡΠΎΠ³Π΄Π° Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ Π²ΡΡΡΠ½ΡΡ:
ansible_python_interpreter: /usr/bin/python3
Π³Π΄Π΅ Ρ Π²Π°Ρ Π»Π΅ΠΆΠΈΡ python ΠΌΠΎΠΆΠ½ΠΎ ΡΠ·Π½Π°ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ whereis python
.
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΡΠΈΡΡΠ΅ΠΌΠ½ΡΡ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ²
Π ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ ΠΏΠΎΡΡΠ°Π²ΠΊΠ΅ Ansible Π²Ρ
ΠΎΠ΄ΠΈΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌΠΈ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΌΠΈ ΠΏΠ°ΠΊΠ΅ΡΠ°ΠΌΠΈ, Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ ΡΠ΅ΠΌΡ Π½Π°ΠΌ Π½Π΅ ΠΏΡΠΈΡ
ΠΎΠ΄ΠΈΡΡΡ ΠΏΠΎ Π»ΡΠ±ΠΎΠΌΡ ΠΏΠΎΠ²ΠΎΠ΄Ρ ΠΏΠΈΡΠ°ΡΡ bash ΡΠΊΡΠΈΠΏΡΡ. Π‘Π΅ΠΉΡΠ°Ρ Π½Π°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΡΠ°ΠΊΠΈΡ
ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ Π΄Π»Ρ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΡΠΈΡΡΠ΅ΠΌΡ ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΡ
ΠΏΠ°ΠΊΠ΅ΡΠΎΠ². Π£ ΠΌΠ΅Π½Ρ Π½Π° VPS ΡΡΠΎΠΈΡ Ubuntu Linux ΡΠΎΠΎΡΠ²Π΅ΡΡΠ²Π΅Π½Π½ΠΎ Π΄Π»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ 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
. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ rails Ρ postgresql Π½Π°ΠΌ Π½ΡΠΆΠ΅Π½ ΠΏΠ°ΠΊΠ΅Ρ postgresql-contrib, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ ΡΠ΅ΠΉΡΠ°Ρ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ. ΠΠ± ΡΡΠΎΠΌ ΠΎΠΏΡΡΡ ΠΆΠ΅ Π½Π°Π΄ΠΎ Π·Π½Π°ΡΡ ΠΈ ΡΠ΄Π΅Π»Π°ΡΡ, ansible ΡΠ°ΠΌ ΠΏΠΎ ΡΠ΅Π±Π΅ ΡΡΠΎΠ³ΠΎ Π΄Π΅Π»Π°ΡΡ Π½Π΅ Π±ΡΠ΄Π΅Ρ.
ΠΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ Π·Π°ΠΏΡΡΡΠΈΡΡ playbook Π΅ΡΠ΅ ΡΠ°Π· ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, ΡΡΠΎ ΠΏΠ°ΠΊΠ΅ΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΡΡΡΡ.
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ.
ΠΠ»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌΠΈ Ρ Ansible ΡΠ°ΠΊ ΠΆΠ΅ Π΅ΡΡΡ ΠΌΠΎΠ΄ΡΠ»Ρ β user. ΠΠΎΠ±Π°Π²ΠΈΠΌ Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ task (Ρ ΡΠΊΡΡΠ» ΡΠΆΠ΅ ΠΈΠ·Π²Π΅ΡΡΠ½ΡΠ΅ ΡΠ°ΡΡΠΈ ΠΏΠ»Π΅ΠΉΠ±ΡΠΊΠ° Π·Π° ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠΌ, ΡΡΠΎ Π±Ρ Π½Π΅ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ ΡΠ΅Π»ΠΈΠΊΠΎΠΌ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π·):
---
- name: Simple playbook
# ...
tasks:
# ...
- name: Add a new user
user:
name: my_user
shell: /bin/bash
password: "{{ 123qweasd | password_hash('sha512') }}"
ΠΡ ΡΠΎΠ·Π΄Π°Π΅ΠΌ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Π΅ΠΌΡ schell ΠΈ ΠΏΠ°ΡΠΎΠ»Ρ. Π ΡΡΡ ΠΆΠ΅ ΡΡΠ°Π»ΠΊΠΈΠ²Π°Π΅ΠΌΡΡ Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ. Π§ΡΠΎ Π΅ΡΠ»ΠΈ ΠΈΠΌΠ΅Π½Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ Π΄Π»Ρ ΡΠ°Π·Π½ΡΡ Ρ ΠΎΡΡΠΎΠ² ΡΠ°Π·Π½ΡΠΌΠΈ? ΠΠ° ΠΈ Ρ ΡΠ°Π½ΠΈΡΡ ΠΏΠ°ΡΠΎΠ»Ρ Π² ΠΎΡΠΊΡΡΡΠΎΠΌ Π²ΠΈΠ΄Π΅ Π² ΠΏΠ»Π΅ΠΉΠ±ΡΠΊΠ΅ ΠΎΡΠ΅Π½Ρ ΠΏΠ»ΠΎΡ Π°Ρ ΠΈΠ΄Π΅Ρ. ΠΠ»Ρ Π½Π°ΡΠ°Π»Π° Π²ΡΠ½Π΅ΡΠ΅ΠΌ ΠΈΠΌΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈ ΠΏΠ°ΡΠΎΠ»Ρ Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅, Π° Π±Π»ΠΈΠΆΠ΅ ΠΊ ΠΊΠΎΠ½ΡΡ ΡΡΠ°ΡΡΠΈ Ρ ΠΏΠΎΠΊΠ°ΠΆΡ ΠΊΠ°ΠΊ ΠΏΠ°ΡΠΎΠ»Ρ Π·Π°ΡΠΈΡΡΠΎΠ²Π°ΡΡ.
---
- name: Simple playbook
# ...
tasks:
# ...
- name: Add a new user
user:
name: "{{ user }}"
shell: /bin/bash
password: "{{ user_password | password_hash('sha512') }}"
ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ Π΄Π²ΠΎΠΉΠ½ΡΡ ΡΠΈΠ³ΡΡΠ½ΡΡ ΡΠΊΠΎΠ±ΠΎΠΊ Π² ΠΏΠ»ΡΠΉΠ±ΡΠΊΠ°Ρ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅.
ΠΠ½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΌΡ ΡΠΊΠ°ΠΆΠ΅ΠΌ Π² inventory ΡΠ°ΠΉΠ»Π΅:
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"
ΠΡΠ΅ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΡΠΎΡΡΠΎ, Ρ Π½Π°Ρ ΡΠ°ΠΊ ΠΆΠ΅ Π΅ΡΡΡ ΠΌΠΎΠ΄ΡΠ»Ρ group Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π³ΡΡΠΏΠΏ, Ρ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠΎΠΌ ΠΎΡΠ΅Π½Ρ ΠΏΠΎΡ
ΠΎΠΆΠΈΠΌ Π½Π° 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 ΡΡΡΠ΅ΡΡΠ²ΡΡΡ
Π‘ΠΎΠ³Π»Π°ΡΠ½ΠΎ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π² ΡΠ°ΠΌΠΎΠΌ Π½Π°ΡΠ°Π»Π΅ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΡΡΡΠΊΡΡΡΠ΅, ΡΠΎΠ»ΠΈ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΡ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ roles, Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΠΎΠ»ΠΈ β ΠΎΡΠ΄Π΅Π»ΡΠ½Π°Ρ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ Ρ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ, Π²Π½ΡΡΡΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ tasks, files, templates, e.t.c.
CΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ ΡΡΡΡΠΊΡΡΡΡ: ./ansible/roles/user/tasks/main.yml
(main β ΡΡΠΎ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΡΠ°ΠΉΠ» ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ΄Π³ΡΡΠΆΠ°ΡΡΡΡ ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΏΡΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ ΡΠΎΠ»ΠΈ ΠΊ ΠΏΠ»Π΅ΠΉΠ±ΡΠΊΡ, Π² Π½Π΅ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°ΡΡ Π΄ΡΡΠ³ΠΈΠ΅ ΡΠ°ΠΉΠ»Ρ ΡΠΎΠ»ΠΈ). Π’Π΅ΠΏΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π½Π΅ΡΡΠΈ Π² ΡΡΠΎΡ ΡΠ°ΠΉΠ» Π²ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ ΠΎΡΠ½ΠΎΡΡΡΠΈΠ΅ΡΡ ΠΊ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ:
# 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
Π ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ ΠΆΠ΅ ΠΏΠ»Π΅ΠΉΠ±ΡΠΊΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΊΠ°Π·Π°ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΎΠ»Ρ user:
---
- 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
ΡΠ°ΠΉΠ»Π΅. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Ρ Π½Π°Ρ Π΅ΡΡΡ ΠΌΠΎΠ΄ΡΠ»Ρ systemd:
# Copy nginx configs and start it
- name: enable service nginx and start
systemd:
name: nginx
state: started
enabled: yes
Π’ΡΡ ΠΌΡ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ Π³ΠΎΠ²ΠΎΡΠΈΠΌ, ΡΡΠΎ nginx Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ started (ΡΠΎΠ΅ΡΡΡ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ Π΅Π³ΠΎ), Π½ΠΎ ΡΡΠ°Π·Ρ Π³ΠΎΠ²ΠΎΡΠΈΠΌ ΡΡΠΎ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ enabled.
Π’Π΅ΠΏΠ΅ΡΡ ΡΠΊΠΎΠΏΠΈΡΡΠ΅ΠΌ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ:
# 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 Π΄ΠΈΡΠ΅ΠΊΡΠΎΠΎΡΠΈΡ (ΡΡΠΎ Π½Π΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ Π½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ). Π ΠΏΠ΅ΡΠ²ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΌΠΎΠ΄ΡΠ»Ρ copy Π΄Π»Ρ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ² (ΡΠ°ΠΉΠ» Π΄ΠΎΠ»ΠΆΠ΅Π½ Π»Π΅ΠΆΠ°ΡΡ Π² /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 ΠΏΠΎΠ΄ΡΡΠ°Π²ΠΈΡ Π² ΡΠ°Π±Π»ΠΎΠ½ ΠΏΠ΅ΡΠ΅Π΄ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ. ΠΡΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, Π΅ΡΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΠ»Π΅ΠΉΠ±ΡΠΊ Π΄Π»Ρ ΡΠ°Π·Π½ΡΡ
Π³ΡΡΠΏΠΏ Ρ
ΠΎΡΡΠΎΠ². ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ ΠΌΡ ΠΌΠΎΠΆΠ΅Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΡ Π½Π°Ρ inventory ΡΠ°ΠΉΠ»:
[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
ΠΡΠ»ΠΈ ΠΌΡ Π·Π°ΠΏΡΡΡΠΈΠΌ ΡΠ΅ΠΏΠ΅ΡΡ Π½Π°Ρ ΠΏΠ»Π΅ΠΉΠ±ΡΠΊ, ΡΠΎ ΠΎΠ½ Π²ΡΠΏΠΎΠ»Π½ΠΈΡ ΡΠΊΠ°Π·Π°Π½Π½ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ Π΄Π»Ρ ΠΎΠ±ΠΎΠΈΡ
Ρ
ΠΎΡΡΠΎΠ². ΠΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ Π΄Π»Ρ staging Ρ
ΠΎΡΡΠ° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Π±ΡΠ΄ΡΡ ΠΎΡΠ»ΠΈΡΠ°ΡΡΡ ΠΎΡ production, ΠΈ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠΎΠ»ΡΡ
ΠΈ ΠΏΠ»Π΅ΠΉΠ±ΡΠΊΠ°Ρ
, Π½ΠΎ ΠΈ Π² ΠΊΠΎΠ½ΡΠΈΠ³Π°Ρ
nginx. {{ inventory_hostname }}
Π½Π΅ Π½Π°Π΄ΠΎ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ Π² inventory ΡΠ°ΠΉΠ»Π΅ β ΡΡΠΎ
ΠΡΠ»ΠΈ Π²Ρ Ρ
ΠΎΡΠΈΡΠ΅ ΠΈΠΌΠ΅ΡΡ inventory ΡΠ°ΠΉΠ» Π΄Π»Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
Ρ
ΠΎΡΡΠΎΠ², Π° Π·Π°ΠΏΡΡΠΊΠ°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΠΎΠ΄Π½ΠΎΠΉ Π³ΡΡΠΏΠΏΡ, ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:
ansible-playbook -i inventory ./playbook.yml -l "staging"
Π΄ΡΡΠ³ΠΎΠΉ Π²Π°ΡΠΈΠ°Π½Ρ β ΠΈΠΌΠ΅ΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ inventory ΡΠ°ΠΉΠ»Ρ Π΄Π»Ρ ΡΠ°Π·Π½ΡΡ Π³ΡΡΠΏΠΏ. ΠΠ»ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠΎΠ²Π°ΡΡ Π΄Π²Π° ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π°, Π΅ΡΠ»ΠΈ Ρ Π²Π°Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°Π·Π½ΡΠ· Ρ ΠΎΡΡΠΎΠ².
ΠΠ΅ΡΠ½Π΅ΠΌΡΡ ΠΊ Π½Π°ΡΡΡΠΎΠΉΠΊΠ΅ 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
Π’ΡΡ Π²ΡΠ΅ ΠΏΡΠΎΡΡΠΎ β ΠΎΠΏΡΡΡ ΠΌΠΎΠ΄ΡΠ»ΠΈ ansible Ρ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΌ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠΎΠΌ. ΠΠΎ Π΅ΡΡΡ ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠΌΠ΅Π½Ρ. ΠΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠΊΠ°ΡΡ nginx ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ ΡΠΌΡΡΠ»Π°. ΠΡ ΠΎΠ±ΡΠ°ΡΠΈΠ»ΠΈ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΠΌΡ Π½Π΅ ΠΏΠΈΡΠ΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π²ΠΈΠ΄Π°: «ΡΠ΄Π΅Π»Π°ΡΡ Π²ΠΎΡ ΡΡΠΎ Π²ΠΎΡ ΡΠ°ΠΊ», ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠΊΠΎΡΠ΅Π΅ ΠΊΠ°ΠΊ «Π²ΠΎΡ Ρ ΡΡΠΎΠ³ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ Π²ΠΎΡ ΡΠ°ΠΊΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅». Π ΡΠ°ΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠ°ΠΊ ansible ΠΈ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ. ΠΡΠ»ΠΈ Π³ΡΡΠΏΠΏΠ° ΡΠΆΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ, ΠΈΠ»ΠΈ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ ΠΏΠ°ΠΊΠ΅Ρ ΡΠΆΠ΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½, ΡΠΎ ansible ΠΏΡΠΎΠ²Π΅ΡΠΈΡ ΡΡΠΎ ΠΈ ΠΏΡΠΎΠΏΡΡΡΠΈΡ Π·Π°Π΄Π°ΡΡ. Π’Π°ΠΊ ΠΆΠ΅ ΡΠ°ΠΉΠ»Ρ Π½Π΅ Π±ΡΠ΄ΡΡ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡΡΡ, Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡΡ Ρ ΡΠ΅ΠΌ, ΡΡΠΎ ΡΠΆΠ΅ Π΅ΡΡΡ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅. ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡΠΈΠΌ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΈ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠΊΠ°ΡΡ nginx ΡΠΎΠ»ΡΠΊΠΎ Π΅ΡΠ»ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ Π±ΡΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Π° register:
# 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 Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ playbook.
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° 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 }}"
Π― Π½Π΅ Π±ΡΠ΄Ρ ΡΠ°ΡΠΏΠΈΡΡΠ²Π°ΡΡ, ΠΊΠ°ΠΊ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Π² inventory, ΡΡΠΎ ΡΠΆΠ΅ Π΄Π΅Π»Π°Π»ΠΎΡΡ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°Π·, ΡΠ°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ postgresql_db ΠΈ postgresql_user. ΠΠΎΠ»ΡΡΠ΅ Π΄Π°Π½Π½ΡΡ
ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ. Π’ΡΡ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π° Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Π° become_user: postgres
. ΠΠ΅Π»ΠΎ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π΄ΠΎΡΡΡΠΏ ΠΊ postgresql Π±Π°Π·Π΅ Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ postgres ΠΈ ΡΠΎΠ»ΡΠΊΠΎ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ. ΠΠ°Π½Π½Π°Ρ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΠΌ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΎΡ ΠΈΠΌΠ΅Π½ΠΈ ΡΡΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ (Π΅ΡΠ»ΠΈ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ Ρ Π½Π°Ρ Π΅ΡΡΡ Π΄ΠΎΡΡΡΠΏ).
Π’Π°ΠΊ ΠΆΠ΅, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Π°ΠΌ ΠΏΡΠΈΠ΄Π΅ΡΡΡ Π΄ΠΎΠΏΠΈΡΠ°ΡΡ ΡΡΡΠΎΠΊΡ Π² 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 ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ Π² Π΅Π³ΠΎ home Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ, Π° Π½Π΅ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΠΎ. Π ΡΠ°ΠΊ ΠΆΠ΅ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΌΠΎΠ΄ΡΠ»Ρ 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 ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΠΏΡΡΠΌΠΎ Π² ΡΡΠΎΠΌ ΠΆΠ΅ ΡΠΊΡΠΈΠΏΡΠ΅.
Π‘Π»Π΅Π΄ΡΡΡΠ°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΡΠ²ΡΠ·Π°Π½Π° Ρ ΡΠ΅ΠΌ, ΡΡΠΎ shell ΠΊΠΎΠΌΠ°Π½Π΄Π° Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ Ρ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ ansible. Π’ΠΎΠ΅ΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ, ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π° ΡΡΠ° Π²Π΅ΡΡΠΈΡ 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 Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΏΠ»Π΅ΠΉΠ±ΡΠΊ.
Shared files.
Π ΡΠ΅Π»ΠΎΠΌ Π½Π° ΡΡΠΎΠΌ Π½Π°ΡΡΡΠΎΠΉΠΊΡ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π±Ρ Π·Π°ΠΊΠΎΠ½ΡΠΈΡΡ. ΠΠ°Π»Π΅Π΅ ΠΎΡΡΠ°Π΅ΡΡΡ Π·Π°ΠΏΡΡΡΠΈΡΡ 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
(ΡΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΠ°Π·Π½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ Π΄Π»Ρ ΡΠ°Π·Π½ΡΡ
Π³ΡΡΠΏΠΏ Ρ
ΠΎΡΡΠΎΠ², ΡΠΎΡΠ½ΠΎ ΡΠ°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ Π² inventory ΡΠ°ΠΉΠ»Π΅: production.yml, staging.yml, e.t.c).
Π ΡΡΠΎΡ ΡΠ°ΠΉΠ» Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅ΡΠ΅Π½Π΅ΡΡΠΈ Π²ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ Π·Π°ΡΠΈΡΡΠΎΠ²Π°Π½Ρ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ 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 ΡΡΡΠΊΠ° ΡΠ°ΠΊΠ°Ρ β Π΅ΡΠ»ΠΈ Π½Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅ΡΡ ΡΡΠΎ Π½Π°Π΄ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ, ΡΠΎ ΠΈ ΠΎΠ½ ΡΠ΅Π±Π΅ Π½Π΅ ΡΠ΄Π΅Π»Π°Π΅Ρ.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com