ΠŸΠΎΡΡ‚Π°Π²ΡƒΠ²Π°ΡšΠ΅ сСрвСр Π·Π° Ρ€Π°ΡΠΏΠΎΡ€Π΅Π΄ΡƒΠ²Π°ΡšΠ΅ Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° Rails со помош Π½Π° Ansible

НСодамна ΠΌΠΈ Ρ‚Ρ€Π΅Π±Π°ΡˆΠ΅ Π΄Π° напишам Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ Ansible Playbook Π·Π° Π΄Π° Π³ΠΎ ΠΏΠΎΠ΄Π³ΠΎΡ‚Π²Π°ΠΌ сСрвСрот Π·Π° Ρ€Π°ΡΠΏΠΎΡ€Π΅Π΄ΡƒΠ²Π°ΡšΠ΅ Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° Rails. И, ΠΈΠ·Π½Π΅Π½Π°Π΄ΡƒΠ²Π°Ρ‡ΠΊΠΈ, Π½Π΅ најдов СдноставСн ΠΏΡ€ΠΈΡ€Π°Ρ‡Π½ΠΈΠΊ Ρ‡Π΅ΠΊΠΎΡ€-ΠΏΠΎ-Ρ‡Π΅ΠΊΠΎΡ€. НС сакав Π΄Π° ΠΊΠΎΠΏΠΈΡ€Π°ΠΌ Ρ‚ΡƒΡ“Π° ΠΊΠ½ΠΈΠ³Π° Π±Π΅Π· Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π°ΠΌ ΡˆΡ‚ΠΎ сС случува, ΠΈ Π½Π° ΠΊΡ€Π°Ρ˜ΠΎΡ‚ ΠΌΠΎΡ€Π°Π² Π΄Π° ја ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°ΠΌ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π°Ρ‚Π°, ΡΠΎΠ±ΠΈΡ€Π°Ρ˜ΡœΠΈ сè сам. МоТСби ΠΌΠΎΠΆΠ°ΠΌ Π΄Π° ΠΏΠΎΠΌΠΎΠ³Π½Π°ΠΌ Π½Π΅ΠΊΠΎΠΌΡƒ Π΄Π° Π³ΠΎ Π·Π°Π±Ρ€Π·Π° овој процСс со помош Π½Π° ΠΎΠ²Π°Π° ΡΡ‚Π°Ρ‚ΠΈΡ˜Π°.

ΠŸΡ€Π²ΠΎΡ‚ΠΎ Π½Π΅ΡˆΡ‚ΠΎ ΡˆΡ‚ΠΎ Ρ‚Ρ€Π΅Π±Π° Π΄Π° сС Ρ€Π°Π·Π±Π΅Ρ€Π΅ Π΅ Π΄Π΅ΠΊΠ° ansible Π²ΠΈ ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡƒΠ²Π° ΡƒΠ΄ΠΎΠ±Π΅Π½ ΠΈΠ½Ρ‚Π΅Ρ€Ρ„Π΅Ρ˜Ρ Π·Π° ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΏΡ€Π΅Ρ‚Ρ…ΠΎΠ΄Π½ΠΎ Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½Π° листа Π½Π° Π΄Π΅Ρ˜ΡΡ‚Π²Π° Π½Π° ΠΎΠ΄Π΄Π°Π»Π΅Ρ‡Π΅Π½ сСрвСр(ΠΈ) ΠΏΡ€Π΅ΠΊΡƒ SSH. НСма магија ΠΎΠ²Π΄Π΅, Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° инсталиратС ΠΏΡ€ΠΈΠΊΠ»ΡƒΡ‡ΠΎΠΊ ΠΈ Π΄Π° Π΄ΠΎΠ±ΠΈΠ΅Ρ‚Π΅ Π½ΡƒΠ»Π° ΠΏΡ€Π΅ΠΊΠΈΠ½ Π½Π° Ρ€Π°ΡΠΏΠΎΡ€Π΅Π΄ΡƒΠ²Π°ΡšΠ΅ Π½Π° Π²Π°ΡˆΠ°Ρ‚Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° со Π΄ΠΎΠΊΠ΅Ρ€, ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ Π΄ΠΎΠ±Ρ€ΠΈΠ½ΠΈ Π½Π°Π΄Π²ΠΎΡ€ ΠΎΠ΄ ΠΊΡƒΡ‚ΠΈΡ˜Π°Ρ‚Π°. Π—Π° Π΄Π° Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΠΊΠ½ΠΈΠ³Π° Π·Π° ΠΈΠ³Ρ€ΠΈ, ΠΌΠΎΡ€Π° Π΄Π° Π·Π½Π°Π΅Ρ‚Π΅ ΡˆΡ‚ΠΎ Ρ‚ΠΎΡ‡Π½ΠΎ сакатС Π΄Π° ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ ΠΈ ΠΊΠ°ΠΊΠΎ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ Ρ‚ΠΎΠ°. Π—Π°Ρ‚ΠΎΠ° Π½Π΅ сум Π·Π°Π΄ΠΎΠ²ΠΎΠ»Π΅Π½ со Π³ΠΎΡ‚ΠΎΠ²ΠΈ ΠΊΠ½ΠΈΠ³ΠΈ Π·Π° ΠΈΠ³Ρ€Π°ΡšΠ΅ ΠΎΠ΄ GitHub ΠΈΠ»ΠΈ написи ΠΊΠ°ΠΊΠΎ: β€žΠšΠΎΠΏΠΈΡ€Π°Ρ˜ ΠΈ ΡΡ‚Π°Ρ€Ρ‚ΡƒΠ²Π°Ρ˜, ќС Ρ€Π°Π±ΠΎΡ‚ΠΈβ€œ.

Π¨Ρ‚ΠΎ Π½ΠΈ Ρ‚Ρ€Π΅Π±Π°?

Како ΡˆΡ‚ΠΎ вСќС Ρ€Π΅ΠΊΠΎΠ², Π·Π° Π΄Π° Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΠΊΠ½ΠΈΠ³Π° Π·Π° ΠΈΠ³Ρ€ΠΈ Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π·Π½Π°Π΅Ρ‚Π΅ ΡˆΡ‚ΠΎ сакатС Π΄Π° ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ ΠΈ ΠΊΠ°ΠΊΠΎ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ Ρ‚ΠΎΠ°. АјдС Π΄Π° ΠΎΠ΄Π»ΡƒΡ‡ΠΈΠΌΠ΅ ΡˆΡ‚ΠΎ Π½ΠΈ Ρ‚Ρ€Π΅Π±Π°. Π—Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Π½Π° Rails ќС Π½ΠΈ Ρ‚Ρ€Π΅Π±Π°Π°Ρ‚ Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ систСмски ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ: nginx, postgresql (redis, ΠΈΡ‚Π½.). ΠŸΠΎΠΊΡ€Π°Ρ˜ Ρ‚ΠΎΠ°, Π½ΠΈ Ρ‚Ρ€Π΅Π±Π° спСцифична Π²Π΅Ρ€Π·ΠΈΡ˜Π° Π½Π° Ρ€ΡƒΠ±ΠΈΠ½. ΠΠ°Ρ˜Π΄ΠΎΠ±Ρ€ΠΎ Π΅ Π΄Π° Π³ΠΎ инсталиратС ΠΏΡ€Π΅ΠΊΡƒ rbenv (rvm, asdf...). Π˜Π·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° сСто ΠΎΠ²Π° ΠΊΠ°ΠΊΠΎ root корисник Π΅ сСкогаш лоша идСја, ΠΏΠ° Π·Π°Ρ‚ΠΎΠ° Ρ‚Ρ€Π΅Π±Π° Π΄Π° ΠΊΡ€Π΅ΠΈΡ€Π°Ρ‚Π΅ посСбСн корисник ΠΈ Π΄Π° Π³ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Ρ‚Π΅ Π½Π΅Π³ΠΎΠ²ΠΈΡ‚Π΅ ΠΏΡ€Π°Π²Π°. ПослС ΠΎΠ²Π°, Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π³ΠΎ поставитС Π½Π°ΡˆΠΈΠΎΡ‚ ΠΊΠΎΠ΄ Π½Π° сСрвСрот, Π΄Π° Π³ΠΈ ΠΊΠΎΠΏΠΈΡ€Π°Ρ‚Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈΡ‚Π΅ Π·Π° nginx, postgres ΠΈΡ‚Π½ ΠΈ Π΄Π° Π³ΠΈ стартуватС ситС ΠΎΠ²ΠΈΠ΅ услуги.

Како Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ°, рСдослСдот Π½Π° Π΄Π΅Ρ˜ΡΡ‚Π²Π°Ρ‚Π° Π΅ ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ слСдува:

  1. ΠΠ°Ρ˜Π°Π²Π΅Ρ‚Π΅ сС ΠΊΠ°ΠΊΠΎ root
  2. ΠΈΠ½ΡΡ‚Π°Π»ΠΈΡ€Π°Ρ˜Ρ‚Π΅ систСмски ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ
  3. ΠΊΡ€Π΅ΠΈΡ€Π°Ρ˜Ρ‚Π΅ Π½ΠΎΠ² корисник, ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Ρ˜Ρ‚Π΅ ΠΏΡ€Π°Π²Π°, ΠΊΠ»ΡƒΡ‡ ssh
  4. ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Ρ˜Ρ‚Π΅ систСмски ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ (nginx ΠΈΡ‚Π½) ΠΈ ΡΡ‚Π°Ρ€Ρ‚ΡƒΠ²Π°Ρ˜Ρ‚Π΅ Π³ΠΈ
  5. НиС создавамС корисник Π²ΠΎ Π±Π°Π·Π°Ρ‚Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ (ΠΌΠΎΠΆΠ΅Ρ‚Π΅ вСднаш Π΄Π° ΠΊΡ€Π΅ΠΈΡ€Π°Ρ‚Π΅ Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ)
  6. ΠΠ°Ρ˜Π°Π²Π΅Ρ‚Π΅ сС ΠΊΠ°ΠΊΠΎ Π½ΠΎΠ² корисник
  7. Π˜Π½ΡΡ‚Π°Π»ΠΈΡ€Π°Ρ˜Ρ‚Π΅ rbenv ΠΈ Ρ€ΡƒΠ±ΠΈΠ½
  8. Π˜Π½ΡΡ‚Π°Π»ΠΈΡ€Π°ΡšΠ΅ Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΡ‚
  9. ΠŸΠΎΡΡ‚Π°Π²ΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΊΠΎΠ΄ΠΎΡ‚ Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π°
  10. Π‘Ρ‚Π°Ρ€Ρ‚ΡƒΠ²Π°ΡšΠ΅ Π½Π° сСрвСрот Puma

