ΠΠ΅Π΄Π°Π²Π½ΠΎ ΡΠ°ΠΌ ΠΌΠΎΡΠ°ΠΎ Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΠΌ Π½Π΅ΠΊΠΎΠ»ΠΈΠΊΠΎ ΠΠ½ΡΠΈΠ±Π»Π΅ ΠΏΠ»Π°ΠΈΠ±ΠΎΠΎΠΊ-Π° Π΄Π° ΠΏΡΠΈΠΏΡΠ΅ΠΌΠΈΠΌ ΡΠ΅ΡΠ²Π΅Ρ Π·Π° ΠΏΡΠΈΠΌΠ΅Π½Ρ Π Π°ΠΈΠ»Ρ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ΅. Π, ΠΈΠ·Π½Π΅Π½Π°ΡΡΡΡΡΠ΅, Π½ΠΈΡΠ°ΠΌ Π½Π°ΡΠ°ΠΎ ΡΠ΅Π΄Π½ΠΎΡΡΠ°Π²Π°Π½ ΠΏΡΠΈΡΡΡΠ½ΠΈΠΊ ΠΊΠΎΡΠ°ΠΊ ΠΏΠΎ ΠΊΠΎΡΠ°ΠΊ. ΠΠΈΡΠ°ΠΌ ΠΆΠ΅Π»Π΅ΠΎ Π΄Π° ΠΊΠΎΠΏΠΈΡΠ°ΠΌ ΡΡΡΡ ΠΊΡΠΈΠ³Ρ Π° Π΄Π° Π½Π΅ ΡΠ°Π·ΡΠΌΠ΅ΠΌ ΡΡΠ° ΡΠ΅ Π΄Π΅ΡΠ°Π²Π°, ΠΈ Π½Π° ΠΊΡΠ°ΡΡ ΡΠ°ΠΌ ΠΌΠΎΡΠ°ΠΎ Π΄Π° ΠΏΡΠΎΡΠΈΡΠ°ΠΌ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡ ΠΈ ΡΠ²Π΅ ΡΠ°ΠΌ ΠΏΡΠΈΠΊΡΠΏΠΈΠΎ. ΠΠΎΠΆΠ΄Π° ΠΌΠΎΠ³Ρ ΠΏΠΎΠΌΠΎΡΠΈ Π½Π΅ΠΊΠΎΠΌΠ΅ Π΄Π° ΡΠ±ΡΠ·Π° ΠΎΠ²Π°Ρ ΠΏΡΠΎΡΠ΅Ρ ΡΠ· ΠΏΠΎΠΌΠΎΡ ΠΎΠ²ΠΎΠ³ ΡΠ»Π°Π½ΠΊΠ°.
ΠΡΠ²Π° ΡΡΠ²Π°Ρ ΠΊΠΎΡΡ ΡΡΠ΅Π±Π° ΡΠ°Π·ΡΠΌΠ΅ΡΠΈ ΡΠ΅ Π΄Π° Π²Π°ΠΌ Π°Π½ΡΠΈΠ±Π»Π΅ ΠΏΡΡΠΆΠ° Π·Π³ΠΎΠ΄Π°Π½ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΡΡ Π·Π° ΠΎΠ±Π°Π²ΡΠ°ΡΠ΅ ΡΠ½Π°ΠΏΡΠ΅Π΄ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½Π΅ Π»ΠΈΡΡΠ΅ Π°ΠΊΡΠΈΡΠ° Π½Π° ΡΠ΄Π°ΡΠ΅Π½ΠΈΠΌ ΡΠ΅ΡΠ²Π΅ΡΠΈΠΌΠ° ΠΏΡΡΠ΅ΠΌ Π‘Π‘Π₯-Π°. ΠΠ΅ΠΌΠ° ΡΡ Π½ΠΈΠΊΠ°ΠΊΠ²Π΅ ΠΌΠ°Π³ΠΈΡΠ΅, Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ Π΄ΠΎΠ΄Π°ΡΠ°ΠΊ ΠΈ Π΄ΠΎΠ±ΠΈΡΠ΅ΡΠ΅ Π½ΡΠ»ΡΡ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡ Π²Π°ΡΠ΅ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ΅ ΡΠ° Π΄ΠΎΡΠΊΠ΅Ρ-ΠΎΠΌ, Π½Π°Π΄Π³Π»Π΅Π΄Π°ΡΠ΅ΠΌ ΠΈ Π΄ΡΡΠ³ΠΈΠΌ Π΄ΠΎΠ±ΡΠΎΡΠ°ΠΌΠ° ΠΈΠ· ΠΊΡΡΠΈΡΠ΅. ΠΠ° Π±ΠΈΡΡΠ΅ Π½Π°ΠΏΠΈΡΠ°Π»ΠΈ ΠΊΡΠΈΠ³Ρ, ΠΌΠΎΡΠ°ΡΠ΅ Π·Π½Π°ΡΠΈ ΡΡΠ° ΡΠ°ΡΠ½ΠΎ ΠΆΠ΅Π»ΠΈΡΠ΅ Π΄Π° ΡΠ°Π΄ΠΈΡΠ΅ ΠΈ ΠΊΠ°ΠΊΠΎ ΡΠΎ Π΄Π° ΡΡΠ°Π΄ΠΈΡΠ΅. ΠΠ°ΡΠΎ Π½ΠΈΡΠ°ΠΌ Π·Π°Π΄ΠΎΠ²ΠΎΡΠ°Π½ Π³ΠΎΡΠΎΠ²ΠΈΠΌ ΠΏΡΠΈΡΡΡΠ½ΠΈΡΠΈΠΌΠ° ΡΠ° ΠΠΈΡΠ₯ΡΠ±-Π° ΠΈΠ»ΠΈ ΡΠ»Π°Π½ΡΠΈΠΌΠ° ΠΏΠΎΠΏΡΡ: βΠΠΎΠΏΠΈΡΠ°Ρ ΠΈ ΠΏΠΎΠΊΡΠ΅Π½ΠΈ, ΡΠ°Π΄ΠΈΡΠ΅β.
ΠΠ½ΠΎ ΡΡΠΎ Π½Π°ΠΌ ΡΡΠ΅Π±Π°?
ΠΠ°ΠΎ ΡΡΠΎ ΡΠ°ΠΌ Π²Π΅Ρ ΡΠ΅ΠΊΠ°ΠΎ, Π΄Π° Π±ΠΈΡΡΠ΅ Π½Π°ΠΏΠΈΡΠ°Π»ΠΈ ΡΠ²Π΅ΡΠΊΡ ΠΌΠΎΡΠ°ΡΠ΅ Π΄Π° Π·Π½Π°ΡΠ΅ ΡΡΠ° ΠΆΠ΅Π»ΠΈΡΠ΅ Π΄Π° ΡΠ°Π΄ΠΈΡΠ΅ ΠΈ ΠΊΠ°ΠΊΠΎ Π΄Π° ΡΠΎ ΡΡΠ°Π΄ΠΈΡΠ΅. Π₯Π°ΡΠ΄Π΅ Π΄Π° ΠΎΠ΄Π»ΡΡΠΈΠΌΠΎ ΡΡΠ° Π½Π°ΠΌ ΡΡΠ΅Π±Π°. ΠΠ° Π Π°ΠΈΠ»Ρ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΡ Π±ΠΈΡΠ΅ Π½Π°ΠΌ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎ Π½Π΅ΠΊΠΎΠ»ΠΈΠΊΠΎ ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΈΡ ΠΏΠ°ΠΊΠ΅ΡΠ°: Π½Π³ΠΈΠ½ΠΊ, ΠΏΠΎΡΡΠ³ΡΠ΅ΡΠΊΠ» (ΡΠ΅Π΄ΠΈΡ, ΠΈΡΠ΄.). ΠΠΎΡΠ΅Π΄ ΡΠΎΠ³Π°, ΠΏΠΎΡΡΠ΅Π±Π½Π° Π½Π°ΠΌ ΡΠ΅ ΠΏΠΎΡΠ΅Π±Π½Π° Π²Π΅ΡΠ·ΠΈΡΠ° ΡΡΠ±ΠΈΠ½Π°. ΠΠ°ΡΠ±ΠΎΡΠ΅ Π³Π° ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠΈ ΠΏΡΠ΅ΠΊΠΎ ΡΠ±Π΅Π½Π² (ΡΠ²ΠΌ, Π°ΡΠ΄Ρ...). ΠΠΎΠΊΡΠ΅ΡΠ°ΡΠ΅ ΡΠ²Π΅Π³Π° ΠΎΠ²ΠΎΠ³Π° ΠΊΠ°ΠΎ ΡΠΎΠΎΡ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊ ΡΠ΅ ΡΠ²Π΅ΠΊ Π»ΠΎΡΠ° ΠΈΠ΄Π΅ΡΠ°, ΡΠ°ΠΊΠΎ Π΄Π° ΠΌΠΎΡΠ°ΡΠ΅ Π΄Π° ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ ΠΏΠΎΡΠ΅Π±Π½ΠΎΠ³ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠ° ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ΅ΡΠ΅ ΡΠ΅Π³ΠΎΠ²Π° ΠΏΡΠ°Π²Π°. ΠΠ°ΠΊΠΎΠ½ ΠΎΠ²ΠΎΠ³Π°, ΠΏΠΎΡΡΠ΅Π±Π½ΠΎ ΡΠ΅ Π΄Π° ΠΎΡΠΏΡΠ΅ΠΌΠΈΡΠ΅ Π½Π°Ρ ΠΊΠΎΠ΄ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ, ΠΊΠΎΠΏΠΈΡΠ°ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ΅ Π·Π° Π½Π³ΠΈΠ½ΠΊ, ΠΏΠΎΡΡΠ³ΡΠ΅Ρ ΠΈΡΠ΄. ΠΈ ΠΏΠΎΠΊΡΠ΅Π½Π΅ΡΠ΅ ΡΠ²Π΅ ΠΎΠ²Π΅ ΡΡΠ»ΡΠ³Π΅.
ΠΠ°ΠΎ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ, ΡΠ΅Π΄ΠΎΡΠ»Π΅Π΄ Π°ΠΊΡΠΈΡΠ° ΡΠ΅ ΡΠ»Π΅Π΄Π΅ΡΠΈ:
- ΠΡΠΈΡΠ°Π²ΠΈΡΠ΅ ΡΠ΅ ΠΊΠ°ΠΎ ΡΠΎΠΎΡ
- ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΡΠΊΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠ΅
- ΠΊΡΠ΅ΠΈΡΠ°ΡΡΠ΅ Π½ΠΎΠ²ΠΎΠ³ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠ°, ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠΈΡΠ΅ ΠΏΡΠ°Π²Π°, ΡΡΡ ΠΊΡΡΡ
- ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠΈΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΡΠΊΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠ΅ (Π½Π³ΠΈΠ½ΠΊ ΠΈΡΠ΄.) ΠΈ ΠΏΠΎΠΊΡΠ΅Π½ΠΈΡΠ΅ ΠΈΡ
- ΠΡΠ΅ΠΈΡΠ°ΠΌΠΎ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠ° Ρ Π±Π°Π·ΠΈ ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ° (ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΠ΄ΠΌΠ°Ρ ΠΊΡΠ΅ΠΈΡΠ°ΡΠΈ Π±Π°Π·Ρ ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ°)
- ΠΡΠΈΡΠ°Π²ΠΈΡΠ΅ ΡΠ΅ ΠΊΠ°ΠΎ Π½ΠΎΠ²ΠΈ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊ
- ΠΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΡΠ΅ ΡΠ±Π΅Π½Π² ΠΈ ΡΡΠ±ΠΈ
- ΠΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠ°
- ΠΡΠΏΡΠ΅ΠΌΠ°ΡΠ΅ ΠΊΠΎΠ΄Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ΅
- ΠΠΎΠΊΡΠ΅ΡΠ°ΡΠ΅ ΠΡΠΌΠ° ΡΠ΅ΡΠ²Π΅ΡΠ°
Π¨ΡΠ°Π²ΠΈΡΠ΅, ΠΏΠΎΡΠ»Π΅Π΄ΡΠ΅ ΡΠ°Π·Π΅ ΡΠ΅ ΠΌΠΎΠ³Ρ ΠΎΠ±Π°Π²ΠΈΡΠΈ ΠΏΠΎΠΌΠΎΡΡ ΡΠ°ΠΏΠΈΡΡΡΠ°Π½ΠΎ-Π°, Π±Π°ΡΠ΅ΠΌ ΠΈΠ· ΠΊΡΡΠΈΡΠ΅ ΠΌΠΎΠΆΠ΅ ΠΊΠΎΠΏΠΈΡΠ°ΡΠΈ ΠΊΠΎΠ΄ Ρ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠΌΠ΅ ΠΈΠ·Π΄Π°ΡΠ°, ΠΏΡΠ΅Π±Π°ΡΠΈΡΠΈ ΠΈΠ·Π΄Π°ΡΠ΅ ΡΠΈΠΌΠ±ΠΎΠ»ΠΈΡΠΊΠΎΠΌ Π²Π΅Π·ΠΎΠΌ Π½Π°ΠΊΠΎΠ½ ΡΡΠΏΠ΅ΡΠ½ΠΎΠ³ ΠΏΠΎΡΡΠ°Π²ΡΠ°ΡΠ°, ΠΊΠΎΠΏΠΈΡΠ°ΡΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ΅ ΠΈΠ· Π΄Π΅ΡΠ΅Π½ΠΎΠ³ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠΌΠ°, ΠΏΠΎΠ½ΠΎΠ²ΠΎ ΠΏΠΎΠΊΡΠ΅Π½ΡΡΠΈ ΠΡΠΌΡ, ΠΈΡΠ΄. Π‘Π²Π΅ ΠΎΠ²ΠΎ ΡΠ΅ ΠΌΠΎΠΆΠ΅ ΡΡΠ°Π΄ΠΈΡΠΈ ΠΏΠΎΠΌΠΎΡΡ ΠΠ½ΡΠΈΠ±Π»Π΅-Π°, Π°Π»ΠΈ Π·Π°ΡΡΠΎ?
Π‘ΡΡΡΠΊΡΡΡΠ° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ΅
ΠΠ½ΡΠΈΠ±Π»Π΅ ΠΈΠΌΠ° ΡΡΡΠΎΠ³Π΅
Π‘ΠΈΠΌΠΏΠ»Π΅ ΠΠ»Π°ΠΈΠ±ΠΎΠΎΠΊ
ΠΠ»Π°ΠΈΠ±ΠΎΠΎΠΊ ΡΠ΅ ΠΈΠΌΠ» Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° ΠΊΠΎΡΠ°, ΠΊΠΎΡΠΈΡΡΠ΅ΡΠΈ ΠΏΠΎΡΠ΅Π±Π½Ρ ΡΠΈΠ½ΡΠ°ΠΊΡΡ, ΠΎΠΏΠΈΡΡΡΠ΅ ΡΡΠ° ΠΠ½ΡΠΈΠ±Π»Π΅ ΡΡΠ΅Π±Π° Π΄Π° ΡΠ°Π΄ΠΈ ΠΈ ΠΊΠ°ΠΊΠΎ. Π₯Π°ΡΠ΄Π΅ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌΠΎ ΠΏΡΠ²Ρ ΠΊΡΠΈΠ³Ρ ΠΊΠΎΡΠ° Π½Π΅ ΡΠ°Π΄ΠΈ Π½ΠΈΡΡΠ°:
---
- name: Simple playbook
hosts: all
ΠΠ²Π΄Π΅ ΡΠ΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ ΠΊΠ°ΠΆΠ΅ΠΌΠΎ Π΄Π° ΡΠ΅ Π½Π°ΡΠ° ΠΊΡΠΈΠ³Π° ΠΈΠ³ΡΠ°ΡΠ° Π·ΠΎΠ²Π΅ Simple Playbook
ΠΈ Π΄Π° ΡΠ΅Π³ΠΎΠ² ΡΠ°Π΄ΡΠΆΠ°Ρ ΡΡΠ΅Π±Π° Π΄Π° ΡΠ΅ ΠΈΠ·Π²ΡΡΠΈ Π·Π° ΡΠ²Π΅ Ρ
ΠΎΡΡΠΎΠ²Π΅. ΠΠΎΠΆΠ΅ΠΌΠΎ Π³Π° ΡΠ°ΡΡΠ²Π°ΡΠΈ Ρ /Π°Π½ΡΠΈΠ±Π»Π΅ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠΌΡ ΡΠ° ΠΈΠΌΠ΅Π½ΠΎΠΌ playbook.yml
ΠΈ ΠΏΠΎΠΊΡΡΠ°ΡΡΠ΅ Π΄Π° ΠΏΠΎΠΊΡΠ΅Π½Π΅ΡΠ΅:
ansible-playbook ./playbook.yml
PLAY [Simple Playbook] ************************************************************************************************************************************
skipping: no hosts matched
ΠΠ½ΡΠΈΠ±Π»Π΅ ΠΊΠ°ΠΆΠ΅ Π΄Π° Π½Π΅ ΠΏΠΎΠ·Π½Π°ΡΠ΅ Π½ΠΈΡΠ΅Π΄Π°Π½ Π΄ΠΎΠΌΠ°ΡΠΈΠ½ ΠΊΠΎΡΠΈ ΠΎΠ΄Π³ΠΎΠ²Π°ΡΠ° Π»ΠΈΡΡΠΈ ΡΠ²ΠΈΡ
. ΠΠ½ΠΈ ΠΌΠΎΡΠ°ΡΡ Π±ΠΈΡΠΈ Π½Π°Π²Π΅Π΄Π΅Π½ΠΈ Ρ ΠΏΠΎΡΠ΅Π±Π½ΠΎΠΌ
Π₯Π°ΡΠ΄Π΅ Π΄Π° Π³Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌΠΎ Ρ ΠΈΡΡΠΎΠΌ Π°Π½ΡΠΈΠ±Π»Π΅ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠΌΡ:
123.123.123.123
ΠΠ²Π°ΠΊΠΎ ΡΠ΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ ΠΎΠ΄ΡΠ΅Π΄ΠΈΠΌΠΎ Ρ
ΠΎΡΡ (ΠΈΠ΄Π΅Π°Π»Π½ΠΎ Π΄ΠΎΠΌΠ°ΡΠΈΠ½ Π½Π°ΡΠ΅Π³ ΠΠΠ‘-Π° Π·Π° ΡΠ΅ΡΡΠΈΡΠ°ΡΠ΅, ΠΈΠ»ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ΅Π³ΠΈΡΡΡΠΎΠ²Π°ΡΠΈ Π»ΠΎΡΠ°Π»Ρ
ΠΎΡΡ) ΠΈ ΡΠ°ΡΡΠ²Π°ΡΠΈ Π³Π° ΠΏΠΎΠ΄ ΠΈΠΌΠ΅Π½ΠΎΠΌ inventory
.
ΠΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠΊΡΡΠ°ΡΠΈ Π΄Π° ΠΏΠΎΠΊΡΠ΅Π½Π΅ΡΠ΅ Π°Π½ΡΠΈΠ±Π»Π΅ ΡΠ° Π΄Π°ΡΠΎΡΠ΅ΠΊΠΎΠΌ ΠΈΠ½Π²Π΅Π½ΡΠ°ΡΠ°:
ansible-playbook ./playbook.yml -i inventory
PLAY [Simple Playbook] ************************************************************************************************************************************
TASK [Gathering Facts] ************************************************************************************************************************************
PLAY RECAP ************************************************************************************************************************************
ΠΠΊΠΎ ΠΈΠΌΠ°ΡΠ΅ ΡΡΡ ΠΏΡΠΈΡΡΡΠΏ Π½Π°Π²Π΅Π΄Π΅Π½ΠΎΠΌ Ρ ΠΎΡΡΡ, Π°Π½ΡΠΈΠ±Π»Π΅ ΡΠ΅ ΡΠ΅ ΠΏΠΎΠ²Π΅Π·Π°ΡΠΈ ΠΈ ΠΏΡΠΈΠΊΡΠΏΠΈΡΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡΠ΅ ΠΎ ΡΠ΄Π°ΡΠ΅Π½ΠΎΠΌ ΡΠΈΡΡΠ΅ΠΌΡ. (ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π½ΠΈ ΠΠΠΠΠ’ΠΠ [ΠΠ°ΡΡ Π΅ΡΠΈΠ½Π³ Π€Π°ΡΡΡ]) Π½Π°ΠΊΠΎΠ½ ΡΠ΅Π³Π° ΡΠ΅ Π΄Π°ΡΠΈ ΠΊΡΠ°ΡΠ°ΠΊ ΠΈΠ·Π²Π΅ΡΡΠ°Ρ ΠΎ ΠΈΠ·Π²ΡΡΠ΅ΡΡ (ΠΠΠΠ Π ΠΠ¦ΠΠ).
ΠΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π½ΠΎ, Π²Π΅Π·Π° ΠΊΠΎΡΠΈΡΡΠΈ ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΊΠΎ ΠΈΠΌΠ΅ ΠΏΠΎΠ΄ ΠΊΠΎΡΠΈΠΌ ΡΡΠ΅ ΠΏΡΠΈΡΠ°Π²ΡΠ΅Π½ΠΈ Ρ ΡΠΈΡΡΠ΅ΠΌ. ΠΠ°ΡΠ²Π΅ΡΠΎΠ²Π°ΡΠ½ΠΈΡΠ΅ Π½Π΅ΡΠ΅ Π±ΠΈΡΠΈ Π½Π° Π΄ΠΎΠΌΠ°ΡΠΈΠ½Ρ. Π£ Π΄Π°ΡΠΎΡΠ΅ΡΠΈ ΠΏΠ»Π°ΠΈΠ±ΠΎΠΎΠΊ-Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΠ΄ΡΠ΅Π΄ΠΈΡΠΈ ΠΊΠΎΠ³ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠ° Π΄Π° ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ Π·Π° ΠΏΠΎΠ²Π΅Π·ΠΈΠ²Π°ΡΠ΅ ΠΏΠΎΠΌΠΎΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Π΅ ΡΠ΅ΠΌΠΎΡΠ΅_ΡΡΠ΅Ρ. Π’Π°ΠΊΠΎΡΠ΅, ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡΠ΅ ΠΎ ΡΠ΄Π°ΡΠ΅Π½ΠΎΠΌ ΡΠΈΡΡΠ΅ΠΌΡ ΠΌΠΎΠ³Ρ Π²Π°ΠΌ ΡΠ΅ΡΡΠΎ Π±ΠΈΡΠΈ Π½Π΅ΠΏΠΎΡΡΠ΅Π±Π½Π΅ ΠΈ Π½Π΅ Π±ΠΈΡΡΠ΅ ΡΡΠ΅Π±Π°Π»ΠΈ Π³ΡΠ±ΠΈΡΠΈ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΠΈΡ ΠΎΠ²ΠΎ ΠΏΡΠΈΠΊΡΠΏΡΠ°ΡΠ΅. ΠΠ²Π°Ρ Π·Π°Π΄Π°ΡΠ°ΠΊ ΡΠ΅ ΡΠ°ΠΊΠΎΡΠ΅ ΠΌΠΎΠΆΠ΅ ΠΎΠ½Π΅ΠΌΠΎΠ³ΡΡΠΈΡΠΈ:
---
- name: Simple playbook
hosts: all
remote_user: root
become: true
gather_facts: no
ΠΠΎΠΊΡΡΠ°ΡΡΠ΅ ΠΏΠΎΠ½ΠΎΠ²ΠΎ Π΄Π° ΠΏΠΎΠΊΡΠ΅Π½Π΅ΡΠ΅ ΠΏΠ»Π°ΠΈΠ±ΠΎΠΎΠΊ ΠΈ ΡΠ²Π΅ΡΠΈΡΠ΅ ΡΠ΅ Π΄Π° Π²Π΅Π·Π° ΡΠ°Π΄ΠΈ. (ΠΠΊΠΎ ΡΡΠ΅ Π½Π°Π²Π΅Π»ΠΈ ΡΠΎΠΎΡ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠ°, ΠΎΠ½Π΄Π° ΠΌΠΎΡΠ°ΡΠ΅ Π΄Π° Π½Π°Π²Π΅Π΄Π΅ΡΠ΅ ΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Ρ ΠΏΠΎΡΡΠ°: ΡΡΡΠ΅ Π΄Π° Π±ΠΈΡΡΠ΅ Π΄ΠΎΠ±ΠΈΠ»ΠΈ ΠΏΠΎΠ²ΠΈΡΠ΅Π½Π° ΠΏΡΠ°Π²Π°. ΠΠ°ΠΎ ΡΡΠΎ ΡΠ΅ Π½Π°ΠΏΠΈΡΠ°Π½ΠΎ Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠΈ: become set to βtrueβ/βyesβ to activate privilege escalation.
ΠΈΠ°ΠΊΠΎ Π½ΠΈΡΠ΅ ΡΠ°ΡΠ²ΠΈΠΌ ΡΠ°ΡΠ½ΠΎ Π·Π°ΡΡΠΎ).
ΠΠΎΠΆΠ΄Π° ΡΠ΅ΡΠ΅ Π΄ΠΎΠ±ΠΈΡΠΈ Π³ΡΠ΅ΡΠΊΡ ΡΠ·ΡΠΎΠΊΠΎΠ²Π°Π½Ρ ΡΠΈΡΠ΅Π½ΠΈΡΠΎΠΌ Π΄Π° Π°Π½ΡΠΈΠ±Π»Π΅ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΎΠ΄ΡΠ΅Π΄ΠΈ ΠΠΈΡΡ ΠΎΠ½ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ΅Ρ, ΠΎΠ½Π΄Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ΅ ΠΎΠ΄ΡΠ΅Π΄ΠΈΡΠ΅ ΡΡΡΠ½ΠΎ:
ansible_python_interpreter: /usr/bin/python3
ΠΠΎΠΆΠ΅ΡΠ΅ ΡΠ°Π·Π½Π°ΡΠΈ Π³Π΄Π΅ ΠΈΠΌΠ°ΡΠ΅ ΠΠΈΡΡ
ΠΎΠ½ ΠΏΠΎΠΌΠΎΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ whereis python
.
ΠΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΈΡ ΠΏΠ°ΠΊΠ΅ΡΠ°
ΠΠ½ΡΠΈΠ±Π»Π΅ΠΎΠ²Π° ΡΡΠ°Π½Π΄Π°ΡΠ΄Π½Π° Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΡΠ° ΡΠΊΡΡΡΡΡΠ΅ ΠΌΠ½ΠΎΠ³Π΅ ΠΌΠΎΠ΄ΡΠ»Π΅ Π·Π° ΡΠ°Π΄ ΡΠ° ΡΠ°Π·Π»ΠΈΡΠΈΡΠΈΠΌ ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΈΠΌ ΠΏΠ°ΠΊΠ΅ΡΠΈΠΌΠ°, ΡΠ°ΠΊΠΎ Π΄Π° Π½Π΅ ΠΌΠΎΡΠ°ΠΌΠΎ Π΄Π° ΠΏΠΈΡΠ΅ΠΌΠΎ Π±Π°ΡΡ
ΡΠΊΡΠΈΠΏΡΠ΅ ΠΈΠ· Π±ΠΈΠ»ΠΎ ΠΊΠΎΠ³ ΡΠ°Π·Π»ΠΎΠ³Π°. Π‘Π°Π΄Π° Π½Π°ΠΌ ΡΠ΅ ΠΏΠΎΡΡΠ΅Π±Π°Π½ ΡΠ΅Π΄Π°Π½ ΠΎΠ΄ ΠΎΠ²ΠΈΡ
ΠΌΠΎΠ΄ΡΠ»Π° Π΄Π° Π°ΠΆΡΡΠΈΡΠ°ΠΌΠΎ ΡΠΈΡΡΠ΅ΠΌ ΠΈ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠΎ ΡΠΈΡΡΠ΅ΠΌΡΠΊΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠ΅. ΠΠΌΠ°ΠΌ Π£Π±ΡΠ½ΡΡ ΠΠΈΠ½ΡΠΊ Π½Π° ΡΠ²ΠΎΠΌ ΠΠΠ‘-Ρ, ΡΠ°ΠΊΠΎ Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌ ΠΏΠ°ΠΊΠ΅ΡΠ΅ ΠΊΠΎΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈΠΌ 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
ΠΠ°Π΄Π°ΡΠ°ΠΊ ΡΠ΅ ΡΠΏΡΠ°Π²ΠΎ Π·Π°Π΄Π°ΡΠ°ΠΊ ΠΊΠΎΡΠΈ ΡΠ΅ ΠΠ½ΡΠΈΠ±Π»Π΅ ΠΎΠ±Π°Π²ΡΠ°ΡΠΈ Π½Π° ΡΠ΄Π°ΡΠ΅Π½ΠΈΠΌ ΡΠ΅ΡΠ²Π΅ΡΠΈΠΌΠ°. ΠΠ°Π΄Π°ΡΠΊΡ Π΄Π°ΡΠ΅ΠΌΠΎ ΠΈΠΌΠ΅ ΠΊΠ°ΠΊΠΎ Π±ΠΈΡΠΌΠΎ ΠΌΠΎΠ³Π»ΠΈ Π΄Π° ΠΏΡΠ°ΡΠΈΠΌΠΎ ΡΠ΅Π³ΠΎΠ²ΠΎ ΠΈΠ·Π²ΡΡΠ΅ΡΠ΅ Ρ Π΄Π½Π΅Π²Π½ΠΈΠΊΡ. Π ΠΎΠΏΠΈΡΡΡΠ΅ΠΌΠΎ, ΠΊΠΎΡΠΈΡΡΠ΅ΡΠΈ ΡΠΈΠ½ΡΠ°ΠΊΡΡ ΠΎΠ΄ΡΠ΅ΡΠ΅Π½ΠΎΠ³ ΠΌΠΎΠ΄ΡΠ»Π°, ΡΡΠ° ΡΡΠ΅Π±Π° Π΄Π° ΡΡΠ°Π΄ΠΈ. Π£ ΠΎΠ²ΠΎΠΌ ΡΠ»ΡΡΠ°ΡΡ apt: update_cache=yes
- ΠΊΠ°ΠΆΠ΅ Π΄Π° Π°ΠΆΡΡΠΈΡΠ°ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΡΠΊΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠΈ Π°ΠΏΡ ΠΌΠΎΠ΄ΡΠ». ΠΡΡΠ³Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΡΠ΅ ΠΌΠ°Π»ΠΎ ΠΊΠΎΠΌΠΏΠ»ΠΈΠΊΠΎΠ²Π°Π½ΠΈΡΠ°. ΠΡΠΎΡΠ»Π΅Π΄ΠΈΠΌΠΎ Π»ΠΈΡΡΡ ΠΏΠ°ΠΊΠ΅ΡΠ° ΠΌΠΎΠ΄ΡΠ»Ρ Π°ΠΏΡ ΠΈ ΠΊΠ°ΠΆΠ΅ΠΌΠΎ Π΄Π° ΡΠ΅ΡΡ state
ΡΡΠ΅Π±Π° Π΄Π° ΠΏΠΎΡΡΠ°Π½Π΅ present
, ΠΎΠ΄Π½ΠΎΡΠ½ΠΎ ΠΊΠ°ΠΆΠ΅ΠΌΠΎ Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠΎ ΠΎΠ²Π΅ ΠΏΠ°ΠΊΠ΅ΡΠ΅. ΠΠ° ΡΠ»ΠΈΡΠ°Π½ Π½Π°ΡΠΈΠ½ ΠΌΠΎΠΆΠ΅ΠΌΠΎ ΠΈΠΌ ΡΠ΅ΡΠΈ Π΄Π° ΠΈΡ
ΠΈΠ·Π±ΡΠΈΡΡ ΠΈΠ»ΠΈ Π°ΠΆΡΡΠΈΡΠ°ΡΡ ΡΠ΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎΠΌ ΠΏΡΠΎΠΌΠ΅Π½ΠΎΠΌ state
. ΠΠΌΠ°ΡΡΠ΅ Π½Π° ΡΠΌΡ Π΄Π° Π½Π°ΠΌ ΡΠ΅ ΠΏΠΎΡΡΠ΅Π±Π°Π½ ΠΏΠ°ΠΊΠ΅Ρ ΠΏΠΎΡΡΠ³ΡΠ΅ΡΠΊΠ»-ΡΠΎΠ½ΡΡΠΈΠ± Π΄Π° Π±ΠΈ ΡΠΈΠ½Π΅ ΡΠ°Π΄ΠΈΠ»Π΅ ΡΠ° ΠΏΠΎΡΡΠ³ΡΠ΅ΡΠΊΠ»-ΠΎΠΌ, ΠΊΠΎΡΠΈ ΡΠ°Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠΎ. ΠΠΏΠ΅Ρ, ΠΌΠΎΡΠ°ΡΠ΅ Π·Π½Π°ΡΠΈ ΠΈ ΡΡΠΈΠ½ΠΈΡΠΈ ΠΎΠ²ΠΎ; Π°Π½ΡΠΈΠ±Π»Π΅ ΡΠ°ΠΌ ΠΏΠΎ ΡΠ΅Π±ΠΈ ΡΠΎ Π½Π΅ΡΠ΅ ΡΡΠΈΠ½ΠΈΡΠΈ.
ΠΠΎΠΊΡΡΠ°ΡΡΠ΅ ΠΏΠΎΠ½ΠΎΠ²ΠΎ Π΄Π° ΠΏΠΎΠΊΡΠ΅Π½Π΅ΡΠ΅ ΠΏΠ»Π°ΠΈΠ±ΠΎΠΎΠΊ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΠ΅ Π΄Π° Π»ΠΈ ΡΡ ΠΏΠ°ΠΊΠ΅ΡΠΈ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ΠΈ.
Π‘ΡΠ²Π°ΡΠ°ΡΠ΅ Π½ΠΎΠ²ΠΈΡ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠ°.
ΠΠ° ΡΠ°Π΄ ΡΠ° ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΈΠΌΠ°, ΠΠ½ΡΠΈΠ±Π»Π΅ ΠΈΠΌΠ° ΠΈ ΠΌΠΎΠ΄ΡΠ» β ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊ. Π₯Π°ΡΠ΄Π΅ Π΄Π° Π΄ΠΎΠ΄Π°ΠΌΠΎ ΡΠΎΡ ΡΠ΅Π΄Π°Π½ Π·Π°Π΄Π°ΡΠ°ΠΊ (ΡΠ°ΠΊΡΠΈΠΎ ΡΠ°ΠΌ Π²Π΅Ρ ΠΏΠΎΠ·Π½Π°ΡΠ΅ Π΄Π΅Π»ΠΎΠ²Π΅ ΡΠΈΡΠ°Π½ΠΊΠ΅ ΠΈΠ·Π° ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠ° Π΄Π° Π³Π° Π½Π΅ Π±ΠΈΡ ΡΠ²Π°ΠΊΠΈ ΠΏΡΡ ΠΏΠΎΡΠΏΡΠ½ΠΎ ΠΊΠΎΠΏΠΈΡΠ°ΠΎ):
---
- 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]
- ΠΊΠ°ΠΆΠ΅ Π΄Π° ΡΡ ΡΠ»Π΅Π΄Π΅ΡΠΈ Π±Π»ΠΎΠΊ ΡΠ΅ΠΊΡΡΠ° ΠΏΡΠΎΠΌΠ΅Π½ΡΠΈΠ²Π΅ (Π²Π°ΡΡ) ΠΈ ΠΎΠ½Π΅ ΡΡ ΠΏΡΠΈΠΌΠ΅Π½ΡΠΈΠ²Π΅ Π½Π° ΡΠ²Π΅ Ρ
ΠΎΡΡΠΎΠ²Π΅ (ΡΠ²Π΅).
ΠΠΈΠ·Π°ΡΠ½ ΡΠ΅ ΡΠ°ΠΊΠΎΡΠ΅ Π·Π°Π½ΠΈΠΌΡΠΈΠ² "{{ user_password | password_hash('sha512') }}"
. Π‘ΡΠ²Π°Ρ ΡΠ΅ Ρ ΡΠΎΠΌΠ΅ ΡΡΠΎ Π°Π½ΡΠΈΠ±Π»Π΅ Π½Π΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ° ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠ° ΠΏΡΠ΅ΠΊΠΎ user_add
ΠΊΠ°ΠΎ Π΄Π° Π±ΠΈΡΡΠ΅ ΡΠΎ ΡΡΠ°Π΄ΠΈΠ»ΠΈ ΡΡΡΠ½ΠΎ. Π Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΡΡΠ²Π° ΡΠ²Π΅ ΠΏΠΎΠ΄Π°ΡΠΊΠ΅, Π·Π±ΠΎΠ³ ΡΠ΅Π³Π° ΡΠ°ΠΊΠΎΡΠ΅ ΠΌΠΎΡΠ°ΠΌΠΎ ΡΠ½Π°ΠΏΡΠ΅Π΄ ΠΏΡΠ΅ΡΠ²ΠΎΡΠΈΡΠΈ Π»ΠΎΠ·ΠΈΠ½ΠΊΡ Ρ Ρ
Π΅Ρ, ΡΡΠΎ ΠΎΠ²Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΡΠ°Π΄ΠΈ.
Π₯Π°ΡΠ΄Π΅ Π΄Π° Π΄ΠΎΠ΄Π°ΠΌΠΎ Π½Π°ΡΠ΅Π³ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠ° Ρ ΡΡΠ΄ΠΎ Π³ΡΡΠΏΡ. ΠΠ΅ΡΡΡΠΈΠΌ, ΠΏΡΠ΅ ΡΠΎΠ³Π° ΠΌΠΎΡΠ°ΠΌΠΎ Π΄Π° ΡΠ΅ ΡΠ²Π΅ΡΠΈΠΌΠΎ Π΄Π° ΡΠ°ΠΊΠ²Π° Π³ΡΡΠΏΠ° ΠΏΠΎΡΡΠΎΡΠΈ ΡΠ΅Ρ Π½ΠΈΠΊΠΎ ΠΎΠ²ΠΎ Π½Π΅ΡΠ΅ ΡΡΠ°Π΄ΠΈΡΠΈ ΡΠΌΠ΅ΡΡΠΎ Π½Π°Ρ:
---
- 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"
Π‘Π²Π΅ ΡΠ΅ ΠΏΡΠΈΠ»ΠΈΡΠ½ΠΎ ΡΠ΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ, ΠΈΠΌΠ°ΠΌΠΎ ΠΈ Π³ΡΡΠΏΠ½ΠΈ ΠΌΠΎΠ΄ΡΠ» Π·Π° ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ Π³ΡΡΠΏΠ°, ΡΠ° ΡΠΈΠ½ΡΠ°ΠΊΡΠΎΠΌ Π²Π΅ΠΎΠΌΠ° ΡΠ»ΠΈΡΠ½ΠΎΠΌ Π°ΠΏΡ. Π’Π°Π΄Π° ΡΠ΅ Π΄ΠΎΠ²ΠΎΡΠ½ΠΎ Π΄Π° ΠΎΠ²Ρ Π³ΡΡΠΏΡ ΡΠ΅Π³ΠΈΡΡΡΡΡΠ΅ΡΠ΅ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΡ (groups: "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"
- name: Deploy SSH Key
authorized_key:
user: "{{ user }}"
key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
state: present
Π£ ΠΎΠ²ΠΎΠΌ ΡΠ»ΡΡΠ°ΡΡ, Π΄ΠΈΠ·Π°ΡΠ½ ΡΠ΅ Π·Π°Π½ΠΈΠΌΡΠΈΠ² "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
β ΠΊΠΎΠΏΠΈΡΠ° ΡΠ°Π΄ΡΠΆΠ°Ρ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ΅ ΠΈΠ΄_ΡΡΠ°.ΠΏΡΠ± (Π²Π°ΡΠ΅ ΠΈΠΌΠ΅ ΠΌΠΎΠΆΠ΅ Π±ΠΈΡΠΈ Π΄ΡΡΠ³Π°ΡΠΈΡΠ΅), ΠΎΠ΄Π½ΠΎΡΠ½ΠΎ ΡΠ°Π²Π½ΠΈ Π΄Π΅ΠΎ ΡΡΡ
ΠΊΡΡΡΠ° ΠΈ ΠΏΠΎΡΡΠ°Π²ΡΠ° Π³Π° Π½Π° Π»ΠΈΡΡΡ ΠΎΠ²Π»Π°ΡΡΠ΅Π½ΠΈΡ
ΠΊΡΡΡΠ΅Π²Π° Π·Π° ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠ° Π½Π° ΡΠ΅ΡΠ²Π΅ΡΡ.
Π£Π»ΠΎΠ³Π΅
Π‘Π²Π° ΡΡΠΈ Π·Π°Π΄Π°ΡΠΊΠ° Π·Π° ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ ΡΠΏΠΎΡΡΠ΅Π±Π΅ Π»Π°ΠΊΠΎ ΡΠ΅ ΠΌΠΎΠ³Ρ ΡΠ²ΡΡΡΠ°ΡΠΈ Ρ ΡΠ΅Π΄Π½Ρ Π³ΡΡΠΏΡ Π·Π°Π΄Π°ΡΠ°ΠΊΠ° ΠΈ Π±ΠΈΠ»ΠΎ Π±ΠΈ Π΄ΠΎΠ±ΡΠΎ Π΄Π° ΠΎΠ²Ρ Π³ΡΡΠΏΡ ΡΠΊΠ»Π°Π΄ΠΈΡΡΠΈΡΠ΅ ΠΎΠ΄Π²ΠΎΡΠ΅Π½ΠΎ ΠΎΠ΄ Π³Π»Π°Π²Π½Π΅ ΠΊΡΠΈΠ³Π΅ ΠΊΠ°ΠΊΠΎ Π½Π΅ Π±ΠΈ ΠΏΠΎΡΡΠ°Π»Π° ΠΏΡΠ΅Π²Π΅Π»ΠΈΠΊΠ°. ΠΠ° ΠΎΠ²Ρ ΡΠ²ΡΡ
Ρ, ΠΠ½ΡΠΈΠ±Π»Π΅ ΠΈΠΌΠ°
Π£ ΡΠΊΠ»Π°Π΄Ρ ΡΠ° ΡΡΡΡΠΊΡΡΡΠΎΠΌ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° ΠΊΠΎΡΠ° ΡΠ΅ Π½Π°Π·Π½Π°ΡΠ΅Π½Π° Π½Π° ΡΠ°ΠΌΠΎΠΌ ΠΏΠΎΡΠ΅ΡΠΊΡ, ΡΠ»ΠΎΠ³Π΅ ΠΌΠΎΡΠ°ΡΡ Π±ΠΈΡΠΈ ΡΠΌΠ΅ΡΡΠ΅Π½Π΅ Ρ ΠΏΠΎΡΠ΅Π±Π°Π½ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠΌ ΡΠ»ΠΎΠ³Π°, Π·Π° ΡΠ²Π°ΠΊΡ ΡΠ»ΠΎΠ³Ρ ΠΏΠΎΡΡΠΎΡΠΈ ΠΏΠΎΡΠ΅Π±Π°Π½ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠΌ ΡΠ° ΠΈΡΡΠΈΠΌ ΠΈΠΌΠ΅Π½ΠΎΠΌ, ΡΠ½ΡΡΠ°Ρ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠΌΠ° Π·Π°Π΄Π°ΡΠ°ΠΊΠ°, Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°, ΡΠ°Π±Π»ΠΎΠ½Π° ΠΈΡΠ΄.
Π₯Π°ΡΠ΄Π΅ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌΠΎ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ΅: ./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
.
ΠΠΎΠ΄Π΅ΡΠ°Π²Π°ΡΠ΅ Π½Π³ΠΈΠ½ΠΊ-Π°
ΠΠ΅Ρ Π±ΠΈ ΡΡΠ΅Π±Π°Π»ΠΎ Π΄Π° ΠΈΠΌΠ°ΠΌΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ ΠΠ³ΠΈΠ½ΠΊ; ΠΌΠΎΡΠ°ΠΌΠΎ Π΄Π° Π³Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ΅ΠΌΠΎ ΠΈ ΠΏΠΎΠΊΡΠ΅Π½Π΅ΠΌΠΎ. Π£ΡΠ°Π΄ΠΈΠΌΠΎ ΡΠΎ ΠΎΠ΄ΠΌΠ°Ρ Ρ ΡΠ»ΠΎΠ·ΠΈ. Π₯Π°ΡΠ΄Π΅ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌΠΎ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ΅:
- ansible
- roles
- nginx
- files
- tasks
- main.yml
- templates
Π‘Π°Π΄Π° ΡΡ Π½Π°ΠΌ ΠΏΠΎΡΡΠ΅Π±Π½Π΅ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ΅ ΠΈ ΡΠ°Π±Π»ΠΎΠ½ΠΈ. Π Π°Π·Π»ΠΈΠΊΠ° ΠΈΠ·ΠΌΠ΅ΡΡ ΡΠΈΡ ΡΠ΅ Ρ ΡΠΎΠΌΠ΅ ΡΡΠΎ Π°Π½ΡΠΈΠ±Π»Π΅ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΠΊΠΎΠΏΠΈΡΠ° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ΅, ΡΠ°ΠΊΠ²Π΅ ΠΊΠ°ΠΊΠ²Π΅ ΡΠ΅ΡΡ. Π ΡΠ°Π±Π»ΠΎΠ½ΠΈ ΠΌΠΎΡΠ°ΡΡ ΠΈΠΌΠ°ΡΠΈ Π΅ΠΊΡΡΠ΅Π½Π·ΠΈΡΡ Ρ2 ΠΈ ΠΌΠΎΠ³Ρ ΠΊΠΎΡΠΈΡΡΠΈΡΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΡΠΈΠ²Π΅ Π²ΡΠ΅Π΄Π½ΠΎΡΡΠΈ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠΈ ΠΈΡΡΠ΅ Π΄ΡΠΏΠ»Π΅ Π²ΠΈΡΠΈΡΠ°ΡΡΠ΅ Π·Π°Π³ΡΠ°Π΄Π΅.
Π₯Π°ΡΠ΄Π΅ Π΄Π° ΠΎΠΌΠΎΠ³ΡΡΠΈΠΌΠΎ Π½Π³ΠΈΠ½ΠΊ main.yml
ΡΠ°ΡΠ». ΠΠ° ΠΎΠ²ΠΎ ΠΈΠΌΠ°ΠΌΠΎ ΡΠΈΡΡΠ΅ΠΌΠ΄ ΠΌΠΎΠ΄ΡΠ»:
# Copy nginx configs and start it
- name: enable service nginx and start
systemd:
name: nginx
state: started
enabled: yes
ΠΠ²Π΄Π΅ Π½Π΅ ΡΠ°ΠΌΠΎ Π΄Π° ΠΊΠ°ΠΆΠ΅ΠΌΠΎ Π΄Π° ΡΠ΅ Π½Π³ΠΈΠ½ΠΊ ΠΌΠΎΡΠ° ΠΏΠΎΠΊΡΠ΅Π½ΡΡΠΈ (ΠΎΠ΄Π½ΠΎΡΠ½ΠΎ Π΄Π° Π³Π° ΠΏΠΎΠΊΡΠ΅ΡΠ΅ΠΌΠΎ), Π²Π΅Ρ ΠΎΠ΄ΠΌΠ°Ρ
ΠΊΠ°ΠΆΠ΅ΠΌΠΎ Π΄Π° ΠΌΠΎΡΠ° Π±ΠΈΡΠΈ ΠΎΠΌΠΎΠ³ΡΡΠ΅Π½.
Π‘Π°Π΄Π° ΠΊΠΎΠΏΠΈΡΠ°ΡΠΌΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π΅ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ΅:
# 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'
ΠΡΠ΅ΠΈΡΠ°ΠΌΠΎ Π³Π»Π°Π²Π½Ρ Π½Π³ΠΈΠ½ΠΊ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Ρ Π΄Π°ΡΠΎΡΠ΅ΠΊΡ (ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ΅ ΠΏΡΠ΅ΡΠ·Π΅ΡΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΡΠ° ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΈΠ»ΠΈ ΡΠ΅ ΡΠ°ΠΌΠΈ Π½Π°ΠΏΠΈΡΠ°ΡΠΈ). Π ΡΠ°ΠΊΠΎΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½ΠΈ ΡΠ°ΡΠ» Π·Π° Π½Π°ΡΡ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΡ Ρ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠΌΡ ΡΠΈΡΠ΅Ρ_Π°Π²Π°ΠΈΠ»Π°Π±Π»Π΅ (ΠΎΠ²ΠΎ Π½ΠΈΡΠ΅ Π½Π΅ΠΎΠΏΡ
ΠΎΠ΄Π½ΠΎ, Π°Π»ΠΈ ΠΊΠΎΡΠΈΡΠ½ΠΎ). Π£ ΠΏΡΠ²ΠΎΠΌ ΡΠ»ΡΡΠ°ΡΡ ΠΊΠΎΡΠΈΡΡΠΈΠΌΠΎ ΠΌΠΎΠ΄ΡΠ» Π·Π° ΠΊΠΎΠΏΠΈΡΠ°ΡΠ΅ Π·Π° ΠΊΠΎΠΏΠΈΡΠ°ΡΠ΅ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° (Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° ΠΌΠΎΡΠ° Π±ΠΈΡΠΈ Ρ /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 }}
β ΠΎΠ²ΠΎ ΡΡ ΡΠ²Π΅ ΠΏΡΠΎΠΌΠ΅Π½ΡΠΈΠ²Π΅ ΡΠΈΡΠ΅ Π²ΡΠ΅Π΄Π½ΠΎΡΡΠΈ ΡΠ΅ ΠΠ½ΡΠΈΠ±Π»Π΅ Π·Π°ΠΌΠ΅Π½ΠΈΡΠΈ Ρ ΡΠ°Π±Π»ΠΎΠ½Ρ ΠΏΡΠ΅ ΠΊΠΎΠΏΠΈΡΠ°ΡΠ°. ΠΠ²ΠΎ ΡΠ΅ ΠΊΠΎΡΠΈΡΠ½ΠΎ Π°ΠΊΠΎ ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ ΠΏΡΠΈΡΡΡΠ½ΠΈΠΊ Π·Π° ΡΠ°Π·Π»ΠΈΡΠΈΡΠ΅ Π³ΡΡΠΏΠ΅ Π΄ΠΎΠΌΠ°ΡΠΈΠ½Π°. ΠΠ° ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΠΎΠΆΠ΅ΠΌΠΎ Π΄ΠΎΠ΄Π°ΡΠΈ Π½Π°ΡΡ Π΄Π°ΡΠΎΡΠ΅ΠΊΡ ΠΈΠ½Π²Π΅Π½ΡΠ°ΡΠ°:
[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
ΠΠΊΠΎ ΡΠ°Π΄Π° ΠΏΠΎΠΊΡΠ΅Π½Π΅ΠΌΠΎ Π½Π°Ρ ΠΏΠ»Π°ΠΈΠ±ΠΎΠΎΠΊ, ΠΎΠ½ ΡΠ΅ ΠΈΠ·Π²ΡΡΠΈΡΠΈ Π½Π°Π²Π΅Π΄Π΅Π½Π΅ Π·Π°Π΄Π°ΡΠΊΠ΅ Π·Π° ΠΎΠ±Π° Π΄ΠΎΠΌΠ°ΡΠΈΠ½Π°. ΠΠ»ΠΈ Ρ ΠΈΡΡΠΎ Π²ΡΠ΅ΠΌΠ΅, Π·Π° Ρ
ΠΎΡΡ Π·Π° ΠΏΠΎΡΡΠ°Π²ΡΠ°ΡΠ΅, Π²Π°ΡΠΈΡΠ°Π±Π»Π΅ ΡΠ΅ ΡΠ΅ ΡΠ°Π·Π»ΠΈΠΊΠΎΠ²Π°ΡΠΈ ΠΎΠ΄ ΠΎΠ½ΠΈΡ
Ρ ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡΠΈ, ΠΈ ΡΠΎ Π½Π΅ ΡΠ°ΠΌΠΎ Ρ ΡΠ»ΠΎΠ³Π°ΠΌΠ° ΠΈ ΠΏΡΠΈΡΡΡΠ½ΠΈΡΠΈΠΌΠ°, Π²Π΅Ρ ΠΈΡ Π½Π³ΠΈΠ½ΠΊ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΠΌΠ°. {{ inventory_hostname }}
Π½Π΅ ΡΡΠ΅Π±Π° Π½Π°Π²Π΅ΡΡΠΈ Ρ Π΄ΠΎΡΠΈΡΠ΅Ρ ΠΈΠ½Π²Π΅Π½ΡΠ°ΡΠ° β ΠΎΠ²ΠΎ
ΠΠΊΠΎ ΠΆΠ΅Π»ΠΈΡΠ΅ Π΄Π° ΠΈΠΌΠ°ΡΠ΅ Π΄Π°ΡΠΎΡΠ΅ΠΊΡ ΠΈΠ½Π²Π΅Π½ΡΠ°ΡΠ° Π·Π° Π½Π΅ΠΊΠΎΠ»ΠΈΠΊΠΎ Ρ
ΠΎΡΡΠΎΠ²Π°, Π°Π»ΠΈ Π΄Π° ΡΠ΅ ΠΏΠΎΠΊΡΠ΅Π½Π΅ΡΠ΅ ΡΠ°ΠΌΠΎ Π·Π° ΡΠ΅Π΄Π½Ρ Π³ΡΡΠΏΡ, ΡΠΎ ΡΠ΅ ΠΌΠΎΠΆΠ΅ ΡΡΠ°Π΄ΠΈΡΠΈ ΡΠ»Π΅Π΄Π΅ΡΠΎΠΌ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΌ:
ansible-playbook -i inventory ./playbook.yml -l "staging"
ΠΡΡΠ³Π° ΠΎΠΏΡΠΈΡΠ° ΡΠ΅ Π΄Π° ΠΈΠΌΠ°ΡΠ΅ Π·Π°ΡΠ΅Π±Π½Π΅ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ΅ ΠΈΠ½Π²Π΅Π½ΡΠ°ΡΠ° Π·Π° ΡΠ°Π·Π»ΠΈΡΠΈΡΠ΅ Π³ΡΡΠΏΠ΅. ΠΠ»ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΎΠ²Π°ΡΠΈ Π΄Π²Π° ΠΏΡΠΈΡΡΡΠΏΠ° Π°ΠΊΠΎ ΠΈΠΌΠ°ΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°Π·Π»ΠΈΡΠΈΡΠΈΡ Π΄ΠΎΠΌΠ°ΡΠΈΠ½Π°.
ΠΡΠ°ΡΠΈΠΌΠΎ ΡΠ΅ Π½Π° ΠΏΠΎΠ΄Π΅ΡΠ°Π²Π°ΡΠ΅ Π½Π³ΠΈΠ½ΠΊ-Π°. ΠΠ°ΠΊΠΎΠ½ ΠΊΠΎΠΏΠΈΡΠ°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½ΠΈΡ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°, ΠΏΠΎΡΡΠ΅Π±Π½ΠΎ ΡΠ΅ Π΄Π° ΠΊΡΠ΅ΠΈΡΠ°ΠΌΠΎ ΡΠΈΠΌΠ±ΠΎΠ»ΠΈΡΠΊΡ Π²Π΅Π·Ρ Ρ ΡΠΈΡΠ΅ΡΡ_Π΅Π½Π°Π±Π»Π΅Π΄ Π΄ΠΎ ΠΌΠΈ_Π°ΠΏΠΏ.ΡΠΎΠ½Ρ ΡΠ° ΡΠΈΡΠ΅Ρ_Π°Π²Π°ΠΈΠ»Π°Π±Π»Π΅. Π ΠΏΠΎΠ½ΠΎΠ²ΠΎ ΠΏΠΎΠΊΡΠ΅Π½ΠΈΡΠ΅ Π½Π³ΠΈΠ½ΠΊ.
... # 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
ΠΠ²Π΄Π΅ ΡΠ΅ ΡΠ²Π΅ ΡΠ΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ - ΠΎΠΏΠ΅Ρ Π°Π½ΡΠΈΠ±Π»Π΅ ΠΌΠΎΠ΄ΡΠ»ΠΈ ΡΠ° ΠΏΡΠΈΠ»ΠΈΡΠ½ΠΎ ΡΡΠ°Π½Π΄Π°ΡΠ΄Π½ΠΎΠΌ ΡΠΈΠ½ΡΠ°ΠΊΡΠΎΠΌ. ΠΠ»ΠΈ ΠΏΠΎΡΡΠΎΡΠΈ ΡΠ΅Π΄Π½Π° ΡΠ°ΡΠΊΠ°. ΠΠ΅ΠΌΠ° ΡΠΌΠΈΡΠ»Π° ΡΠ²Π°ΠΊΠΈ ΠΏΡΡ ΠΏΠΎΠ½ΠΎΠ²ΠΎ ΠΏΠΎΠΊΡΠ΅ΡΠ°ΡΠΈ Π½Π³ΠΈΠ½ΠΊ. ΠΠ° Π»ΠΈ ΡΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠΈΠ»ΠΈ Π΄Π° Π½Π΅ ΠΏΠΈΡΠ΅ΠΌΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ ΠΏΠΎΠΏΡΡ: βΡΡΠ°Π΄ΠΈ ΠΎΠ²ΠΎ ΠΎΠ²Π°ΠΊΠΎβ, ΡΠΈΠ½ΡΠ°ΠΊΡΠ° Π²ΠΈΡΠ΅ ΠΈΠ·Π³Π»Π΅Π΄Π° ΠΊΠ°ΠΎ βΠΎΠ²ΠΎ Π±ΠΈ ΡΡΠ΅Π±Π°Π»ΠΎ Π΄Π° ΠΈΠΌΠ° ΠΎΠ²ΠΎ ΡΡΠ°ΡΠ΅β. Π Π½Π°ΡΡΠ΅ΡΡΠ΅ ΡΠΏΡΠ°Π²ΠΎ ΡΠ°ΠΊΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠ΅ Π°Π½ΡΠΈΠ±Π»Π΅. ΠΠΊΠΎ Π³ΡΡΠΏΠ° Π²Π΅Ρ ΠΏΠΎΡΡΠΎΡΠΈ ΠΈΠ»ΠΈ ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΈ ΠΏΠ°ΠΊΠ΅Ρ Π²Π΅Ρ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½, Π°Π½ΡΠΈΠ±Π»Π΅ ΡΠ΅ ΡΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΠΈ ΠΈ ΠΏΡΠ΅ΡΠΊΠΎΡΠΈΡΠΈ Π·Π°Π΄Π°ΡΠ°ΠΊ. Π’Π°ΠΊΠΎΡΠ΅, Π΄Π°ΡΠΎΡΠ΅ΠΊΠ΅ Π½Π΅ΡΠ΅ Π±ΠΈΡΠΈ ΠΊΠΎΠΏΠΈΡΠ°Π½Π΅ Π°ΠΊΠΎ Ρ ΠΏΠΎΡΠΏΡΠ½ΠΎΡΡΠΈ ΠΎΠ΄Π³ΠΎΠ²Π°ΡΠ°ΡΡ ΠΎΠ½ΠΎΠΌΠ΅ ΡΡΠΎ ΡΠ΅ Π²Π΅Ρ Π½Π°Π»Π°Π·ΠΈ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΡ. ΠΠ²ΠΎ ΠΌΠΎΠΆΠ΅ΠΌΠΎ ΠΈΡΠΊΠΎΡΠΈΡΡΠΈΡΠΈ ΠΈ ΠΏΠΎΠ½ΠΎΠ²ΠΎ ΠΏΠΎΠΊΡΠ΅Π½ΡΡΠΈ Π½Π³ΠΈΠ½ΠΊ ΡΠ°ΠΌΠΎ Π°ΠΊΠΎ ΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π΅ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ΅ ΠΏΡΠΎΠΌΠ΅ΡΠ΅Π½Π΅. ΠΠ° ΠΎΠ²ΠΎ ΠΏΠΎΡΡΠΎΡΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Π° ΠΎ ΡΠ΅Π³ΠΈΡΡΡΡ:
# 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
. Π ΡΠ°ΠΌΠΎ Π°ΠΊΠΎ ΡΠ΅ ΠΎΠ²Π° ΠΏΡΠΎΠΌΠ΅Π½ΡΠΈΠ²Π° ΡΠ΅Π³ΠΈΡΡΡΠΎΠ²Π°Π½Π°, ΡΠ΅ΡΠ²ΠΈΡ ΡΠ΅ Π±ΠΈΡΠΈ ΠΏΠΎΠ½ΠΎΠ²ΠΎ ΠΏΠΎΠΊΡΠ΅Π½ΡΡ.
Π, Π½Π°ΡΠ°Π²Π½ΠΎ, ΠΌΠΎΡΠ°ΡΠ΅ Π΄Π° Π΄ΠΎΠ΄Π°ΡΠ΅ Π½Π³ΠΈΠ½ΠΊ ΡΠ»ΠΎΠ³Ρ Ρ Π³Π»Π°Π²Π½Ρ ΠΊΡΠΈΠ³Ρ.
ΠΠΎΠ΄Π΅ΡΠ°Π²Π°ΡΠ΅ ΠΏΠΎΡΡΠ³ΡΠ΅ΡΠΊΠ»-Π°
ΠΠΎΡΠ°ΠΌΠΎ Π΄Π° ΠΎΠΌΠΎΠ³ΡΡΠΈΠΌΠΎ ΠΏΠΎΡΡΠ³ΡΠ΅ΡΠΊΠ» ΠΊΠΎΡΠΈΡΡΠ΅ΡΠΈ ΡΠΈΡΡΠ΅ΠΌΠ΄ Π½Π° ΠΈΡΡΠΈ Π½Π°ΡΠΈΠ½ ΠΊΠ°ΠΎ ΡΡΠΎ ΡΠΌΠΎ ΡΡΠ°Π΄ΠΈΠ»ΠΈ ΡΠ° Π½Π³ΠΈΠ½ΠΊ-ΠΎΠΌ, Π° ΡΠ°ΠΊΠΎΡΠ΅ ΠΈ Π΄Π° ΠΊΡΠ΅ΠΈΡΠ°ΠΌΠΎ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠ° ΠΊΠΎΡΠ΅Π³ ΡΠ΅ΠΌΠΎ ΠΊΠΎΡΠΈΡΡΠΈΡΠΈ Π·Π° ΠΏΡΠΈΡΡΡΠΏ Π±Π°Π·ΠΈ ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ° ΠΈ ΡΠ°ΠΌΠΎΡ Π±Π°Π·ΠΈ ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ°.
Π₯Π°ΡΠ΄Π΅ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌΠΎ ΡΠ»ΠΎΠ³Ρ /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 }}"
ΠΠ΅ΡΡ ΠΎΠΏΠΈΡΠΈΠ²Π°ΡΠΈ ΠΊΠ°ΠΊΠΎ Π΄ΠΎΠ΄Π°ΡΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΡΠΈΠ²Π΅ Ρ ΠΈΠ½Π²Π΅Π½ΡΠ°Ρ, ΡΠΎ ΡΠ΅ Π²Π΅Ρ ΡΡΠ°ΡΠ΅Π½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΡΠ°, ΠΊΠ°ΠΎ ΠΈ ΡΠΈΠ½ΡΠ°ΠΊΡΡ ΠΌΠΎΠ΄ΡΠ»Π° ΠΏΠΎΡΡΠ³ΡΠ΅ΡΠΊΠ»_Π΄Π± ΠΈ ΠΏΠΎΡΡΠ³ΡΠ΅ΡΠΊΠ»_ΡΡΠ΅Ρ. ΠΠΈΡΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡΠ° ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΎΠ½Π°ΡΠΈ Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠΈ. ΠΠ²Π΄Π΅ ΡΠ΅ Π½Π°ΡΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ°Π½ΡΠ½ΠΈΡΠ° Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Π° become_user: postgres
. Π§ΠΈΡΠ΅Π½ΠΈΡΠ° ΡΠ΅ Π΄Π° ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π½ΠΎ ΡΠ°ΠΌΠΎ ΠΏΠΎΡΡΠ³ΡΠ΅Ρ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊ ΠΈΠΌΠ° ΠΏΡΠΈΡΡΡΠΏ ΠΏΠΎΡΡΠ³ΡΠ΅ΡΠΊΠ» Π±Π°Π·ΠΈ ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ° ΠΈ ΡΠΎ ΡΠ°ΠΌΠΎ Π»ΠΎΠΊΠ°Π»Π½ΠΎ. ΠΠ²Π° Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Π° Π½Π°ΠΌ ΠΎΠΌΠΎΠ³ΡΡΠ°Π²Π° Π΄Π° ΠΈΠ·Π²ΡΡΠ°Π²Π°ΠΌΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ Ρ ΠΈΠΌΠ΅ ΠΎΠ²ΠΎΠ³ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠ° (Π°ΠΊΠΎ ΠΈΠΌΠ°ΠΌΠΎ ΠΏΡΠΈΡΡΡΠΏ, Π½Π°ΡΠ°Π²Π½ΠΎ).
Π’Π°ΠΊΠΎΡΠ΅, ΠΌΠΎΠΆΠ΄Π° ΡΠ΅ΡΠ΅ ΠΌΠΎΡΠ°ΡΠΈ Π΄Π° Π΄ΠΎΠ΄Π°ΡΠ΅ ΡΠ΅Π΄ Ρ ΠΏΠ³_Ρ
Π±Π°.ΡΠΎΠ½Ρ Π΄Π° Π±ΠΈΡΡΠ΅ Π½ΠΎΠ²ΠΎΠΌ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΡ ΠΎΠΌΠΎΠ³ΡΡΠΈΠ»ΠΈ ΠΏΡΠΈΡΡΡΠΏ Π±Π°Π·ΠΈ ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ°. ΠΠ²ΠΎ ΡΠ΅ ΠΌΠΎΠΆΠ΅ ΡΡΠ°Π΄ΠΈΡΠΈ Π½Π° ΠΈΡΡΠΈ Π½Π°ΡΠΈΠ½ ΠΊΠ°ΠΎ ΡΡΠΎ ΡΠΌΠΎ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΠ»ΠΈ Π½Π³ΠΈΠ½ΠΊ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡ.
Π Π½Π°ΡΠ°Π²Π½ΠΎ, ΠΏΠΎΡΡΠ΅Π±Π½ΠΎ ΡΠ΅ Π΄Π° Π΄ΠΎΠ΄Π°ΡΠ΅ ΡΠ»ΠΎΠ³Ρ ΠΏΠΎΡΡΠ³ΡΠ΅ΡΠΊΠ» Ρ Π³Π»Π°Π²Π½Ρ ΠΊΡΠΈΠ³Ρ.
ΠΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ ΡΡΠ±ΠΈ-Π° ΠΏΡΠ΅ΠΊΠΎ ΡΠ±Π΅Π½Π²-Π°
ΠΠ½ΡΠΈΠ±Π»Π΅ Π½Π΅ΠΌΠ° ΠΌΠΎΠ΄ΡΠ»Π΅ Π·Π° ΡΠ°Π΄ ΡΠ° ΡΠ±Π΅Π½Π²-ΠΎΠΌ, Π°Π»ΠΈ ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ° ΠΊΠ»ΠΎΠ½ΠΈΡΠ°ΡΠ΅ΠΌ Π³ΠΈΡ ΡΠΏΡΠ΅ΠΌΠΈΡΡΠ°. Π‘ΡΠΎΠ³Π°, ΠΎΠ²Π°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΠΏΠΎΡΡΠ°ΡΠ΅ Π½Π°ΡΠ½Π΅ΡΡΠ°Π½Π΄Π°ΡΠ΄Π½ΠΈΡΠΈ. Π₯Π°ΡΠ΄Π΅ Π΄Π° ΡΠΎΡ Π½Π°ΠΏΡΠ°Π²ΠΈΠΌΠΎ ΡΠ»ΠΎΠ³Ρ /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
ΠΠΎΠ½ΠΎΠ²ΠΎ ΠΊΠΎΡΠΈΡΡΠΈΠΌΠΎ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Ρ Π±Π΅ΡΠΎΠΌΠ΅_ΡΡΠ΅Ρ Π·Π° ΡΠ°Π΄ ΠΏΠΎΠ΄ ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠΎΠΌ ΠΊΠΎΡΠ΅Π³ ΡΠΌΠΎ ΠΊΡΠ΅ΠΈΡΠ°Π»ΠΈ Π·Π° ΠΎΠ²Π΅ ΡΠ²ΡΡ Π΅. ΠΠΎΡΡΠΎ ΡΠ΅ ΡΠ±Π΅Π½Π² ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ Ρ ΡΠ²ΠΎΠΌ ΠΌΠ°ΡΠΈΡΠ½ΠΎΠΌ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠΌΡ, Π° Π½Π΅ Π³Π»ΠΎΠ±Π°Π»Π½ΠΎ. Π’Π°ΠΊΠΎΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈΠΌΠΎ Π³ΠΈΡ ΠΌΠΎΠ΄ΡΠ» Π·Π° ΠΊΠ»ΠΎΠ½ΠΈΡΠ°ΡΠ΅ ΡΠΏΡΠ΅ΠΌΠΈΡΡΠ°, Π½Π°Π²ΠΎΠ΄Π΅ΡΠΈ ΡΠ΅ΠΏΠΎ ΠΈ ΠΎΠ΄ΡΠ΅Π΄ΠΈΡΡΠ΅.
ΠΠ°ΡΠΈΠΌ ΠΌΠΎΡΠ°ΠΌΠΎ ΡΠ΅Π³ΠΈΡΡΡΠΎΠ²Π°ΡΠΈ ΡΠ±Π΅Π½Π² ΠΈΠ½ΠΈΡ Ρ Π±Π°ΡΡ ΡΡ ΠΈ ΡΠ°ΠΌΠΎ Π΄ΠΎΠ΄Π°ΡΠΈ ΡΠ±Π΅Π½Π² Ρ ΠΠΠ’Π₯. ΠΠ° ΠΎΠ²ΠΎ ΠΈΠΌΠ°ΠΌΠΎ ΠΌΠΎΠ΄ΡΠ» Π»ΠΈΠ½Π΅ΠΈΠ½ΡΠΈΠ»Π΅:
- 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 -)"'
ΠΠ°ΡΠΈΠΌ ΠΌΠΎΡΠ°ΡΠ΅ Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ ΡΡΠ±ΠΈ_Π±ΡΠΈΠ»Π΄:
- name: Install ruby-build
become_user: "{{ user }}"
git: repo=https://github.com/rbenv/ruby-build.git dest=~/.rbenv/plugins/ruby-build
Π Π½Π° ΠΊΡΠ°ΡΡ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΡΠ΅ ΡΡΠ±ΠΈ. ΠΠ²ΠΎ ΡΠ΅ ΡΠ°Π΄ΠΈ ΠΏΡΠ΅ΠΊΠΎ ΡΠ±Π΅Π½Π²-Π°, ΠΎΠ΄Π½ΠΎΡΠ½ΠΎ ΡΠ΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ ΡΠ° Π±Π°ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΌ:
- name: Install ruby
become_user: "{{ user }}"
shell: |
export PATH="${HOME}/.rbenv/bin:${PATH}"
eval "$(rbenv init -)"
rbenv install {{ ruby_version }}
args:
executable: /bin/bash
ΠΠΈ ΠΊΠ°ΠΆΠ΅ΠΌΠΎ ΠΊΠΎΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π΄Π° ΠΈΠ·Π²ΡΡΠΈΠΌΠΎ ΠΈ ΡΠ° ΡΠΈΠΌΠ΅. ΠΠ΅ΡΡΡΠΈΠΌ, ΠΎΠ²Π΄Π΅ Π½Π°ΠΈΠ»Π°Π·ΠΈΠΌΠΎ Π½Π° ΡΠΈΡΠ΅Π½ΠΈΡΡ Π΄Π° Π°Π½ΡΠΈΠ±Π»Π΅ Π½Π΅ ΠΏΠΎΠΊΡΠ΅ΡΠ΅ ΠΊΠΎΠ΄ ΡΠ°Π΄ΡΠΆΠ°Π½ Ρ Π±Π°ΡΡ ΡΡ-Ρ ΠΏΡΠ΅ Π½Π΅Π³ΠΎ ΡΡΠΎ ΠΏΠΎΠΊΡΠ΅Π½Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π΅. Π’ΠΎ Π·Π½Π°ΡΠΈ Π΄Π° ΡΠ΅ ΡΠ±Π΅Π½Π² ΠΌΠΎΡΠ°ΡΠΈ Π΄Π° ΡΠ΅ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Ρ ΠΈΡΡΠΎΡ ΡΠΊΡΠΈΠΏΡΠΈ.
Π‘Π»Π΅Π΄Π΅ΡΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΡΠ΅ Π·Π±ΠΎΠ³ ΡΠΈΡΠ΅Π½ΠΈΡΠ΅ Π΄Π° Π½Π°ΡΠ΅Π΄Π±Π° ΡΡΡΠΊΠ΅ Π½Π΅ΠΌΠ° ΡΡΠ°ΡΠ΅ ΡΠ° Π°Π½ΡΠΈΠ±Π»Π΅ ΡΠ°ΡΠΊΠ΅ Π³Π»Π΅Π΄ΠΈΡΡΠ°. ΠΠ΄Π½ΠΎΡΠ½ΠΎ, Π½Π΅ΡΠ΅ Π±ΠΈΡΠΈ Π°ΡΡΠΎΠΌΠ°ΡΡΠΊΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠ΅ Π΄Π° Π»ΠΈ ΡΠ΅ ΠΎΠ²Π° Π²Π΅ΡΠ·ΠΈΡΠ° ΡΡΠ±ΠΈ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π° ΠΈΠ»ΠΈ Π½Π΅. Π’ΠΎ ΠΌΠΎΠΆΠ΅ΠΌΠΎ ΡΠ°ΠΌΠΈ Π΄Π° ΡΡΠ°Π΄ΠΈΠΌΠΎ:
- 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
Π ΠΎΠΏΠ΅Ρ, Π΄ΠΎΠ΄Π°ΡΡΠ΅ Π½Π°ΡΡ ΡΠ»ΠΎΠ³Ρ ΡΡΠ±ΠΈ_ΡΠ±Π΅Π½Π² Ρ Π³Π»Π°Π²Π½Ρ ΠΊΡΠΈΠ³Ρ.
ΠΠ΅ΡΠ΅Π½Π΅ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ΅.
ΠΠ΅Π½Π΅ΡΠ°Π»Π½ΠΎ, ΠΏΠΎΠ΄Π΅ΡΠ°Π²Π°ΡΠ΅ Π±ΠΈ ΡΠ΅ ΠΌΠΎΠ³Π»ΠΎ Π·Π°Π²ΡΡΠΈΡΠΈ ΠΎΠ²Π΄Π΅. ΠΠ°ΡΠ΅, ΠΎΡΡΠ°ΡΠ΅ ΡΠ°ΠΌΠΎ Π΄Π° ΠΏΠΎΠΊΡΠ΅Π½Π΅ΡΠ΅ ΡΠ°ΠΏΠΈΡΡΡΠ°Π½ΠΎ ΠΈ ΠΎΠ½ ΡΠ΅ ΡΠ°ΠΌ ΠΊΠΎΠΏΠΈΡΠ°ΡΠΈ ΠΊΠΎΠ΄, ΠΊΡΠ΅ΠΈΡΠ°ΡΠΈ ΠΏΠΎΡΡΠ΅Π±Π½Π΅ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠΌΠ΅ ΠΈ ΠΏΠΎΠΊΡΠ΅Π½ΡΡΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΡ (Π°ΠΊΠΎ ΡΠ΅ ΡΠ²Π΅ ΠΈΡΠΏΡΠ°Π²Π½ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½ΠΎ). ΠΠ΅ΡΡΡΠΈΠΌ, ΡΠ°ΠΏΠΈΡΡΡΠ°Π½ΠΎ ΡΠ΅ΡΡΠΎ Π·Π°Ρ
ΡΠ΅Π²Π° Π΄ΠΎΠ΄Π°ΡΠ½Π΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π΅ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ΅, ΠΊΠ°ΠΎ Π½ΠΏΡ database.yml
ΠΈΠ»ΠΈ .env
ΠΠΎΠ³Ρ ΡΠ΅ ΠΊΠΎΠΏΠΈΡΠ°ΡΠΈ Π±Π°Ρ ΠΊΠ°ΠΎ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ΅ ΠΈ ΡΠ°Π±Π»ΠΎΠ½ΠΈ Π·Π° Π½Π³ΠΈΠ½ΠΊ. ΠΠΎΡΡΠΎΡΠΈ ΡΠ°ΠΌΠΎ ΡΠ΅Π΄Π½Π° ΡΡΠΏΡΠΈΠ»Π½ΠΎΡΡ. ΠΡΠ΅ ΠΊΠΎΠΏΠΈΡΠ°ΡΠ° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°, ΠΏΠΎΡΡΠ΅Π±Π½ΠΎ ΡΠ΅ Π΄Π° ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ ΡΡΡΡΠΊΡΡΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠΌΠ° Π·Π° ΡΠΈΡ
, ΠΎΡΠΏΡΠΈΠ»ΠΈΠΊΠ΅ ΠΎΠ²Π°ΠΊΠΎ:
# Copy shared files for deploy
- name: Ensure shared dir
become_user: "{{ user }}"
file:
path: "{{ app_path }}/shared/config"
state: directory
Π½Π°Π²ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ°ΠΌΠΎ ΡΠ΅Π΄Π°Π½ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠΌ ΠΈ Π°Π½ΡΠΈΠ±Π»Π΅ ΡΠ΅ Π°ΡΡΠΎΠΌΠ°ΡΡΠΊΠΈ ΠΊΡΠ΅ΠΈΡΠ°ΡΠΈ ΡΠΎΠ΄ΠΈΡΠ΅ΡΡΠΊΠ΅ Π°ΠΊΠΎ ΡΠ΅ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎ.
ΠΠ½ΡΠΈΠ±Π»Π΅ ΠΠ°ΡΠ»Ρ
ΠΠ΅Ρ ΡΠΌΠΎ Π½Π°ΠΈΡΠ»ΠΈ Π½Π° ΡΠΈΡΠ΅Π½ΠΈΡΡ Π΄Π° ΠΏΡΠΎΠΌΠ΅Π½ΡΠΈΠ²Π΅ ΠΌΠΎΠ³Ρ Π΄Π° ΡΠ°Π΄ΡΠΆΠ΅ ΡΠ°ΡΠ½Π΅ ΠΏΠΎΠ΄Π°ΡΠΊΠ΅ ΠΊΠ°ΠΎ ΡΡΠΎ ΡΠ΅ ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΊΠ° Π»ΠΎΠ·ΠΈΠ½ΠΊΠ°. ΠΠΊΠΎ ΡΡΠ΅ ΠΊΡΠ΅ΠΈΡΠ°Π»ΠΈ .env
ΡΠ°ΡΠ» Π·Π° ΠΏΡΠΈΡΠ°Π²Ρ, ΠΈ database.yml
ΠΎΠ½Π΄Π° ΡΠ°ΠΊΠ²ΠΈΡ
ΠΊΡΠΈΡΠΈΡΠ½ΠΈΡ
ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ° ΠΌΠΎΡΠ° Π±ΠΈΡΠΈ ΡΠΎΡ Π²ΠΈΡΠ΅. ΠΠΈΠ»ΠΎ Π±ΠΈ Π΄ΠΎΠ±ΡΠΎ ΡΠ°ΠΊΡΠΈΡΠΈ ΠΈΡ
ΠΎΠ΄ Π·Π½Π°ΡΠΈΠΆΠ΅ΡΠ½ΠΈΡ
ΠΎΡΠΈΡΡ. Π£ ΡΡ ΡΠ²ΡΡ
Ρ ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ
Π₯Π°ΡΠ΄Π΅ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌΠΎ Π΄Π°ΡΠΎΡΠ΅ΠΊΡ Π·Π° ΠΏΡΠΎΠΌΠ΅Π½ΡΠΈΠ²Π΅ /ansible/vars/all.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-playbook -i inventory ./playbook.yml -l "staging" --ask-vault-pass
ΠΠ»ΠΈ Π½Π΅ΡΡ Π²Π°ΠΌ Π΄Π°ΡΠΈ ΡΠ΅ΠΎ ΡΠ΅ΠΊΡΡ ΠΊΡΠΈΠ³Π° ΠΈ ΡΠ»ΠΎΠ³Π°, Π½Π°ΠΏΠΈΡΠΈΡΠ΅ Π³Π° ΡΠ°ΠΌΠΈ. ΠΠ΅Ρ Π°Π½ΡΠΈΠ±Π»Π΅ ΡΠ΅ ΡΠ°ΠΊΠ°Π² - Π°ΠΊΠΎ Π½Π΅ ΡΠ°Π·ΡΠΌΠ΅ΡΠ΅ ΡΡΠ° ΡΡΠ΅Π±Π° Π΄Π° ΡΠ΅ ΡΡΠ°Π΄ΠΈ, ΠΎΠ½Π΄Π° ΡΠΎ Π½Π΅ΡΠ΅ ΡΡΠΈΠ½ΠΈΡΠΈ ΡΠΌΠ΅ΡΡΠΎ Π²Π°Ρ.
ΠΠ·Π²ΠΎΡ: Π²Π²Π².Ρ Π°Π±Ρ.ΡΠΎΠΌ