ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½Π΅ Π½Π° ΡΡŠΡ€Π²ΡŠΡ€ Π·Π° Ρ€Π°Π·ΠΏΠΎΠ»Π°Π³Π°Π½Π΅ Π½Π° Rails ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Ansible

НСотдавна Ρ‚Ρ€ΡΠ±Π²Π°ΡˆΠ΅ Π΄Π° напиша няколко Ansible playbooks, Π·Π° Π΄Π° подготвя ΡΡŠΡ€Π²ΡŠΡ€Π° Π·Π° внСдряванС Π½Π° Rails ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. И, ΠΈΠ·Π½Π΅Π½Π°Π΄Π²Π°Ρ‰ΠΎ, Π½Π΅ Π½Π°ΠΌΠ΅Ρ€ΠΈΡ… просто Ρ€ΡŠΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΠΎ ΡΡ‚ΡŠΠΏΠΊΠ° ΠΏΠΎ ΡΡ‚ΡŠΠΏΠΊΠ°. НС исках Π΄Π° ΠΊΠΎΠΏΠΈΡ€Π°ΠΌ нСчия Π΄Ρ€ΡƒΠ³Π° ΠΊΠ½ΠΈΠ³Π°, Π±Π΅Π· Π΄Π° Ρ€Π°Π·Π±ΠΈΡ€Π°ΠΌ ΠΊΠ°ΠΊΠ²ΠΎ сС случва, ΠΈ Π² ΠΊΡ€Π°ΠΉΠ½Π° смСтка Ρ‚Ρ€ΡΠ±Π²Π°ΡˆΠ΅ Π΄Π° ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π° докумСнтацията, ΡΡŠΠ±ΠΈΡ€Π°ΠΉΠΊΠΈ всичко сам. МоТС Π±ΠΈ ΠΌΠΎΠ³Π° Π΄Π° ΠΏΠΎΠΌΠΎΠ³Π½Π° Π½Π° някого Π΄Π° ускори Ρ‚ΠΎΠ·ΠΈ процСс с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Ρ‚Π°Π·ΠΈ статия.

ΠŸΡŠΡ€Π²ΠΎΡ‚ΠΎ Π½Π΅Ρ‰ΠΎ, ΠΊΠΎΠ΅Ρ‚ΠΎ трябва Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅Ρ‚Π΅ Π΅, Ρ‡Π΅ ansible Π²ΠΈ прСдоставя ΡƒΠ΄ΠΎΠ±Π΅Π½ интСрфСйс Π·Π° ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π°Π½Π΅ Π½Π° ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»Π½ΠΎ Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½ списък ΠΎΡ‚ дСйствия Π½Π° ΠΎΡ‚Π΄Π°Π»Π΅Ρ‡Π΅Π½ ΡΡŠΡ€Π²ΡŠΡ€(ΠΈ) Ρ‡Ρ€Π΅Π· SSH. Π’ΡƒΠΊ няма магия, Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° инсталиратС плъгин ΠΈ Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ внСдряванС Π½Π° Π²Π°ΡˆΠ΅Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±Π΅Π· ΠΏΡ€Π΅ΠΊΡŠΡΠ²Π°Π½Π΅ с Π΄ΠΎΠΊΠ΅Ρ€, ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ Скстри. Π—Π° Π΄Π° Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΠΊΠ½ΠΈΠ³Π°-ΠΈΠ³Ρ€Π°, трябва Π΄Π° Π·Π½Π°Π΅Ρ‚Π΅ ΠΊΠ°ΠΊΠ²ΠΎ Ρ‚ΠΎΡ‡Π½ΠΎ искатС Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ ΠΈ ΠΊΠ°ΠΊ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅. Π•Ρ‚ΠΎ Π·Π°Ρ‰ΠΎ Π½Π΅ съм Π΄ΠΎΠ²ΠΎΠ»Π΅Π½ ΠΎΡ‚ Π³ΠΎΡ‚ΠΎΠ²ΠΈ ΠΊΠ½ΠΈΠ³ΠΈ Π·Π° ΠΈΠ³Ρ€ΠΈ ΠΎΡ‚ GitHub ΠΈΠ»ΠΈ статии ΠΊΠ°Ρ‚ΠΎ: β€žΠšΠΎΠΏΠΈΡ€Π°ΠΉ ΠΈ стартирай, Ρ‰Π΅ Ρ€Π°Π±ΠΎΡ‚ΠΈ.β€œ

Какво Π½ΠΈ трябва?

ΠšΠ°ΠΊΡ‚ΠΎ Π²Π΅Ρ‡Π΅ ΠΊΠ°Π·Π°Ρ…, Π·Π° Π΄Π° Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΠΊΠ½ΠΈΠ³Π°-ΠΈΠ³Ρ€Π° трябва Π΄Π° Π·Π½Π°Π΅Ρ‚Π΅ ΠΊΠ°ΠΊΠ²ΠΎ искатС Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ ΠΈ ΠΊΠ°ΠΊ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅. Π”Π° Ρ€Π΅ΡˆΠΈΠΌ ΠΊΠ°ΠΊΠ²ΠΎ Π½ΠΈ трябва. Π—Π° Rails ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ‰Π΅ Π½ΠΈ трябват няколко систСмни ΠΏΠ°ΠΊΠ΅Ρ‚Π°: nginx, postgresql (redis ΠΈ Ρ‚.Π½.). ОсвСн Ρ‚ΠΎΠ²Π° сС Π½ΡƒΠΆΠ΄Π°Π΅ΠΌ ΠΎΡ‚ спСцифична вСрсия Π½Π° ruby. Най-Π΄ΠΎΠ±Ρ€Π΅ Π΅ Π΄Π° Π³ΠΎ инсталиратС Ρ‡Ρ€Π΅Π· rbenv (rvm, asdf...). Π˜Π·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° всичко Ρ‚ΠΎΠ²Π° ΠΊΠ°Ρ‚ΠΎ root ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π» Π²ΠΈΠ½Π°Π³ΠΈ Π΅ лоша идСя, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ трябва Π΄Π° ΡΡŠΠ·Π΄Π°Π΄Π΅Ρ‚Π΅ ΠΎΡ‚Π΄Π΅Π»Π΅Π½ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π» ΠΈ Π΄Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Ρ‚Π΅ Π½Π΅Π³ΠΎΠ²ΠΈΡ‚Π΅ ΠΏΡ€Π°Π²Π°. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° трябва Π΄Π° ΠΊΠ°Ρ‡ΠΈΡ‚Π΅ нашия ΠΊΠΎΠ΄ Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π°, Π΄Π° ΠΊΠΎΠΏΠΈΡ€Π°Ρ‚Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈΡ‚Π΅ Π·Π° nginx, postgres ΠΈ Ρ‚.Π½. ΠΈ Π΄Π° стартиратС всички Ρ‚Π΅Π·ΠΈ услуги.