ΠŸΠΎΠΊΡ€Π°Ρ˜ Ρ‚ΠΎΠ°, послСднитС Ρ„Π°Π·ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π½Π°ΠΏΡ€Π°Π²Π°Ρ‚ со ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° capistrano, Π±Π°Ρ€Π΅ΠΌ Π½Π°Π΄Π²ΠΎΡ€ ΠΎΠ΄ ΠΊΡƒΡ‚ΠΈΡ˜Π°Ρ‚Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π³ΠΎ ΠΊΠΎΠΏΠΈΡ€Π° ΠΊΠΎΠ΄ΠΎΡ‚ Π²ΠΎ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡƒΠΌΠΈΡ‚Π΅ Π·Π° издавањС, Π΄Π° Π³ΠΎ ΠΏΡ€Π΅Ρ„Ρ€Π»ΠΈ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Ρ‚ΠΎ со символик ΠΏΠΎ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΡ‚ΠΎ Ρ€Π°ΡΠΏΠΎΡ€Π΅Π΄ΡƒΠ²Π°ΡšΠ΅, Π΄Π° ΠΊΠΎΠΏΠΈΡ€Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΎΠ΄ сподСлСн Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡƒΠΌ, Π΄Π° ја рСстартира puma ΠΈΡ‚Π½. Π‘Π΅Ρ‚ΠΎ ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π½Π°ΠΏΡ€Π°Π²ΠΈ со помош Π½Π° Ansible, Π½ΠΎ Π·ΠΎΡˆΡ‚ΠΎ?

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Π½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°

Ansible ΠΈΠΌΠ° строги структура Π½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° Π·Π° ситС ваши Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ, ΠΏΠ° Π·Π°Ρ‚ΠΎΠ° Π΅ Π½Π°Ρ˜Π΄ΠΎΠ±Ρ€ΠΎ Π΄Π° сС Ρ‡ΡƒΠ²Π° сСто Ρ‚ΠΎΠ° Π²ΠΎ посСбСн Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡƒΠΌ. ΠŸΠΎΠΊΡ€Π°Ρ˜ Ρ‚ΠΎΠ°, Π½Π΅ Π΅ Ρ‚ΠΎΠ»ΠΊΡƒ Π²Π°ΠΆΠ½ΠΎ Π΄Π°Π»ΠΈ ќС Π±ΠΈΠ΄Π΅ Π²ΠΎ самата Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Π·Π° шини ΠΈΠ»ΠΈ ΠΎΠ΄Π΄Π΅Π»Π½ΠΎ. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° складиратС Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ Π²ΠΎ посСбно ΡΠΊΠ»Π°Π΄ΠΈΡˆΡ‚Π΅ Π·Π° git. Π›ΠΈΡ‡Π½ΠΎ, најпогодно ΠΌΠΈ бСшС Π΄Π° создадам ансибилСн Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡƒΠΌ Π²ΠΎ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡƒΠΌΠΎΡ‚ /config Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° rails ΠΈ Π΄Π° складирам сè Π²ΠΎ Π΅Π΄Π½ΠΎ ΡΠΊΠ»Π°Π΄ΠΈΡˆΡ‚Π΅.

Едноставна Playbook

Playbook Π΅ yml-Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° која, ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ ΡΠΏΠ΅Ρ†ΠΈΡ˜Π°Π»Π½Π° синтакса, ΠΎΠΏΠΈΡˆΡƒΠ²Π° ΡˆΡ‚ΠΎ Ρ‚Ρ€Π΅Π±Π° Π΄Π° ΠΏΡ€Π°Π²ΠΈ Ansible ΠΈ ΠΊΠ°ΠΊΠΎ. АјдС Π΄Π° ја создадСмС ΠΏΡ€Π²Π°Ρ‚Π° ΠΊΠ½ΠΈΠ³Π° Π·Π° ΠΈΠ³Ρ€ΠΈ ΡˆΡ‚ΠΎ Π½Π΅ ΠΏΡ€Π°Π²ΠΈ Π½ΠΈΡˆΡ‚ΠΎ:

---
- name: Simple playbook
  hosts: all

ОвдС Сдноставно Π²Π΅Π»ΠΈΠΌΠ΅ Π΄Π΅ΠΊΠ° Π½Π°ΡˆΠ°Ρ‚Π° ΠΈΠ³Ρ€ΠΎΡ‚Π΅ΠΊΠ° сС Π²ΠΈΠΊΠ° Simple Playbook ΠΈ Π΄Π΅ΠΊΠ° Π½Π΅Π³ΠΎΠ²Π°Ρ‚Π° содрТина Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π±ΠΈΠ΄Π΅ ΠΈΠ·Π²Ρ€ΡˆΠ΅Π½Π° Π·Π° ситС хостови. МоТСмС Π΄Π° Π³ΠΎ Π·Π°Ρ‡ΡƒΠ²Π°ΠΌΠ΅ Π²ΠΎ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡƒΠΌΠΎΡ‚ /ansible со ΠΈΠΌΠ΅Ρ‚ΠΎ playbook.yml ΠΈ ΠΎΠ±ΠΈΠ΄Π΅Ρ‚Π΅ сС Π΄Π° Ρ‚Ρ€Ρ‡Π°Ρ‚Π΅:

ansible-playbook ./playbook.yml

PLAY [Simple Playbook] ************************************************************************************************************************************
skipping: no hosts matched

Ansible Π²Π΅Π»ΠΈ Π΄Π΅ΠΊΠ° Π½Π΅ ΠΏΠΎΠ·Π½Π°Π²Π° домаќини ΡˆΡ‚ΠΎ ΠΎΠ΄Π³ΠΎΠ²Π°Ρ€Π°Π°Ρ‚ Π½Π° ситС список. Π’ΠΈΠ΅ ΠΌΠΎΡ€Π° Π΄Π° Π±ΠΈΠ΄Π°Ρ‚ Π½Π°Π²Π΅Π΄Π΅Π½ΠΈ Π²ΠΎ посСбСн ΠΈΠ½Π²Π΅Π½Ρ‚Π°Ρ€ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°.

АјдС Π΄Π° Π³ΠΎ создадСмС Π²ΠΎ истиот Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡƒΠΌ:

123.123.123.123

Π’Π°ΠΊΠ° Сдноставно Π³ΠΎ ΠΎΠ΄Ρ€Π΅Π΄ΡƒΠ²Π°ΠΌΠ΅ Π΄ΠΎΠΌΠ°ΡœΠΈΠ½ΠΎΡ‚ (ΠΈΠ΄Π΅Π°Π»Π½ΠΎ Π΄ΠΎΠΌΠ°ΡœΠΈΠ½ΠΎΡ‚ Π½Π° Π½Π°ΡˆΠΈΠΎΡ‚ VPS Π·Π° Ρ‚Π΅ΡΡ‚ΠΈΡ€Π°ΡšΠ΅, ΠΈΠ»ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° рСгистриратС localhost) ΠΈ Π³ΠΎ Π·Π°Ρ‡ΡƒΠ²ΡƒΠ²Π°ΠΌΠ΅ ΠΏΠΎΠ΄ ΠΈΠΌΠ΅Ρ‚ΠΎ inventory.
МоТС Π΄Π° сС ΠΎΠ±ΠΈΠ΄Π΅Ρ‚Π΅ Π΄Π° ΠΈΠ·Π²Ρ€ΡˆΠΈΡ‚Π΅ ansible со Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° со запис:

ansible-playbook ./playbook.yml -i inventory
PLAY [Simple Playbook] ************************************************************************************************************************************

TASK [Gathering Facts] ************************************************************************************************************************************

PLAY RECAP ************************************************************************************************************************************

Ако ΠΈΠΌΠ°Ρ‚Π΅ ssh пристап Π΄ΠΎ Π½Π°Π²Π΅Π΄Π΅Π½ΠΈΠΎΡ‚ хост, Ρ‚ΠΎΠ³Π°Ρˆ ansible ќС сС ΠΏΠΎΠ²Ρ€Π·Π΅ ΠΈ собира ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π·Π° далСчинскиот систСм. (стандардна ЗАДАЧА [Π‘ΠΎΠ±ΠΈΡ€Π°ΡšΠ΅ Ρ„Π°ΠΊΡ‚ΠΈ]) ΠΏΠΎ ΡˆΡ‚ΠΎ ќС Π΄Π°Π΄Π΅ ΠΊΡ€Π°Ρ‚ΠΎΠΊ ΠΈΠ·Π²Π΅ΡˆΡ‚Π°Ρ˜ Π·Π° ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ (PLAY RECAP).

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Π΄Π½ΠΎ, врската Π³ΠΎ користи корисничкото ΠΈΠΌΠ΅ ΠΏΠΎΠ΄ ΠΊΠΎΠ΅ стС најавСни Π½Π° систСмот. ΠΠ°Ρ˜Π²Π΅Ρ€ΠΎΡ˜Π°Ρ‚Π½ΠΎ Π½Π΅ΠΌΠ° Π΄Π° Π±ΠΈΠ΄Π΅ Π½Π° Π΄ΠΎΠΌΠ°ΡœΠΈΠ½ΠΎΡ‚. Π’ΠΎ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° Playbook, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΎΠ΄Ρ€Π΅Π΄ΠΈΡ‚Π΅ кој корисник Π΄Π° сС користи Π·Π° ΠΏΠΎΠ²Ρ€Π·ΡƒΠ²Π°ΡšΠ΅ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ ја Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π°Ρ‚Π° remote_user. Π˜ΡΡ‚ΠΎ Ρ‚Π°ΠΊΠ°, ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈΡ‚Π΅ Π·Π° далСчинскиот систСм чСстопати ΠΌΠΎΠΆΠ΅ Π΄Π° Π²ΠΈ Π±ΠΈΠ΄Π°Ρ‚ Π½Π΅ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΈ ΠΈ Π½Π΅ Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π³ΡƒΠ±ΠΈΡ‚Π΅ Π²Ρ€Π΅ΠΌΠ΅ ΡΠΎΠ±ΠΈΡ€Π°Ρ˜ΡœΠΈ Π³ΠΈ. Оваа Π·Π°Π΄Π°Ρ‡Π° исто Ρ‚Π°ΠΊΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΎΠ½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠΈ:

