ПодСшавањС сСрвСра Π·Π° ΠΏΡ€ΠΈΠΌΠ΅Π½Ρƒ Раилс Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅ користСћи АнсиблС

НСдавно сам ΠΌΠΎΡ€Π°ΠΎ Π΄Π° напишСм Π½Π΅ΠΊΠΎΠ»ΠΈΠΊΠΎ АнсиблС ΠΏΠ»Π°ΠΈΠ±ΠΎΠΎΠΊ-Π° Π΄Π° ΠΏΡ€ΠΈΠΏΡ€Π΅ΠΌΠΈΠΌ сСрвСр Π·Π° ΠΏΡ€ΠΈΠΌΠ΅Π½Ρƒ Раилс Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅. И, ΠΈΠ·Π½Π΅Π½Π°Ρ’ΡƒΡ˜ΡƒΡ›Π΅, нисам нашао Ρ˜Π΅Π΄Π½ΠΎΡΡ‚Π°Π²Π°Π½ ΠΏΡ€ΠΈΡ€ΡƒΡ‡Π½ΠΈΠΊ ΠΊΠΎΡ€Π°ΠΊ ΠΏΠΎ ΠΊΠΎΡ€Π°ΠΊ. Нисам ΠΆΠ΅Π»Π΅ΠΎ Π΄Π° ΠΊΠΎΠΏΠΈΡ€Π°ΠΌ Ρ‚ΡƒΡ’Ρƒ ΠΊΡšΠΈΠ³Ρƒ Π° Π΄Π° Π½Π΅ Ρ€Π°Π·ΡƒΠΌΠ΅ΠΌ ΡˆΡ‚Π° сС дСшава, ΠΈ Π½Π° ΠΊΡ€Π°Ρ˜Ρƒ сам ΠΌΠΎΡ€Π°ΠΎ Π΄Π° ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°ΠΌ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Ρƒ ΠΈ свС сам ΠΏΡ€ΠΈΠΊΡƒΠΏΠΈΠΎ. МоТда ΠΌΠΎΠ³Ρƒ ΠΏΠΎΠΌΠΎΡ›ΠΈ Π½Π΅ΠΊΠΎΠΌΠ΅ Π΄Π° ΡƒΠ±Ρ€Π·Π° овај процСс ΡƒΠ· ΠΏΠΎΠΌΠΎΡ› ΠΎΠ²ΠΎΠ³ Ρ‡Π»Π°Π½ΠΊΠ°.