Π’ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ²Π° послСдоватСлността ΠΎΡ‚ дСйствия Π΅ слСдната:

  1. Π’Π»Π΅Π·Ρ‚Π΅ ΠΊΠ°Ρ‚ΠΎ root
  2. инсталирайтС систСмни ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ
  3. ΡΡŠΠ·Π΄Π°ΠΉΡ‚Π΅ Π½ΠΎΠ² ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π», ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°ΠΉΡ‚Π΅ ΠΏΡ€Π°Π²Π°, ssh ΠΊΠ»ΡŽΡ‡
  4. ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°ΠΉΡ‚Π΅ систСмни ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ (nginx ΠΈ Ρ‚.Π½.) ΠΈ Π³ΠΈ стартирайтС
  5. БъздавамС ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π» Π² Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ (ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Π΅Π΄Π½Π°Π³Π° Π΄Π° ΡΡŠΠ·Π΄Π°Π΄Π΅Ρ‚Π΅ Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ)
  6. Π’Π»Π΅Π·Ρ‚Π΅ ΠΊΠ°Ρ‚ΠΎ Π½ΠΎΠ² ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»
  7. Π˜Π½ΡΡ‚Π°Π»ΠΈΡ€Π°ΠΉΡ‚Π΅ rbenv ΠΈ ruby
  8. Π˜Π½ΡΡ‚Π°Π»ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚Π°
  9. ΠšΠ°Ρ‡Π²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ΄Π° Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ
  10. Π‘Ρ‚Π°Ρ€Ρ‚ΠΈΡ€Π°Π½Π΅ Π½Π° Puma ΡΡŠΡ€Π²ΡŠΡ€

ОсвСн Ρ‚ΠΎΠ²Π°, послСднитС Π΅Ρ‚Π°ΠΏΠΈ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ Π½Π°ΠΏΡ€Π°Π²Π΅Π½ΠΈ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° capistrano, ΠΏΠΎΠ½Π΅ извън кутията Ρ‚ΠΎΠΉ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΊΠΎΠΏΠΈΡ€Π° ΠΊΠΎΠ΄ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ Π·Π° ΠΈΠ·Π΄Π°Π²Π°Π½Π΅, Π΄Π° ΠΏΡ€Π΅Π²ΠΊΠ»ΡŽΡ‡Π²Π° ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Ρ‚ΠΎ със символна Π²Ρ€ΡŠΠ·ΠΊΠ° ΠΏΡ€ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Ρ€Π°Π·Π³Ρ€ΡŠΡ‰Π°Π½Π΅, Π΄Π° ΠΊΠΎΠΏΠΈΡ€Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΎΡ‚ сподСлСна дирСктория, Π΄Π° рСстартира puma ΠΈ Ρ‚.Π½. Всичко Ρ‚ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π½Π°ΠΏΡ€Π°Π²ΠΈ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Ansible, Π½ΠΎ Π·Π°Ρ‰ΠΎ?

Π€Π°ΠΉΠ»ΠΎΠ²Π° структура

Ansible ΠΈΠΌΠ° строг Ρ„Π°ΠΉΠ»ΠΎΠ²Π° структура Π·Π° всички ваши Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ Π΅ Π½Π°ΠΉ-Π΄ΠΎΠ±Ρ€Π΅ Π΄Π° Π³ΠΈ ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°Ρ‚Π΅ Π² ΠΎΡ‚Π΄Π΅Π»Π½Π° дирСктория. ОсвСн Ρ‚ΠΎΠ²Π° Π½Π΅ Π΅ Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π° Π²Π°ΠΆΠ½ΠΎ Π΄Π°Π»ΠΈ Ρ‰Π΅ бъдС Π² самото ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° рСлситС ΠΈΠ»ΠΈ ΠΎΡ‚Π΄Π΅Π»Π½ΠΎ. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°Ρ‚Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ Π² ΠΎΡ‚Π΄Π΅Π»Π½ΠΎ git Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅. Π›ΠΈΡ‡Π½ΠΎ Π°Π· Π½Π°ΠΌΠ΅Ρ€ΠΈΡ… Π·Π° Π½Π°ΠΉ-ΡƒΠ΄ΠΎΠ±Π½ΠΎ Π΄Π° създам ansible дирСктория Π² /config дирСкторията Π½Π° rails ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΈ Π΄Π° ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°ΠΌ всичко Π² Π΅Π΄Π½ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅.

ΠŸΡ€ΠΎΡΡ‚Π° ΠΊΠ½ΠΈΠ³Π° Π·Π° ΠΈΠ³Ρ€Π°

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

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€