---
- name: Simple playbook
  hosts: all
  remote_user: root
  become: true
  gather_facts: no

ΠžΠ±ΠΈΠ΄Π΅Ρ‚Π΅ сС ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Π΄Π° ја стартуватС Playbook ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Ρ‚Π΅ Π΄Π°Π»ΠΈ врската Ρ€Π°Π±ΠΎΡ‚ΠΈ. (Ако стС Π³ΠΎ Π½Π°Π²Π΅Π»Π΅ root корисникот, Ρ‚ΠΎΠ³Π°Ρˆ Ρ‚Ρ€Π΅Π±Π° Π΄Π° ја Π½Π°Π²Π΅Π΄Π΅Ρ‚Π΅ ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π°Ρ‚Π° станС: вистинска Π·Π° Π΄Π° стСкнСтС Π·Π³ΠΎΠ»Π΅ΠΌΠ΅Π½ΠΈ ΠΏΡ€Π°Π²Π°. Како ΡˆΡ‚ΠΎ Π΅ напишано Π²ΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π°Ρ‚Π°: become set to β€˜true’/’yes’ to activate privilege escalation. ΠΈΠ°ΠΊΠΎ Π½Π΅ Π΅ сосСма јасно Π·ΠΎΡˆΡ‚ΠΎ).

МоТСби ќС Π΄ΠΎΠ±ΠΈΠ΅Ρ‚Π΅ Π³Ρ€Π΅ΡˆΠΊΠ° ΠΏΡ€Π΅Π΄ΠΈΠ·Π²ΠΈΠΊΠ°Π½Π° ΠΎΠ΄ Ρ„Π°ΠΊΡ‚ΠΎΡ‚ Π΄Π΅ΠΊΠ° ansible Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π³ΠΎ ΠΎΠ΄Ρ€Π΅Π΄ΠΈ Ρ‚ΠΎΠ»ΠΊΡƒΠ²Π°Ρ‡ΠΎΡ‚ Π½Π° Python, Ρ‚ΠΎΠ³Π°Ρˆ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π°Ρ‡Π½ΠΎ Π΄Π° Π³ΠΎ Π½Π°Π²Π΅Π΄Π΅Ρ‚Π΅:

ansible_python_interpreter: /usr/bin/python3 

ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π΄ΠΎΠ·Π½Π°Π΅Ρ‚Π΅ ΠΊΠ°Π΄Π΅ ΠΈΠΌΠ°Ρ‚Π΅ python со ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° whereis python.

Π˜Π½ΡΡ‚Π°Π»ΠΈΡ€Π°ΡšΠ΅ систСмски ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Π΄Π½Π°Ρ‚Π° Π΄ΠΈΡΡ‚Ρ€ΠΈΠ±ΡƒΡ†ΠΈΡ˜Π° Π½Π° Ansible Π²ΠΊΠ»ΡƒΡ‡ΡƒΠ²Π° ΠΌΠ½ΠΎΠ³Ρƒ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° со Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ систСмски ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ, Ρ‚Π°ΠΊΠ° ΡˆΡ‚ΠΎ Π½Π΅ ΠΌΠΎΡ€Π° Π΄Π° ΠΏΠΈΡˆΡƒΠ²Π°ΠΌΠ΅ баш скрипти ΠΎΠ΄ која Π±ΠΈΠ»ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°. Π‘Π΅Π³Π° Π½ΠΈ Ρ‚Ρ€Π΅Π±Π° Π΅Π΄Π΅Π½ ΠΎΠ΄ ΠΎΠ²ΠΈΠ΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π·Π° Π΄Π° Π³ΠΎ Π°ΠΆΡƒΡ€ΠΈΡ€Π°ΠΌΠ΅ систСмот ΠΈ Π΄Π° инсталирамС систСмски ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ. Имам Ubuntu Linux Π½Π° ΠΌΠΎΡ˜ΠΎΡ‚ VPS, ΠΏΠ° Π·Π° Π΄Π° инсталирам ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ користам apt-get ΠΈ ΠΌΠΎΠ΄ΡƒΠ» Π·Π° Ρ‚ΠΎΠ°. Ако користитС Ρ€Π°Π·Π»ΠΈΡ‡Π΅Π½ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π΅Π½ систСм, Ρ‚ΠΎΠ³Π°Ρˆ ΠΌΠΎΠΆΠ΅Π±ΠΈ ќС Π²ΠΈ Ρ‚Ρ€Π΅Π±Π° Π΄Ρ€ΡƒΠ³ ΠΌΠΎΠ΄ΡƒΠ» (Π·Π°ΠΏΠΎΠΌΠ½Π΅Ρ‚Π΅, Π½Π° ΠΏΠΎΡ‡Π΅Ρ‚ΠΎΠΊΠΎΡ‚ Ρ€Π΅ΠΊΠΎΠ² Π΄Π΅ΠΊΠ° Ρ‚Ρ€Π΅Π±Π° ΠΎΠ΄Π½Π°ΠΏΡ€Π΅Π΄ Π΄Π° Π·Π½Π°Π΅ΠΌΠ΅ ΡˆΡ‚ΠΎ ΠΈ ΠΊΠ°ΠΊΠΎ ќС ΠΏΡ€Π°Π²ΠΈΠΌΠ΅). Π‘Π΅ΠΏΠ°ΠΊ, синтаксата Π½Π°Ρ˜Π²Π΅Ρ€ΠΎΡ˜Π°Ρ‚Π½ΠΎ ќС Π±ΠΈΠ΄Π΅ слична.

АјдС Π΄Π° ја Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΠΌΠ΅ Π½Π°ΡˆΠ°Ρ‚Π° ΠΈΠ³Ρ€ΠΎΡ‚Π΅ΠΊΠ° со ΠΏΡ€Π²ΠΈΡ‚Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ:

---
- name: Simple playbook
  hosts: all
  remote_user: root
  become: true
  gather_facts: no

  tasks:
    - name: Update system
      apt: update_cache=yes
    - name: Install system dependencies
      apt:
        name: git,nginx,redis,postgresql,postgresql-contrib
        state: present

Task Π΅ Ρ‚ΠΎΠΊΠΌΡƒ Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π° ΡˆΡ‚ΠΎ Ansible ќС ја ΠΈΠ·Π²Ρ€ΡˆΠΈ Π½Π° ΠΎΠ΄Π΄Π°Π»Π΅Ρ‡Π΅Π½ΠΈΡ‚Π΅ сСрвСри. На Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π° ΠΈ Π΄Π°Π²Π°ΠΌΠ΅ ΠΈΠΌΠ΅ Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π³ΠΎ слСдимС Π½Π΅Ρ˜Π·ΠΈΠ½ΠΎΡ‚ΠΎ ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅ Π²ΠΎ Π΄Π½Π΅Π²Π½ΠΈΠΊΠΎΡ‚. И Π½ΠΈΠ΅ ΠΎΠΏΠΈΡˆΡƒΠ²Π°ΠΌΠ΅, ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ ја синтаксата Π½Π° ΠΎΠ΄Ρ€Π΅Π΄Π΅Π½ ΠΌΠΎΠ΄ΡƒΠ», ΡˆΡ‚ΠΎ Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈ. Π’ΠΎ овој ΡΠ»ΡƒΡ‡Π°Ρ˜ apt: update_cache=yes - Π²Π΅Π»ΠΈ Π·Π° Π°ΠΆΡƒΡ€ΠΈΡ€Π°ΡšΠ΅ Π½Π° систСмскитС ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Π³ΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΠΎΡ‚ apt. Π’Ρ‚ΠΎΡ€Π°Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° Π΅ ΠΌΠ°Π»ΠΊΡƒ ΠΏΠΎΠΊΠΎΠΌΠΏΠ»ΠΈΡ†ΠΈΡ€Π°Π½Π°. Π”ΠΎΠ΄Π°Π²Π°ΠΌΠ΅ листа Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ Π½Π° apt ΠΌΠΎΠ΄ΡƒΠ»ΠΎΡ‚ ΠΈ Π²Π΅Π»ΠΈΠΌΠ΅ Π΄Π΅ΠΊΠ° сС state Ρ‚Ρ€Π΅Π±Π° Π΄Π° станС present, односно Π²Π΅Π»ΠΈΠΌΠ΅ Π΄Π° Π³ΠΈ инсталирамС ΠΎΠ²ΠΈΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ. На сличСн Π½Π°Ρ‡ΠΈΠ½, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΠΈΠΌ ΠΊΠ°ΠΆΠ΅ΠΌΠ΅ Π΄Π° Π³ΠΈ ΠΈΠ·Π±Ρ€ΠΈΡˆΠ°Ρ‚ ΠΈΠ»ΠΈ Π΄Π° Π³ΠΈ Π°ΠΆΡƒΡ€ΠΈΡ€Π°ΠΌΠ΅ со Сдноставно ΠΌΠ΅Π½ΡƒΠ²Π°ΡšΠ΅ state. Π’Π΅ ΠΌΠΎΠ»ΠΈΠΌΠ΅ ΠΈΠΌΠ°Ρ˜Ρ‚Π΅ ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄ Π΄Π΅ΠΊΠ° Π·Π° ΡˆΠΈΠ½ΠΈΡ‚Π΅ Π΄Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ со postgresql Π½ΠΈ Ρ‚Ρ€Π΅Π±Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΡ‚ postgresql-contrib, кој Π³ΠΎ инсталирамС сСга. ΠŸΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ, Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π³ΠΎ Π·Π½Π°Π΅Ρ‚Π΅ ΠΈ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ ΠΎΠ²Π°; Ρ€Π°Π·ΡƒΠΌΠ½ΠΈΠΎΡ‚ сам ΠΏΠΎ сСбС Π½Π΅ΠΌΠ° Π΄Π° Π³ΠΎ стори Ρ‚ΠΎΠ°.

ΠžΠ±ΠΈΠ΄Π΅Ρ‚Π΅ сС ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Π΄Π° ја стартуватС Playbook ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Ρ‚Π΅ Π΄Π°Π»ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈΡ‚Π΅ сС инсталирани.

БоздавањС Π½ΠΎΠ²ΠΈ корисници.