ΠŸΡ€Π²Π° ствар ΠΊΠΎΡ˜Ρƒ Ρ‚Ρ€Π΅Π±Π° Ρ€Π°Π·ΡƒΠΌΠ΅Ρ‚ΠΈ јС Π΄Π° Π²Π°ΠΌ ансиблС ΠΏΡ€ΡƒΠΆΠ° Π·Π³ΠΎΠ΄Π°Π½ ΠΈΠ½Ρ‚Π΅Ρ€Ρ„Π΅Ρ˜Ρ Π·Π° ΠΎΠ±Π°Π²Ρ™Π°ΡšΠ΅ ΡƒΠ½Π°ΠΏΡ€Π΅Π΄ дСфинисанС листС Π°ΠΊΡ†ΠΈΡ˜Π° Π½Π° ΡƒΠ΄Π°Ρ™Π΅Π½ΠΈΠΌ сСрвСрима ΠΏΡƒΡ‚Π΅ΠΌ Π‘Π‘Π₯-Π°. НСма Ρ‚Ρƒ Π½ΠΈΠΊΠ°ΠΊΠ²Π΅ магијС, Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° инсталиратС Π΄ΠΎΠ΄Π°Ρ‚Π°ΠΊ ΠΈ Π΄ΠΎΠ±ΠΈΡ˜Π΅Ρ‚Π΅ Π½ΡƒΠ»Ρ‚Ρƒ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Ρƒ вашС Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅ са Π΄ΠΎΡ†ΠΊΠ΅Ρ€-ΠΎΠΌ, надглСдањСм ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌ Π΄ΠΎΠ±Ρ€ΠΎΡ‚Π°ΠΌΠ° ΠΈΠ· ΠΊΡƒΡ‚ΠΈΡ˜Π΅. Π”Π° бистС написали ΠΊΡšΠΈΠ³Ρƒ, ΠΌΠΎΡ€Π°Ρ‚Π΅ Π·Π½Π°Ρ‚ΠΈ ΡˆΡ‚Π° Ρ‚Π°Ρ‡Π½ΠΎ ΠΆΠ΅Π»ΠΈΡ‚Π΅ Π΄Π° Ρ€Π°Π΄ΠΈΡ‚Π΅ ΠΈ ΠΊΠ°ΠΊΠΎ Ρ‚ΠΎ Π΄Π° ΡƒΡ€Π°Π΄ΠΈΡ‚Π΅. Π—Π°Ρ‚ΠΎ нисам Π·Π°Π΄ΠΎΠ²ΠΎΡ™Π°Π½ Π³ΠΎΡ‚ΠΎΠ²ΠΈΠΌ ΠΏΡ€ΠΈΡ€ΡƒΡ‡Π½ΠΈΡ†ΠΈΠΌΠ° са Π“ΠΈΡ‚Π₯ΡƒΠ±-Π° ΠΈΠ»ΠΈ Ρ‡Π»Π°Π½Ρ†ΠΈΠΌΠ° ΠΏΠΎΠΏΡƒΡ‚: β€žΠšΠΎΠΏΠΈΡ€Π°Ρ˜ ΠΈ ΠΏΠΎΠΊΡ€Π΅Π½ΠΈ, Ρ€Π°Π΄ΠΈΡ›Π΅β€œ.

Оно ΡˆΡ‚ΠΎ Π½Π°ΠΌ Ρ‚Ρ€Π΅Π±Π°?

Као ΡˆΡ‚ΠΎ сам Π²Π΅Ρ› Ρ€Π΅ΠΊΠ°ΠΎ, Π΄Π° бистС написали свСску ΠΌΠΎΡ€Π°Ρ‚Π΅ Π΄Π° Π·Π½Π°Ρ‚Π΅ ΡˆΡ‚Π° ΠΆΠ΅Π»ΠΈΡ‚Π΅ Π΄Π° Ρ€Π°Π΄ΠΈΡ‚Π΅ ΠΈ ΠΊΠ°ΠΊΠΎ Π΄Π° Ρ‚ΠΎ ΡƒΡ€Π°Π΄ΠΈΡ‚Π΅. Π₯ајдС Π΄Π° ΠΎΠ΄Π»ΡƒΡ‡ΠΈΠΌΠΎ ΡˆΡ‚Π° Π½Π°ΠΌ Ρ‚Ρ€Π΅Π±Π°. Π—Π° Раилс Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Ρƒ Π±ΠΈΡ›Π΅ Π½Π°ΠΌ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎ Π½Π΅ΠΊΠΎΠ»ΠΈΠΊΠΎ систСмских ΠΏΠ°ΠΊΠ΅Ρ‚Π°: Π½Π³ΠΈΠ½ΠΊ, постгрСскл (рСдис, ΠΈΡ‚Π΄.). ΠŸΠΎΡ€Π΅Π΄ Ρ‚ΠΎΠ³Π°, ΠΏΠΎΡ‚Ρ€Π΅Π±Π½Π° Π½Π°ΠΌ јС посСбна Π²Π΅Ρ€Π·ΠΈΡ˜Π° Ρ€ΡƒΠ±ΠΈΠ½Π°. ΠΠ°Ρ˜Π±ΠΎΡ™Π΅ Π³Π° јС инсталирати ΠΏΡ€Π΅ΠΊΠΎ Ρ€Π±Π΅Π½Π² (Ρ€Π²ΠΌ, асдф...). ΠŸΠΎΠΊΡ€Π΅Ρ‚Π°ΡšΠ΅ свСга ΠΎΠ²ΠΎΠ³Π° ΠΊΠ°ΠΎ Ρ€ΠΎΠΎΡ‚ корисник јС ΡƒΠ²Π΅ΠΊ лоша идСја, Ρ‚Π°ΠΊΠΎ Π΄Π° ΠΌΠΎΡ€Π°Ρ‚Π΅ Π΄Π° ΠΊΡ€Π΅ΠΈΡ€Π°Ρ‚Π΅ посСбног корисника ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡˆΠ΅Ρ‚Π΅ њСгова ΠΏΡ€Π°Π²Π°. Након ΠΎΠ²ΠΎΠ³Π°, ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎ јС Π΄Π° ΠΎΡ‚ΠΏΡ€Π΅ΠΌΠΈΡ‚Π΅ наш ΠΊΠΎΠ΄ Π½Π° сСрвСр, ΠΊΠΎΠΏΠΈΡ€Π°Ρ‚Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π΅ Π·Π° Π½Π³ΠΈΠ½ΠΊ, постгрСс ΠΈΡ‚Π΄. ΠΈ ΠΏΠΎΠΊΡ€Π΅Π½Π΅Ρ‚Π΅ свС ΠΎΠ²Π΅ услугС.