Π—Π° Ρ€Π°Π±ΠΎΡ‚Π° со корисници, Ansible ΠΈΠΌΠ° ΠΈ ΠΌΠΎΠ΄ΡƒΠ» - корисник. АјдС Π΄Π° Π΄ΠΎΠ΄Π°Π΄Π΅ΠΌΠ΅ ΡƒΡˆΡ‚Π΅ Π΅Π΄Π½Π° Π·Π°Π΄Π°Ρ‡Π° (ΠΏΠΎΠ·Π°Π΄ΠΈ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΡ‚Π΅ Π³ΠΈ скрив вСќС ΠΏΠΎΠ·Π½Π°Ρ‚ΠΈΡ‚Π΅ Π΄Π΅Π»ΠΎΠ²ΠΈ ΠΎΠ΄ ΠΊΠ½ΠΈΠ³Π°Ρ‚Π° Π·Π° Π΄Π° Π½Π΅ ја ΠΊΠΎΠΏΠΈΡ€Π°ΠΌ цСлосно сСкој ΠΏΠ°Ρ‚):

---
- name: Simple playbook
  # ...
  tasks:
    # ...
    - name: Add a new user
      user:
        name: my_user
        shell: /bin/bash
        password: "{{ 123qweasd | password_hash('sha512') }}"

НиС создавамС Π½ΠΎΠ² корисник, поставувамС шСма ΠΈ Π»ΠΎΠ·ΠΈΠ½ΠΊΠ° Π·Π° Π½Π΅Π³ΠΎ. И Ρ‚ΠΎΠ³Π°Ρˆ Π½Π°ΠΈΠ΄ΡƒΠ²Π°ΠΌΠ΅ Π½Π° Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ. Π¨Ρ‚ΠΎ Π°ΠΊΠΎ корисничкитС имиња Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π±ΠΈΠ΄Π°Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π·Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ хостови? И ΡΠΊΠ»Π°Π΄ΠΈΡ€Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° Π»ΠΎΠ·ΠΈΠ½ΠΊΠ°Ρ‚Π° Π²ΠΎ јасСн тСкст Π²ΠΎ ΠΊΠ½ΠΈΠ³Π°Ρ‚Π° Π·Π° ΠΈΠ³Ρ€ΠΈ Π΅ ΠΌΠ½ΠΎΠ³Ρƒ лоша идСја. Π—Π° ΠΏΠΎΡ‡Π΅Ρ‚ΠΎΠΊ, ајдС Π΄Π° Π³ΠΈ ставимС корисничкото ΠΈΠΌΠ΅ ΠΈ Π»ΠΎΠ·ΠΈΠ½ΠΊΠ°Ρ‚Π° Π²ΠΎ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ, Π° ΠΊΠΎΠ½ ΠΊΡ€Π°Ρ˜ΠΎΡ‚ Π½Π° ΡΡ‚Π°Ρ‚ΠΈΡ˜Π°Ρ‚Π° ќС ΠΏΠΎΠΊΠ°ΠΆΠ°ΠΌ ΠΊΠ°ΠΊΠΎ сС ΡˆΠΈΡ„Ρ€ΠΈΡ€Π° Π»ΠΎΠ·ΠΈΠ½ΠΊΠ°Ρ‚Π°.

---
- name: Simple playbook
  # ...
  tasks:
    # ...
    - name: Add a new user
      user:
        name: "{{ user }}"
        shell: /bin/bash
        password: "{{ user_password | password_hash('sha512') }}"

ΠŸΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡ‚Π΅ сС поставСни Π²ΠΎ ΠΊΠ½ΠΈΠ³ΠΈΡ‚Π΅ Π·Π° ΠΈΠ³Ρ€ΠΈ со помош Π½Π° двојни ΠΊΠ°Π΄Ρ€Π°Π²ΠΈ Π·Π°Π³Ρ€Π°Π΄ΠΈ.

ЌС Π³ΠΈ ΠΎΠ·Π½Π°Ρ‡ΠΈΠΌΠ΅ врСдноститС Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡ‚Π΅ Π²ΠΎ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° со Π·Π°Π»ΠΈΡ…ΠΈ:

123.123.123.123

[all:vars]
user=my_user
user_password=123qweasd

ΠžΠ±Ρ€Π½Π΅Ρ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π°Ρ‚Π° [all:vars] - Π²Π΅Π»ΠΈ Π΄Π΅ΠΊΠ° слСдниот Π±Π»ΠΎΠΊ тСкст сС ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ (vars) ΠΈ Ρ‚ΠΈΠ΅ сС ΠΏΡ€ΠΈΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π·Π° ситС хостови (ситС).

Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ΅Π½ Π΅ ΠΈ Π΄ΠΈΠ·Π°Ρ˜Π½ΠΎΡ‚ "{{ user_password | password_hash('sha512') }}". Π Π°Π±ΠΎΡ‚Π°Ρ‚Π° Π΅ ΡˆΡ‚ΠΎ ansible Π½Π΅ Π³ΠΎ инсталира корисникот ΠΏΡ€Π΅ΠΊΡƒ user_add ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ Π±ΠΈ Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈΠ»Π΅ Ρ‚ΠΎΠ° Ρ€Π°Ρ‡Π½ΠΎ. И Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Π³ΠΈ Π·Π°Ρ‡ΡƒΠ²ΡƒΠ²Π° ситС ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ, ΠΏΠΎΡ€Π°Π΄ΠΈ ΡˆΡ‚ΠΎ ΠΌΠΎΡ€Π°ΠΌΠ΅ ΠΎΠ΄Π½Π°ΠΏΡ€Π΅Π΄ Π΄Π° ја ΠΏΡ€Π΅Ρ‚Π²ΠΎΡ€ΠΈΠΌΠ΅ Π»ΠΎΠ·ΠΈΠ½ΠΊΠ°Ρ‚Π° Π²ΠΎ Ρ…Π°Ρˆ, ΡˆΡ‚ΠΎ Π³ΠΎ ΠΏΡ€Π°Π²ΠΈ ΠΎΠ²Π°Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°.

АјдС Π΄Π° Π³ΠΎ Π΄ΠΎΠ΄Π°Π΄Π΅ΠΌΠ΅ Π½Π°ΡˆΠΈΠΎΡ‚ корисник Π²ΠΎ Π³Ρ€ΡƒΠΏΠ°Ρ‚Π° sudo. Π‘Π΅ΠΏΠ°ΠΊ, ΠΏΡ€Π΅Π΄ ΠΎΠ²Π° Ρ‚Ρ€Π΅Π±Π° Π΄Π° сС ΡƒΠ²Π΅Ρ€ΠΈΠΌΠ΅ Π΄Π΅ΠΊΠ° постои Ρ‚Π°ΠΊΠ²Π° Π³Ρ€ΡƒΠΏΠ° бидСјќи никој Π½Π΅ΠΌΠ° Π΄Π° Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈ ΠΎΠ²Π° Π·Π° нас:

---
- name: Simple playbook
  # ...
  tasks:
    # ...
    - name: Ensure a 'sudo' group
      group:
        name: sudo
        state: present
    - name: Add a new user
      user:
        name: "{{ user }}"
        shell: /bin/bash
        password: "{{ user_password | password_hash('sha512') }}"
        groups: "sudo"

Π‘Γ¨ Π΅ ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π½ΠΎ Сдноставно, ΠΈΠΌΠ°ΠΌΠ΅ ΠΈ Π³Ρ€ΡƒΠΏΠ΅Π½ ΠΌΠΎΠ΄ΡƒΠ» Π·Π° ΠΊΡ€Π΅ΠΈΡ€Π°ΡšΠ΅ Π³Ρ€ΡƒΠΏΠΈ, со синтакса ΠΌΠ½ΠΎΠ³Ρƒ слична Π½Π° apt. Вогаш Π΄ΠΎΠ²ΠΎΠ»Π½ΠΎ Π΅ Π΄Π° ја рСгистриратС ΠΎΠ²Π°Π° Π³Ρ€ΡƒΠΏΠ° Π½Π° корисникот (groups: "sudo").
Π˜ΡΡ‚ΠΎ Ρ‚Π°ΠΊΠ°, корисно Π΅ Π΄Π° Π΄ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ssh ΠΊΠ»ΡƒΡ‡ Π½Π° овој корисник Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° сС најавимС ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Π³ΠΎ Π±Π΅Π· Π»ΠΎΠ·ΠΈΠ½ΠΊΠ°:

---
- name: Simple playbook
  # ...
  tasks:
    # ...
    - name: Ensure a 'sudo' group
      group:
      name: sudo
        state: present
    - name: Add a new user
      user:
        name: "{{ user }}"
        shell: /bin/bash
        password: "{{ user_password | password_hash('sha512') }}"
        groups: "sudo"
    - name: Deploy SSH Key
      authorized_key:
        user: "{{ user }}"
        key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
        state: present

Π’ΠΎ овој ΡΠ»ΡƒΡ‡Π°Ρ˜, Π΄ΠΈΠ·Π°Ρ˜Π½ΠΎΡ‚ Π΅ интСрСсСн "{{ lookup('file', '~/.ssh/id_rsa.pub') }}" β€” ја ΠΊΠΎΠΏΠΈΡ€Π° содрТината Π½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° id_rsa.pub (Π²Π°ΡˆΠ΅Ρ‚ΠΎ ΠΈΠΌΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π΅ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎ), односно Ρ˜Π°Π²Π½ΠΈΠΎΡ‚ Π΄Π΅Π» ΠΎΠ΄ ΠΊΠ»ΡƒΡ‡ΠΎΡ‚ ssh ΠΈ Π³ΠΎ ΠΏΡ€ΠΈΠΊΠ°Ρ‡ΡƒΠ²Π° Π½Π° списокот со овластСни ΠΊΠ»ΡƒΡ‡Π΅Π²ΠΈ Π·Π° корисникот Π½Π° сСрвСрот.

Π£Π»ΠΎΠ³ΠΈ

Π‘ΠΈΡ‚Π΅ Ρ‚Ρ€ΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ Π·Π° ΠΊΡ€Π΅ΠΈΡ€Π°ΡšΠ΅ ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π° ΠΌΠΎΠΆΠ΅ лСсно Π΄Π° сС класифицираат Π²ΠΎ Π΅Π΄Π½Π° Π³Ρ€ΡƒΠΏΠ° Π·Π°Π΄Π°Ρ‡ΠΈ ΠΈ Π±ΠΈ Π±ΠΈΠ»ΠΎ Π΄ΠΎΠ±Ρ€Π° идСја ΠΎΠ²Π°Π° Π³Ρ€ΡƒΠΏΠ° Π΄Π° сС складира ΠΎΠ΄Π΄Π΅Π»Π½ΠΎ ΠΎΠ΄ Π³Π»Π°Π²Π½Π°Ρ‚Π° ΠΊΠ½ΠΈΠ³Π° Π·Π° Π΄Π° Π½Π΅ растС ΠΏΡ€Π΅ΠΌΠ½ΠΎΠ³Ρƒ. Π—Π° Ρ‚Π°Π° Ρ†Π΅Π», Ansible ΠΈΠΌΠ° ΡƒΠ»ΠΎΠ³ΠΈ.
Π‘ΠΏΠΎΡ€Π΅Π΄ структурата Π½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° Π½Π°Π²Π΅Π΄Π΅Π½Π° Π½Π° самиот ΠΏΠΎΡ‡Π΅Ρ‚ΠΎΠΊ, ΡƒΠ»ΠΎΠ³ΠΈΡ‚Π΅ ΠΌΠΎΡ€Π° Π΄Π° Π±ΠΈΠ΄Π°Ρ‚ смСстСни Π²ΠΎ посСбСн Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡƒΠΌ со ΡƒΠ»ΠΎΠ³ΠΈ, Π·Π° сСкоја ΡƒΠ»ΠΎΠ³Π° ΠΈΠΌΠ° посСбСн Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡƒΠΌ со исто ΠΈΠΌΠ΅, Π²ΠΎ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡƒΠΌΠΎΡ‚ Π·Π°Π΄Π°Ρ‡ΠΈ, Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ, шаблони ΠΈΡ‚Π½.
АјдС Π΄Π° создадСмС структура Π½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°: ./ansible/roles/user/tasks/main.yml (Π³Π»Π°Π²Π½Π° Π΅ Π³Π»Π°Π²Π½Π°Ρ‚Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° ΡˆΡ‚ΠΎ ќС сС Π²Ρ‡ΠΈΡ‚Π° ΠΈ ќС сС ΠΈΠ·Π²Ρ€ΡˆΠΈ ΠΊΠΎΠ³Π° нСкоја ΡƒΠ»ΠΎΠ³Π° Π΅ ΠΏΠΎΠ²Ρ€Π·Π°Π½Π° со ΠΊΠ½ΠΈΠ³Π°Ρ‚Π° Π·Π° ΠΈΠ³Ρ€ΠΈ; со Π½Π΅Π° ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΏΠΎΠ²Ρ€Π·Π°Ρ‚ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ со ΡƒΠ»ΠΎΠ³ΠΈ). Π‘Π΅Π³Π° ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³ΠΈ ΠΏΡ€Π΅Ρ„Ρ€Π»ΠΈΡ‚Π΅ ситС Π·Π°Π΄Π°Ρ‡ΠΈ ΠΏΠΎΠ²Ρ€Π·Π°Π½ΠΈ со корисникот Π²ΠΎ ΠΎΠ²Π°Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°:

# Create user and add him to groups
- name: Ensure a 'sudo' group
  group:
    name: sudo
    state: present

- name: Add a new user
  user:
    name: "{{ user }}"
    shell: /bin/bash
    password: "{{ user_password | password_hash('sha512') }}"
    groups: "sudo"

- name: Deploy SSH Key
  authorized_key:
    user: "{{ user }}"
    key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
    state: present

Π’ΠΎ Π³Π»Π°Π²Π½Π°Ρ‚Π° ΠΊΠ½ΠΈΠ³Π°, ΠΌΠΎΡ€Π° Π΄Π° Π½Π°Π²Π΅Π΄Π΅Ρ‚Π΅ Π΄Π° ја користитС ΡƒΠ»ΠΎΠ³Π°Ρ‚Π° Π½Π° корисникот:

---
- name: Simple playbook
  hosts: all
  remote_user: root
  gather_facts: no

  tasks:
    - name: Update system
      apt: update_cache=yes
    - name: Install system dependencies
      apt:
        name: git,nginx,redis,postgresql,postgresql-contrib
        state: present

  roles:
    - user

Π˜ΡΡ‚ΠΎ Ρ‚Π°ΠΊΠ°, ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° смисла Π΄Π° сС Π°ΠΆΡƒΡ€ΠΈΡ€Π° систСмот ΠΏΡ€Π΅Π΄ ситС Π΄Ρ€ΡƒΠ³ΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ; Π·Π° Π΄Π° Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ ΠΎΠ²Π°, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³ΠΎ ΠΏΡ€Π΅ΠΈΠΌΠ΅Π½ΡƒΠ²Π°Ρ‚Π΅ Π±Π»ΠΎΠΊΠΎΡ‚ tasks Π²ΠΎ кој сС Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½ΠΈ Π²ΠΎ pre_tasks.

ΠŸΠΎΡΡ‚Π°Π²ΡƒΠ²Π°ΡšΠ΅ Π½Π° nginx

Π’Π΅ΡœΠ΅ Ρ‚Ρ€Π΅Π±Π° Π΄Π° ΠΈΠΌΠ°ΠΌΠ΅ инсталирано Nginx; Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π³ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°ΠΌΠ΅ ΠΈ Π΄Π° Π³ΠΎ ΠΈΠ·Π²Ρ€ΡˆΠΈΠΌΠ΅. АјдС Π΄Π° Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌΠ΅ Ρ‚ΠΎΠ° вСднаш Π²ΠΎ ΡƒΠ»ΠΎΠ³Π°Ρ‚Π°. АјдС Π΄Π° создадСмС структура Π½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°:

- ansible
  - roles
    - nginx
      - files
      - tasks
        - main.yml
      - templates

Π‘Π΅Π³Π° Π½ΠΈ Ρ‚Ρ€Π΅Π±Π°Π°Ρ‚ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ ΠΈ шаблони. Π Π°Π·Π»ΠΈΠΊΠ°Ρ‚Π° ΠΌΠ΅Ρ“Ρƒ Π½ΠΈΠ² Π΅ ΡˆΡ‚ΠΎ ansible Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Π³ΠΈ ΠΊΠΎΠΏΠΈΡ€Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈΡ‚Π΅, ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ Π΅. И ΡˆΠ°Π±Π»ΠΎΠ½ΠΈΡ‚Π΅ ΠΌΠΎΡ€Π° Π΄Π° ΠΈΠΌΠ°Π°Ρ‚ наставка j2 ΠΈ Ρ‚ΠΈΠ΅ ΠΌΠΎΠΆΠ°Ρ‚ Π΄Π° користат ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ врСдности ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Π³ΠΈ иститС двојни ΠΊΠ°Π΄Ρ€Π°Π²ΠΈ Π·Π°Π³Ρ€Π°Π΄ΠΈ.

АјдС Π΄Π° Π³ΠΎ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠΈΠΌΠ΅ nginx Π²ΠΎ main.yml Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°. Π—Π° ΠΎΠ²Π° ΠΈΠΌΠ°ΠΌΠ΅ систСмски ΠΌΠΎΠ΄ΡƒΠ»:

# Copy nginx configs and start it
- name: enable service nginx and start
  systemd:
    name: nginx
    state: started
    enabled: yes

ОвдС Π½Π΅ само ΡˆΡ‚ΠΎ Π²Π΅Π»ΠΈΠΌΠ΅ Π΄Π΅ΠΊΠ° nginx ΠΌΠΎΡ€Π° Π΄Π° сС стартува (Ρ‚.Π΅. Π³ΠΎ лансирамС), Ρ‚ΡƒΠΊΡƒ вСднаш Π²Π΅Π»ΠΈΠΌΠ΅ Π΄Π΅ΠΊΠ° ΠΌΠΎΡ€Π° Π΄Π° Π±ΠΈΠ΄Π΅ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½.
Π‘Π΅Π³Π° ајдС Π΄Π° Π³ΠΈ ΠΊΠΎΠΏΠΈΡ€Π°ΠΌΠ΅ конфигурацискитС Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ:

# Copy nginx configs and start it
- name: enable service nginx and start
  systemd:
    name: nginx
    state: started
    enabled: yes

- name: Copy the nginx.conf
  copy:
    src: nginx.conf
    dest: /etc/nginx/nginx.conf
    owner: root
    group: root
    mode: '0644'
    backup: yes

- name: Copy template my_app.conf
  template:
    src: my_app_conf.j2
    dest: /etc/nginx/sites-available/my_app.conf
    owner: root
    group: root
    mode: '0644'

НиС ја ΠΊΡ€Π΅ΠΈΡ€Π°ΠΌΠ΅ Π³Π»Π°Π²Π½Π°Ρ‚Π° конфигурациска Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° nginx (ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ја Π·Π΅ΠΌΠ΅Ρ‚Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ ΠΎΠ΄ сСрвСрот ΠΈΠ»ΠΈ Π΄Π° ја Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ сами). И, исто Ρ‚Π°ΠΊΠ°, конфигурациската Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° Π·Π° Π½Π°ΡˆΠ°Ρ‚Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Π²ΠΎ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡƒΠΌΠΎΡ‚ sites_available (ΠΎΠ²Π° Π½Π΅ Π΅ Π½Π΅ΠΎΠΏΡ…ΠΎΠ΄Π½ΠΎ, Π½ΠΎ корисно). Π’ΠΎ ΠΏΡ€Π²ΠΈΠΎΡ‚ ΡΠ»ΡƒΡ‡Π°Ρ˜, Π½ΠΈΠ΅ Π³ΠΎ користимС ΠΌΠΎΠ΄ΡƒΠ»ΠΎΡ‚ Π·Π° ΠΊΠΎΠΏΠΈΡ€Π°ΡšΠ΅ Π·Π° ΠΊΠΎΠΏΠΈΡ€Π°ΡšΠ΅ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ (Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° ΠΌΠΎΡ€Π° Π΄Π° Π±ΠΈΠ΄Π΅ Π²Π½Π°Ρ‚Ρ€Π΅ /ansible/roles/nginx/files/nginx.conf). Π’ΠΎ Π²Ρ‚ΠΎΡ€Π°Ρ‚Π°, Π³ΠΎ ΠΊΠΎΠΏΠΈΡ€Π°ΠΌΠ΅ ΡˆΠ°Π±Π»ΠΎΠ½ΠΎΡ‚, Π·Π°ΠΌΠ΅Π½ΡƒΠ²Π°Ρ˜ΡœΠΈ Π³ΠΈ врСдноститС Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡ‚Π΅. Π¨Π°Π±Π»ΠΎΠ½ΠΎΡ‚ Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π±ΠΈΠ΄Π΅ Π²Π½Π°Ρ‚Ρ€Π΅ /ansible/roles/nginx/templates/my_app.j2). И ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·Π³Π»Π΅Π΄Π° Π²Π°ΠΊΠ°:

upstream {{ app_name }} {
  server unix:{{ app_path }}/shared/tmp/sockets/puma.sock;
}

server {
  listen 80;
  server_name {{ server_name }} {{ inventory_hostname }};
  root {{ app_path }}/current/public;

  try_files $uri/index.html $uri.html $uri @{{ app_name }};
  ....
}

ΠžΠ±Ρ€Π½Π΅Ρ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π²Π»ΠΎΡˆΠΊΠΈΡ‚Π΅ {{ app_name }}, {{ app_path }}, {{ server_name }}, {{ inventory_hostname }} - ΠΎΠ²Π° сС ситС ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Ρ‡ΠΈΠΈ врСдности Ansible ќС Π³ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈ Π²ΠΎ ΡˆΠ°Π±Π»ΠΎΠ½ΠΎΡ‚ ΠΏΡ€Π΅Π΄ Π΄Π° Π³ΠΈ ΠΊΠΎΠΏΠΈΡ€Π°. Ова Π΅ корисно Π°ΠΊΠΎ користитС ΠΊΠ½ΠΈΠ³Π° Π·Π° ΠΈΠ³Ρ€ΠΈ Π·Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π³Ρ€ΡƒΠΏΠΈ Π½Π° домаќини. На ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ја Π΄ΠΎΠ΄Π°Π΄Π΅ΠΌΠ΅ Π½Π°ΡˆΠ°Ρ‚Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° со ΠΈΠ½Π²Π΅Π½Ρ‚Π°Ρ€:

[production]
123.123.123.123

[staging]
231.231.231.231

[all:vars]
user=my_user
user_password=123qweasd

[production:vars]
server_name=production
app_path=/home/www/my_app
app_name=my_app

[staging:vars]
server_name=staging
app_path=/home/www/my_stage
app_name=my_stage_app

Ако сСга ја стартувамС Π½Π°ΡˆΠ°Ρ‚Π° ΠΊΠ½ΠΈΠ³Π° Π·Π° ΠΈΠ³Ρ€ΠΈ, Ρ‚Π°Π° ќС Π³ΠΈ ΠΈΠ·Π²Ρ€ΡˆΠΈ Π½Π°Π²Π΅Π΄Π΅Π½ΠΈΡ‚Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ Π·Π° Π΄Π²Π°Ρ‚Π° домаќини. Но, Π²ΠΎ исто Π²Ρ€Π΅ΠΌΠ΅, Π·Π° домаќин Π½Π° сцСна, ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡ‚Π΅ ќС сС Ρ€Π°Π·Π»ΠΈΠΊΡƒΠ²Π°Π°Ρ‚ ΠΎΠ΄ продукцискитС, ΠΈ Π½Π΅ само Π²ΠΎ ΡƒΠ»ΠΎΠ³ΠΈ ΠΈ ΠΊΠ½ΠΈΠ³ΠΈ, Ρ‚ΡƒΠΊΡƒ ΠΈ Π²ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π½Π° nginx. {{ inventory_hostname }} Π½Π΅ Ρ‚Ρ€Π΅Π±Π° Π΄Π° сС спСцифицира Π²ΠΎ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° со Π·Π°Π»ΠΈΡ…ΠΈ - ΠΎΠ²Π° ΡΠΏΠ΅Ρ†ΠΈΡ˜Π°Π»Π½Π° ансибилна ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° ΠΈ Ρ‚Π°ΠΌΡƒ Π΅ Π·Π°Ρ‡ΡƒΠ²Π°Π½ Π΄ΠΎΠΌΠ°ΡœΠΈΠ½ΠΎΡ‚ Π·Π° кој ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°Π»Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚ΠΈ Playbook.
Ако сакатС Π΄Π° ΠΈΠΌΠ°Ρ‚Π΅ ΠΈΠ½Π²Π΅Π½Ρ‚Π°Ρ€ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° Π·Π° Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ хостови, Π½ΠΎ Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ само Π·Π° Π΅Π΄Π½Π° Π³Ρ€ΡƒΠΏΠ°, ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π½Π°ΠΏΡ€Π°Π²ΠΈ со слСднава ΠΊΠΎΠΌΠ°Π½Π΄Π°:

ansible-playbook -i inventory ./playbook.yml -l "staging"

Π”Ρ€ΡƒΠ³Π° ΠΎΠΏΡ†ΠΈΡ˜Π° Π΅ Π΄Π° ΠΈΠΌΠ°Ρ‚Π΅ посСбни Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ со Π·Π°Π»ΠΈΡ…ΠΈ Π·Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π³Ρ€ΡƒΠΏΠΈ. Или ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³ΠΈ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€Π°Ρ‚Π΅ Π΄Π²Π°Ρ‚Π° пристапа Π°ΠΊΠΎ ΠΈΠΌΠ°Ρ‚Π΅ ΠΌΠ½ΠΎΠ³Ρƒ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ домаќини.

Π”Π° сС ​​вратимС Π½Π° ΠΏΠΎΡΡ‚Π°Π²ΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° nginx. По ΠΊΠΎΠΏΠΈΡ€Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° конфигурацискитС Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ, Ρ‚Ρ€Π΅Π±Π° Π΄Π° создадСмС симврска Π²ΠΎ sitest_enabled Π΄ΠΎ my_app.conf ΠΎΠ΄ sites_available. И Ρ€Π΅ΡΡ‚Π°Ρ€Ρ‚ΠΈΡ€Π°Ρ˜Ρ‚Π΅ Π³ΠΎ nginx.

... # old code in mail.yml

- name: Create symlink to sites-enabled
  file:
    src: /etc/nginx/sites-available/my_app.conf
    dest: /etc/nginx/sites-enabled/my_app.conf
    state: link

- name: restart nginx
  service:
    name: nginx
    state: restarted

ОвдС сè Π΅ Сдноставно - ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ достапни ΠΌΠΎΠ΄ΡƒΠ»ΠΈ со ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π½ΠΎ стандардна синтакса. Но, ΠΈΠΌΠ° Π΅Π΄Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ°. НСма смисла Π΄Π° сС рСстартира nginx сСкој ΠΏΠ°Ρ‚. Π”Π°Π»ΠΈ Π·Π°Π±Π΅Π»Π΅ΠΆΠ°Π²Ρ‚Π΅ Π΄Π΅ΠΊΠ° Π½Π΅ ΠΏΠΈΡˆΡƒΠ²Π°ΠΌΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ ΠΊΠ°ΠΊΠΎ: β€žΠ½Π°ΠΏΡ€Π°Π²ΠΈ Π³ΠΎ Π²Π°ΠΊΠ°β€œ, синтаксата повСќС ΠΈΠ·Π³Π»Π΅Π΄Π° ΠΊΠ°ΠΊΠΎ β€žΠΎΠ²Π° Ρ‚Ρ€Π΅Π±Π° Π΄Π° ја ΠΈΠΌΠ° ΠΎΠ²Π°Π° ΡΠΎΡΡ‚ΠΎΡ˜Π±Π°β€œ. И Π½Π°Ρ˜Ρ‡Π΅ΡΡ‚ΠΎ Π²Π°ΠΊΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€Π° ansible. Ако Π³Ρ€ΡƒΠΏΠ°Ρ‚Π° вСќС постои ΠΈΠ»ΠΈ систСмскиот ΠΏΠ°ΠΊΠ΅Ρ‚ Π΅ вСќС инсталиран, Ρ‚ΠΎΠ³Π°Ρˆ ansible ќС Π³ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈ ΠΎΠ²Π° ΠΈ ќС ја прСскокнС Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π°. Π˜ΡΡ‚ΠΎ Ρ‚Π°ΠΊΠ°, Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈΡ‚Π΅ Π½Π΅ΠΌΠ° Π΄Π° сС ΠΊΠΎΠΏΠΈΡ€Π°Π°Ρ‚ Π°ΠΊΠΎ цСлосно сС совпаѓаат со ΠΎΠ½Π° ΡˆΡ‚ΠΎ Π΅ вСќС Π½Π° сСрвСрот. МоТСмС Π΄Π° Π³ΠΎ искористимС ΠΎΠ²Π° ΠΈ Π΄Π° Π³ΠΎ рСстартирамС nginx само Π°ΠΊΠΎ конфигурацискитС Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ сС смСнСти. ΠŸΠΎΡΡ‚ΠΎΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° Π·Π° рСгистар Π·Π° ΠΎΠ²Π°:

# Copy nginx configs and start it
- name: enable service nginx and start
  systemd:
    name: nginx
    state: started
    enabled: yes

- name: Copy the nginx.conf
  copy:
    src: nginx.conf
    dest: /etc/nginx/nginx.conf
    owner: root
    group: root
    mode: '0644'
    backup: yes
  register: restart_nginx

- name: Copy template my_app.conf
  template:
    src: my_app_conf.j2
    dest: /etc/nginx/sites-available/my_app.conf
    owner: root
    group: root
    mode: '0644'
  register: restart_nginx

- name: Create symlink to sites-enabled
  file:
    src: /etc/nginx/sites-available/my_app.conf
    dest: /etc/nginx/sites-enabled/my_app.conf
    state: link

- name: restart nginx
  service:
    name: nginx
    state: restarted
  when: restart_nginx.changed

Ако сС ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π΅Π΄Π½Π° ΠΎΠ΄ конфигурацискитС Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ, ќС сС Π½Π°ΠΏΡ€Π°Π²ΠΈ копија ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°Ρ‚Π° ќС Π±ΠΈΠ΄Π΅ рСгистрирана restart_nginx. И само Π°ΠΊΠΎ ΠΎΠ²Π°Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° Π΅ рСгистрирана, услугата ќС сС рСстартира.

И, сС Ρ€Π°Π·Π±ΠΈΡ€Π°, Ρ‚Ρ€Π΅Π±Π° Π΄Π° ја Π΄ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΡƒΠ»ΠΎΠ³Π°Ρ‚Π° nginx Π²ΠΎ Π³Π»Π°Π²Π½Π°Ρ‚Π° ΠΊΠ½ΠΈΠ³Π°.

ΠŸΠΎΡΡ‚Π°Π²ΡƒΠ²Π°ΡšΠ΅ postgresql

Π’Ρ€Π΅Π±Π° Π΄Π° Π³ΠΎ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠΈΠΌΠ΅ postgresql ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ systemd Π½Π° ист Π½Π°Ρ‡ΠΈΠ½ ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈΠ²ΠΌΠ΅ со nginx, Π° исто Ρ‚Π°ΠΊΠ° Π΄Π° создадСмС корисник ΡˆΡ‚ΠΎ ќС Π³ΠΎ користимС Π·Π° пристап Π΄ΠΎ Π±Π°Π·Π°Ρ‚Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΠΈ самата Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ.
АјдС Π΄Π° создадСмС ΡƒΠ»ΠΎΠ³Π° /ansible/roles/postgresql/tasks/main.yml:

# Create user in postgresql
- name: enable postgresql and start
  systemd:
    name: postgresql
    state: started
    enabled: yes

- name: Create database user
  become_user: postgres
  postgresql_user:
    name: "{{ db_user }}"
    password: "{{ db_password }}"
    role_attr_flags: SUPERUSER

- name: Create database
  become_user: postgres
  postgresql_db:
    name: "{{ db_name }}"
    encoding: UTF-8
    owner: "{{ db_user }}"

НСма Π΄Π° опишам ΠΊΠ°ΠΊΠΎ Π΄Π° Π΄ΠΎΠ΄Π°Π²Π°ΠΌ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π½Π° Π·Π°Π»ΠΈΡ…ΠΈΡ‚Π΅, ΠΎΠ²Π° Π΅ вСќС Π½Π°ΠΏΡ€Π°Π²Π΅Π½ΠΎ ΠΌΠ½ΠΎΠ³Ρƒ ΠΏΠ°Ρ‚ΠΈ, ΠΊΠ°ΠΊΠΎ ΠΈ синтаксата Π½Π° ΠΌΠΎΠ΄ΡƒΠ»ΠΈΡ‚Π΅ postgresql_db ΠΈ postgresql_user. ПовСќС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π°Ρ˜Π΄Π΅Ρ‚Π΅ Π²ΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π°Ρ‚Π°. ОвдС Π΅ Π½Π°Ρ˜ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΠ½Π°Ρ‚Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° become_user: postgres. Π€Π°ΠΊΡ‚ Π΅ Π΄Π΅ΠΊΠ° стандардно, само корисникот Π½Π° postgres ΠΈΠΌΠ° пристап Π΄ΠΎ Π±Π°Π·Π°Ρ‚Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ postgresql ΠΈ само Π»ΠΎΠΊΠ°Π»Π½ΠΎ. Оваа Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° Π½ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π° Π΄Π° ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΠΌΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ Π²ΠΎ ΠΈΠΌΠ΅ Π½Π° овој корисник (Π°ΠΊΠΎ ΠΈΠΌΠ°ΠΌΠ΅ пристап, сС Ρ€Π°Π·Π±ΠΈΡ€Π°).
Π˜ΡΡ‚ΠΎ Ρ‚Π°ΠΊΠ°, ΠΌΠΎΠΆΠ΅Π±ΠΈ ќС Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π΄ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ линија Π½Π° pg_hba.conf Π·Π° Π΄Π° Π΄ΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚Π΅ пристап Π½Π° Π½ΠΎΠ² корисник Π΄ΠΎ Π±Π°Π·Π°Ρ‚Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ. Ова ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π½Π°ΠΏΡ€Π°Π²ΠΈ Π½Π° ист Π½Π°Ρ‡ΠΈΠ½ ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ ја смСнивмС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° nginx.

И, сС Ρ€Π°Π·Π±ΠΈΡ€Π°, Ρ‚Ρ€Π΅Π±Π° Π΄Π° ја Π΄ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΡƒΠ»ΠΎΠ³Π°Ρ‚Π° postgresql Π²ΠΎ Π³Π»Π°Π²Π½Π°Ρ‚Π° ΠΊΠ½ΠΈΠ³Π° Π·Π° ΠΈΠ³Ρ€ΠΈ.

Π˜Π½ΡΡ‚Π°Π»ΠΈΡ€Π°ΡšΠ΅ Π½Π° Ρ€ΡƒΠ±ΠΈΠ½ ΠΏΡ€Π΅ΠΊΡƒ rbenv

Ansible Π½Π΅ΠΌΠ° ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° со rbenv, Π½ΠΎ сС инсталира со ΠΊΠ»ΠΎΠ½ΠΈΡ€Π°ΡšΠ΅ Π½Π° git ΡΠΊΠ»Π°Π΄ΠΈΡˆΡ‚Π΅. Π—Π°Ρ‚ΠΎΠ°, овој ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ станува Π½Π°Ρ˜Π½Π΅ΡΡ‚Π°Π½Π΄Π°Ρ€Π΄Π΅Π½. АјдС Π΄Π° создадСмС ΡƒΠ»ΠΎΠ³Π° Π·Π° Π½Π΅Π° /ansible/roles/ruby_rbenv/main.yml ΠΈ Π΄Π° ΠΏΠΎΡ‡Π½Π΅ΠΌΠ΅ Π΄Π° Π³ΠΎ ΠΏΠΎΠΏΠΎΠ»Π½ΡƒΠ²Π°ΠΌΠ΅:

# Install rbenv and ruby
- name: Install rbenv
  become_user: "{{ user }}"
  git: repo=https://github.com/rbenv/rbenv.git dest=~/.rbenv

ΠŸΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ја користимС Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π°Ρ‚Π° ben_user Π·Π° Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈΠΌΠ΅ ΠΏΠΎΠ΄ корисникот ΡˆΡ‚ΠΎ Π³ΠΎ создадовмС Π·Π° ΠΎΠ²ΠΈΠ΅ Ρ†Π΅Π»ΠΈ. Π‘ΠΈΠ΄Π΅Ρ˜ΡœΠΈ rbenv Π΅ инсталиран Π²ΠΎ Π½Π΅Π³ΠΎΠ²ΠΈΠΎΡ‚ домашСн Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡƒΠΌ, Π° Π½Π΅ Π³Π»ΠΎΠ±Π°Π»Π½ΠΎ. И Π½ΠΈΠ΅ исто Ρ‚Π°ΠΊΠ° Π³ΠΎ користимС ΠΌΠΎΠ΄ΡƒΠ»ΠΎΡ‚ git Π·Π° ΠΊΠ»ΠΎΠ½ΠΈΡ€Π°ΡšΠ΅ Π½Π° ΡΠΊΠ»Π°Π΄ΠΈΡˆΡ‚Π΅Ρ‚ΠΎ, Π½Π°Π²Π΅Π΄ΡƒΠ²Π°Ρ˜ΡœΠΈ repo ΠΈ dest.

Π‘Π»Π΅Π΄Π½ΠΎ, Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π³ΠΎ рСгистрирамС rbenv init Π²ΠΎ bashrc ΠΈ Π΄Π° Π΄ΠΎΠ΄Π°Π΄Π΅ΠΌΠ΅ rbenv Π½Π° PATH Ρ‚Π°ΠΌΡƒ. Π—Π° ΠΎΠ²Π° Π³ΠΎ ΠΈΠΌΠ°ΠΌΠ΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΎΡ‚ lineinfile:

- name: Add rbenv to PATH
  become_user: "{{ user }}"
  lineinfile:
    path: ~/.bashrc
    state: present
    line: 'export PATH="${HOME}/.rbenv/bin:${PATH}"'

- name: Add rbenv init to bashrc
  become_user: "{{ user }}"
  lineinfile:
    path: ~/.bashrc
    state: present
    line: 'eval "$(rbenv init -)"'

ΠŸΠΎΡ‚ΠΎΠ° Ρ‚Ρ€Π΅Π±Π° Π΄Π° инсталиратС ruby_build:

- name: Install ruby-build
  become_user: "{{ user }}"
  git: repo=https://github.com/rbenv/ruby-build.git dest=~/.rbenv/plugins/ruby-build

И ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΈΠ½ΡΡ‚Π°Π»ΠΈΡ€Π°Ρ˜ Ρ€ΡƒΠ±ΠΈΠ½. Ова сС ΠΏΡ€Π°Π²ΠΈ ΠΏΡ€Π΅ΠΊΡƒ rbenv, односно Сдноставно со ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° bash:

- name: Install ruby
  become_user: "{{ user }}"
  shell: |
    export PATH="${HOME}/.rbenv/bin:${PATH}"
    eval "$(rbenv init -)"
    rbenv install {{ ruby_version }}
  args:
    executable: /bin/bash

ΠšΠ°ΠΆΡƒΠ²Π°ΠΌΠ΅ која ΠΊΠΎΠΌΠ°Π½Π΄Π° Π΄Π° ја ΠΈΠ·Π²Ρ€ΡˆΠΈΠΌΠ΅ ΠΈ со ΡˆΡ‚ΠΎ. ΠœΠ΅Ρ“ΡƒΡ‚ΠΎΠ°, ΠΎΠ²Π΄Π΅ сС ΡΡ€Π΅ΡœΠ°Π²Π°ΠΌΠ΅ со Ρ„Π°ΠΊΡ‚ΠΎΡ‚ Π΄Π΅ΠΊΠ° ansible Π½Π΅ Π³ΠΎ ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π° ΠΊΠΎΠ΄ΠΎΡ‚ содрТан Π²ΠΎ bashrc ΠΏΡ€Π΅Π΄ Π΄Π° Π³ΠΈ ΠΈΠ·Π²Ρ€ΡˆΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡ‚Π΅. Ова Π·Π½Π°Ρ‡ΠΈ Π΄Π΅ΠΊΠ° rbenv ќС Ρ‚Ρ€Π΅Π±Π° Π΄Π° сС Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Π²ΠΎ истата скрипта.

Π‘Π»Π΅Π΄Π½ΠΈΠΎΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ сС Π΄ΠΎΠ»ΠΆΠΈ Π½Π° Ρ„Π°ΠΊΡ‚ΠΎΡ‚ ΡˆΡ‚ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° Π½Π° школка Π½Π΅ΠΌΠ° ΡΠΎΡΡ‚ΠΎΡ˜Π±Π° ΠΎΠ΄ Ρ€Π°Π·Π±ΠΈΡ€Π»ΠΈΠ²Π° Π³Π»Π΅Π΄Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ°. Π’ΠΎΠ° Π΅, Π½Π΅ΠΌΠ° Π΄Π° ΠΈΠΌΠ° автоматска ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π΄Π°Π»ΠΈ ΠΎΠ²Π°Π° Π²Π΅Ρ€Π·ΠΈΡ˜Π° Π½Π° Ρ€ΡƒΠ±ΠΈΠ½ Π΅ инсталирана ΠΈΠ»ΠΈ Π½Π΅. НиС ΠΌΠΎΠΆΠ΅ΠΌΠ΅ сами Π΄Π° Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌΠ΅ ΠΎΠ²Π°:

- name: Install ruby
  become_user: "{{ user }}"
  shell: |
    export PATH="${HOME}/.rbenv/bin:${PATH}"
    eval "$(rbenv init -)"
    if ! rbenv versions | grep -q {{ ruby_version }}
      then rbenv install {{ ruby_version }} && rbenv global {{ ruby_version }}
    fi
  args:
    executable: /bin/bash

ΠžΡΡ‚Π°Π½ΡƒΠ²Π° само Π΄Π° сС инсталира ΠΏΠ°ΠΊΠ΅Ρ‚:

- name: Install bundler
  become_user: "{{ user }}"
  shell: |
    export PATH="${HOME}/.rbenv/bin:${PATH}"
    eval "$(rbenv init -)"
    gem install bundler

И ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ, Π΄ΠΎΠ΄Π°Ρ˜Ρ‚Π΅ ја Π½Π°ΡˆΠ°Ρ‚Π° ΡƒΠ»ΠΎΠ³Π° ruby_rbenv Π²ΠΎ Π³Π»Π°Π²Π½Π°Ρ‚Π° ΠΊΠ½ΠΈΠ³Π°.

Π‘ΠΏΠΎΠ΄Π΅Π»Π΅Π½ΠΈ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ.

Π’ΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ, ΠΏΠΎΡΡ‚Π°Π²ΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π·Π°Π²Ρ€ΡˆΠΈ ΠΎΠ²Π΄Π΅. Π‘Π»Π΅Π΄Π½ΠΎ, останува само Π΄Π° сС ΠΈΠ·Π²Ρ€ΡˆΠΈ capistrano ΠΈ Ρ‚ΠΎΡ˜ самиот ќС Π³ΠΎ ΠΊΠΎΠΏΠΈΡ€Π° ΠΊΠΎΠ΄ΠΎΡ‚, ќС Π³ΠΈ создадС ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΈΡ‚Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡƒΠΌΠΈ ΠΈ ќС ја стартува Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° (Π°ΠΊΠΎ сè Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½ΠΎ). Π‘Π΅ΠΏΠ°ΠΊ, capistrano чСсто Π±Π°Ρ€Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ конфигурациски Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ, ΠΊΠ°ΠΊΠΎ Π½Π° ΠΏΡ€ database.yml ΠΈΠ»ΠΈ .env Π’ΠΈΠ΅ ΠΌΠΎΠΆΠ°Ρ‚ Π΄Π° сС ΠΊΠΎΠΏΠΈΡ€Π°Π°Ρ‚ исто ΠΊΠ°ΠΊΠΎ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈΡ‚Π΅ ΠΈ ΡˆΠ°Π±Π»ΠΎΠ½ΠΈΡ‚Π΅ Π·Π° nginx. Има само Π΅Π΄Π½Π° суптилност. ΠŸΡ€Π΅Π΄ Π΄Π° ΠΊΠΎΠΏΠΈΡ€Π°Ρ‚Π΅ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ, Ρ‚Ρ€Π΅Π±Π° Π΄Π° ΠΊΡ€Π΅ΠΈΡ€Π°Ρ‚Π΅ структура Π½Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡƒΠΌΠΈ Π·Π° Π½ΠΈΠ², Π½Π΅ΡˆΡ‚ΠΎ ΠΊΠ°ΠΊΠΎ ΠΎΠ²Π°:

# Copy shared files for deploy
- name: Ensure shared dir
  become_user: "{{ user }}"
  file:
    path: "{{ app_path }}/shared/config"
    state: directory

Π½ΠΈΠ΅ Π½Π°Π·Π½Π°Ρ‡ΡƒΠ²Π°ΠΌΠ΅ само Π΅Π΄Π΅Π½ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡƒΠΌ ΠΈ ansible автоматски ќС ΠΊΡ€Π΅ΠΈΡ€Π° Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π» Π΄ΠΎΠΊΠΎΠ»ΠΊΡƒ Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎ.

Ansible свод

Π’Π΅ΡœΠ΅ Π½Π°ΠΈΠ΄ΠΎΠ²ΠΌΠ΅ Π½Π° Ρ„Π°ΠΊΡ‚ΠΎΡ‚ Π΄Π΅ΠΊΠ° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡ‚Π΅ ΠΌΠΎΠΆΠ°Ρ‚ Π΄Π° содрТат Ρ‚Π°Ρ˜Π½ΠΈ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ Π΅ Π»ΠΎΠ·ΠΈΠ½ΠΊΠ°Ρ‚Π° Π½Π° корисникот. Ако стС создалС .env Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° Π·Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π°, ΠΈ database.yml Ρ‚ΠΎΠ³Π°Ρˆ ΠΌΠΎΡ€Π° Π΄Π° ΠΈΠΌΠ° ΡƒΡˆΡ‚Π΅ повСќС Π²Π°ΠΊΠ²ΠΈ ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½ΠΈ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ. Π‘ΠΈ Π±ΠΈΠ»ΠΎ Π΄ΠΎΠ±Ρ€ΠΎ Π΄Π° Π³ΠΈ скриСтС ΠΎΠ΄ Ρ™ΡƒΠ±ΠΎΠΏΠΈΡ‚Π½ΠΈΡ‚Π΅ ΠΎΡ‡ΠΈ. Π—Π° Ρ‚Π°Π° Ρ†Π΅Π» сС користи ансибилСн свод.

АјдС Π΄Π° создадСмС Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° Π·Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ /ansible/vars/all.yml (Π’ΡƒΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΊΡ€Π΅ΠΈΡ€Π°Ρ‚Π΅ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ Π·Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π³Ρ€ΡƒΠΏΠΈ Π½Π° хостови, исто ΠΊΠ°ΠΊΠΎ Π²ΠΎ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° со ΠΈΠ½Π²Π΅Π½Ρ‚Π°Ρ€: production.yml, staging.yml, ΠΈΡ‚Π½.).
Π‘ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ ΡˆΡ‚ΠΎ ΠΌΠΎΡ€Π° Π΄Π° сС ΡˆΠΈΡ„Ρ€ΠΈΡ€Π°Π°Ρ‚ ΠΌΠΎΡ€Π° Π΄Π° сС прСнСсат Π²ΠΎ ΠΎΠ²Π°Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ стандардна yml синтакса:

# System vars
user_password: 123qweasd
db_password: 123qweasd

# ENV vars
aws_access_key_id: xxxxx
aws_secret_access_key: xxxxxx
aws_bucket: bucket_name
rails_secret_key_base: very_secret_key_base

ПослС Ρ‚ΠΎΠ° ΠΎΠ²Π°Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΡˆΠΈΡ„Ρ€ΠΈΡ€Π° со ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π°:

ansible-vault encrypt ./vars/all.yml

ΠŸΡ€ΠΈΡ€ΠΎΠ΄Π½ΠΎ, ΠΏΡ€ΠΈ ΡˆΠΈΡ„Ρ€ΠΈΡ€Π°ΡšΠ΅, ќС Ρ‚Ρ€Π΅Π±Π° Π΄Π° поставитС Π»ΠΎΠ·ΠΈΠ½ΠΊΠ° Π·Π° Π΄Π΅ΡˆΠΈΡ„Ρ€ΠΈΡ€Π°ΡšΠ΅. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅ ΡˆΡ‚ΠΎ ќС ΠΈΠΌΠ° Π²ΠΎ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° ΠΎΡ‚ΠΊΠ°ΠΊΠΎ ќС ја ΠΏΠΎΠ²ΠΈΠΊΠ°Ρ‚Π΅ ΠΎΠ²Π°Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°.

Π‘ΠΎ помош Π½Π° ansible-vault decrypt Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π΄Π΅ΡˆΠΈΡ„Ρ€ΠΈΡ€Π°, ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€Π° ΠΈ ΠΏΠΎΡ‚ΠΎΠ° ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Π΄Π° сС ΡˆΠΈΡ„Ρ€ΠΈΡ€Π°.

НС Ρ‚Ρ€Π΅Π±Π° Π΄Π° ја Π΄Π΅ΡˆΠΈΡ„Ρ€ΠΈΡ€Π°Ρ‚Π΅ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° Π·Π° Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ. Π“ΠΎ складиратС ΡˆΠΈΡ„Ρ€ΠΈΡ€Π°Π½ΠΎ ΠΈ ја стартуватС Playbook со Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΡ‚ --ask-vault-pass. Ansible ќС ΠΏΠΎΠ±Π°Ρ€Π° Π»ΠΎΠ·ΠΈΠ½ΠΊΠ°, ќС Π³ΠΈ Π²Ρ€Π°Ρ‚ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡ‚Π΅ ΠΈ ќС Π³ΠΈ ΠΈΠ·Π²Ρ€ΡˆΠΈ Π·Π°Π΄Π°Ρ‡ΠΈΡ‚Π΅. Π‘ΠΈΡ‚Π΅ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ќС останат ΡˆΠΈΡ„Ρ€ΠΈΡ€Π°Π½ΠΈ.

ЦСлосната ΠΊΠΎΠΌΠ°Π½Π΄Π° Π·Π° Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ Π³Ρ€ΡƒΠΏΠΈ Π½Π° домаќини ΠΈ ansible vault ќС ΠΈΠ·Π³Π»Π΅Π΄Π° Π²Π°ΠΊΠ°:

ansible-playbook -i inventory ./playbook.yml -l "staging" --ask-vault-pass

Но, Π½Π΅ΠΌΠ° Π΄Π° Π²ΠΈ Π³ΠΎ Π΄Π°Π΄Π°ΠΌ цСлосниот тСкст Π½Π° ΠΈΠ³Ρ€Π°Ρ‡ΠΊΠΈΡ‚Π΅ ΠΈ ΡƒΠ»ΠΎΠ³ΠΈΡ‚Π΅, Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ Π³ΠΎ сами. Π‘ΠΈΠ΄Π΅Ρ˜ΡœΠΈ ansible Π΅ Ρ‚Π°ΠΊΠΎΠ² - Π°ΠΊΠΎ Π½Π΅ Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚Π΅ ΡˆΡ‚ΠΎ Ρ‚Ρ€Π΅Π±Π° Π΄Π° сС Π½Π°ΠΏΡ€Π°Π²ΠΈ, Ρ‚ΠΎΠ³Π°Ρˆ Ρ‚ΠΎΠ° Π½Π΅ΠΌΠ° Π΄Π° Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈ Ρ‚ΠΎΠ° Π·Π° вас.

Π˜Π·Π²ΠΎΡ€: www.habr.com

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€