Као Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚, рСдослСд Π°ΠΊΡ†ΠΈΡ˜Π° јС слСдСћи:

  1. ΠŸΡ€ΠΈΡ˜Π°Π²ΠΈΡ‚Π΅ сС ΠΊΠ°ΠΎ Ρ€ΠΎΠΎΡ‚
  2. ΠΈΠ½ΡΡ‚Π°Π»ΠΈΡ€Π°Ρ˜Ρ‚Π΅ систСмскС ΠΏΠ°ΠΊΠ΅Ρ‚Π΅
  3. ΠΊΡ€Π΅ΠΈΡ€Π°Ρ˜Ρ‚Π΅ Π½ΠΎΠ²ΠΎΠ³ корисника, ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡˆΠΈΡ‚Π΅ ΠΏΡ€Π°Π²Π°, ссх ΠΊΡ™ΡƒΡ‡
  4. ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡˆΠΈΡ‚Π΅ систСмскС ΠΏΠ°ΠΊΠ΅Ρ‚Π΅ (Π½Π³ΠΈΠ½ΠΊ ΠΈΡ‚Π΄.) ΠΈ ΠΏΠΎΠΊΡ€Π΅Π½ΠΈΡ‚Π΅ ΠΈΡ…
  5. ΠšΡ€Π΅ΠΈΡ€Π°ΠΌΠΎ корисника Ρƒ Π±Π°Π·ΠΈ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° (ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠ΄ΠΌΠ°Ρ… ΠΊΡ€Π΅ΠΈΡ€Π°Ρ‚ΠΈ Π±Π°Π·Ρƒ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ°)
  6. ΠŸΡ€ΠΈΡ˜Π°Π²ΠΈΡ‚Π΅ сС ΠΊΠ°ΠΎ Π½ΠΎΠ²ΠΈ корисник
  7. Π˜Π½ΡΡ‚Π°Π»ΠΈΡ€Π°Ρ˜Ρ‚Π΅ Ρ€Π±Π΅Π½Π² ΠΈ Ρ€ΡƒΠ±ΠΈ
  8. Π˜Π½ΡΡ‚Π°Π»ΠΈΡ€Π°ΡšΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚Π°
  9. ΠžΡ‚ΠΏΡ€Π΅ΠΌΠ°ΡšΠ΅ ΠΊΠΎΠ΄Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅
  10. ΠŸΠΎΠΊΡ€Π΅Ρ‚Π°ΡšΠ΅ ΠŸΡƒΠΌΠ° сСрвСра

Π¨Ρ‚Π°Π²ΠΈΡˆΠ΅, послСдњС Ρ„Π°Π·Π΅ сС ΠΌΠΎΠ³Ρƒ ΠΎΠ±Π°Π²ΠΈΡ‚ΠΈ ΠΏΠΎΠΌΠΎΡ›Ρƒ цапистрано-Π°, Π±Π°Ρ€Π΅ΠΌ ΠΈΠ· ΠΊΡƒΡ‚ΠΈΡ˜Π΅ ΠΌΠΎΠΆΠ΅ ΠΊΠΎΠΏΠΈΡ€Π°Ρ‚ΠΈ ΠΊΠΎΠ΄ Ρƒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡ˜ΡƒΠΌΠ΅ издања, ΠΏΡ€Π΅Π±Π°Ρ†ΠΈΡ‚ΠΈ издањС симболичком Π²Π΅Π·ΠΎΠΌ Π½Π°ΠΊΠΎΠ½ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ ΠΏΠΎΡΡ‚Π°Π²Ρ™Π°ΡšΠ°, ΠΊΠΎΠΏΠΈΡ€Π°Ρ‚ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π΅ ΠΈΠ· Π΄Π΅Ρ™Π΅Π½ΠΎΠ³ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡ˜ΡƒΠΌΠ°, ΠΏΠΎΠ½ΠΎΠ²ΠΎ ΠΏΠΎΠΊΡ€Π΅Π½ΡƒΡ‚ΠΈ ΠŸΡƒΠΌΡƒ, ΠΈΡ‚Π΄. Π‘Π²Π΅ ΠΎΠ²ΠΎ сС ΠΌΠΎΠΆΠ΅ ΡƒΡ€Π°Π΄ΠΈΡ‚ΠΈ ΠΏΠΎΠΌΠΎΡ›Ρƒ АнсиблС-Π°, Π°Π»ΠΈ Π·Π°ΡˆΡ‚ΠΎ?

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

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

БимплС Плаибоок

Плаибоок јС ΠΈΠΌΠ» Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° која, користСћи посСбну синтаксу, ΠΎΠΏΠΈΡΡƒΡ˜Π΅ ΡˆΡ‚Π° АнсиблС Ρ‚Ρ€Π΅Π±Π° Π΄Π° Ρ€Π°Π΄ΠΈ ΠΈ ΠΊΠ°ΠΊΠΎ. Π₯ајдС Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌΠΎ ΠΏΡ€Π²Ρƒ ΠΊΡšΠΈΠ³Ρƒ која Π½Π΅ Ρ€Π°Π΄ΠΈ Π½ΠΈΡˆΡ‚Π°:

---
- 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

Али Π½Π΅Ρ›Ρƒ Π²Π°ΠΌ Π΄Π°Ρ‚ΠΈ Ρ†Π΅ΠΎ тСкст књига ΠΈ ΡƒΠ»ΠΎΠ³Π°, Π½Π°ΠΏΠΈΡˆΠΈΡ‚Π΅ Π³Π° сами. ΠˆΠ΅Ρ€ ансиблС јС Ρ‚Π°ΠΊΠ°Π² - Π°ΠΊΠΎ Π½Π΅ Ρ€Π°Π·ΡƒΠΌΠ΅Ρ‚Π΅ ΡˆΡ‚Π° Ρ‚Ρ€Π΅Π±Π° Π΄Π° сС ΡƒΡ€Π°Π΄ΠΈ, ΠΎΠ½Π΄Π° Ρ‚ΠΎ Π½Π΅Ρ›Π΅ ΡƒΡ‡ΠΈΠ½ΠΈΡ‚ΠΈ умСсто вас.

Π˜Π·Π²ΠΎΡ€: Π²Π²Π².Ρ…Π°Π±Ρ€.Ρ†ΠΎΠΌ

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