Ansible เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชฐเซ‡เชฒเซเชธ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซ‡ เชœเชฎเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชธเชฐเซเชตเชฐ เชธเซ‡เชŸ เช•เชฐเชตเซเช‚

เชฅเซ‹เชกเชพ เชธเชฎเชฏ เชชเชนเซ‡เชฒเชพ เชฎเชจเซ‡ เชฐเซ‡เชฒเซเชธ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชœเชฎเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชธเชฐเซเชตเชฐเชจเซ‡ เชคเซˆเชฏเชพเชฐ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช˜เชฃเซ€ เชœเชตเชพเชฌเซ€ เชชเซเชฒเซ‡เชฌเซเช• เชฒเช–เชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชนเชคเซ€. เช…เชจเซ‡, เช†เชถเซเชšเชฐเซเชฏเชœเชจเช• เชฐเซ€เชคเซ‡, เชฎเชจเซ‡ เชเช• เชธเชฐเชณ เชชเช—เชฒเซเช‚ เชฆเซเชตเชพเชฐเชพ เชชเช—เชฒเซเช‚ เชฎเชพเชฐเซเช—เชฆเชฐเซเชถเชฟเช•เชพ เชฎเชณเซ€ เชจเชฅเซ€. เชถเซเช‚ เชฅเชˆ เชฐเชนเซเชฏเซเช‚ เช›เซ‡ เชคเซ‡ เชธเชฎเชœเซเชฏเชพ เชตเชฟเชจเชพ เชนเซเช‚ เช•เซ‹เชˆ เชฌเซ€เชœเชพเชจเซ€ เชชเซเชฒเซ‡เชฌเซเช•เชจเซ€ เชจเช•เชฒ เช•เชฐเชตเชพ เชฎเชพเช‚เช—เชคเซ‹ เชจ เชนเชคเซ‹, เช…เชจเซ‡ เช…เช‚เชคเซ‡ เชฎเชพเชฐเซ‡ เชฌเชงเซเช‚ เชœเชพเชคเซ‡ เชเช•เชคเซเชฐเชฟเชค เช•เชฐเซ€เชจเซ‡ เชฆเชธเซเชคเชพเชตเซ‡เชœเซ‹ เชตเชพเช‚เชšเชตเชพ เชชเชกเซเชฏเชพ. เช•เชฆเชพเชš เชนเซเช‚ เช† เชฒเซ‡เช–เชจเซ€ เชฎเชฆเชฆเชฅเซ€ เช† เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเซ‡ เชเชกเชชเซ€ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เช•เซ‹เชˆเชจเซ‡ เชฎเชฆเชฆ เช•เชฐเซ€ เชถเช•เซเช‚.

เชธเชฎเชœเชตเชพ เชฎเชพเชŸเซ‡เชจเซ€ เชชเซเชฐเชฅเชฎ เชตเชธเซเชคเซ เช เช›เซ‡ เช•เซ‡ เชœเชตเชพเชฌเซ€ เช เชคเชฎเชจเซ‡ SSH เชฎเชพเชฐเชซเชคเซ‡ เชฐเซ€เชฎเซ‹เชŸ เชธเชฐเซเชตเชฐ(เช“) เชชเชฐ เช•เซเชฐเชฟเชฏเชพเช“เชจเซ€ เชชเซ‚เชฐเซเชตเชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เชธเซ‚เชšเชฟ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช…เชจเซเช•เซ‚เชณ เช‡เชจเซเชŸเชฐเชซเซ‡เชธ เชชเซเชฐเชฆเชพเชจ เช•เชฐเซ‡ เช›เซ‡. เช…เชนเซ€เช‚ เช•เซ‹เชˆ เชœเชพเชฆเซ เชจเชฅเซ€, เชคเชฎเซ‡ เชชเซเชฒเช—เช‡เชจ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ€ เชถเช•เชคเชพ เชจเชฅเซ€ เช…เชจเซ‡ เชกเซ‹เช•เชฐ, เชฎเซ‹เชจเชฟเชŸเชฐเชฟเช‚เช— เช…เชจเซ‡ เชฌเซ‰เช•เซเชธเชจเซ€ เชฌเชนเชพเชฐเชจเซ€ เช…เชจเซเชฏ เช—เซ‚เชกเซ€เช เชธเชพเชฅเซ‡ เชคเชฎเชพเชฐเซ€ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซ‹ เชถเซ‚เชจเซเชฏ เชกเชพเช‰เชจเชŸเชพเช‡เชฎ เชœเชฎเชพเชตเชŸ เชฎเซ‡เชณเชตเซ€ เชถเช•เชคเชพ เชจเชฅเซ€. เชชเซเชฒเซ‡เชฌเซเช• เชฒเช–เชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ เชœเชพเชฃเชตเซเช‚ เชœเซ‹เชˆเช เช•เซ‡ เชคเชฎเซ‡ เชฌเชฐเชพเชฌเชฐ เชถเซเช‚ เช•เชฐเชตเชพ เชฎเชพเช‚เช—เซ‹ เช›เซ‹ เช…เชจเซ‡ เชคเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชฐเชตเซเช‚. เชคเซ‡เชฅเซ€ เชœ เชนเซเช‚ GitHub เชคเชฐเชซเชฅเซ€ เชคเซˆเชฏเชพเชฐ เชชเซเชฒเซ‡เชฌเซเช• เช…เชฅเชตเชพ เชฒเซ‡เช–เซ‹เชฅเซ€ เชธเช‚เชคเซเชทเซเชŸ เชจเชฅเซ€ เชœเซ‡เชฎ เช•เซ‡: "เช•เซ‰เชชเชฟ เช•เชฐเซ‹ เช…เชจเซ‡ เชšเชฒเชพเชตเซ‹, เชคเซ‡ เช•เชพเชฎ เช•เชฐเชถเซ‡."

เช†เชชเชฃเชจเซ‡ เชถเซเช‚ เชœเซ‹เชˆเช เช›เซ‡?

เชฎเซ‡เช‚ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เช•เชนเซเชฏเซเช‚ เชคเซ‡เชฎ, เชชเซเชฒเซ‡เชฌเซเช• เชฒเช–เชตเชพ เชฎเชพเชŸเซ‡ เชคเชฎเชพเชฐเซ‡ เชœเชพเชฃเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เช•เซ‡ เชคเชฎเซ‡ เชถเซเช‚ เช•เชฐเชตเชพ เชฎเชพเช‚เช—เซ‹ เช›เซ‹ เช…เชจเซ‡ เชคเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชฐเชตเซเช‚. เชšเชพเชฒเซ‹ เชจเช•เซเช•เซ€ เช•เชฐเซ€เช เช•เซ‡ เช†เชชเชฃเชจเซ‡ เชถเซเช‚ เชœเซ‹เชˆเช เช›เซ‡. เชฐเซ‡เชฒเซเชธ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชฎเชพเชŸเซ‡ เช…เชฎเชจเซ‡ เช˜เชฃเชพ เชธเชฟเชธเซเชŸเชฎ เชชเซ‡เช•เซ‡เชœเซ‹เชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเชถเซ‡: nginx, postgresql (redis, เชตเช—เซ‡เชฐเซ‡). เชตเชงเซเชฎเชพเช‚, เช…เชฎเชจเซ‡ เชฐเซ‚เชฌเซ€เชจเชพ เชšเซ‹เช•เซเช•เชธ เชธเช‚เชธเซเช•เชฐเชฃเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เชคเซ‡เชจเซ‡ rbenv (rvm, asdf...) เชฆเซเชตเชพเชฐเชพ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเซเช‚ เชถเซเชฐเซ‡เชทเซเช  เช›เซ‡. เชฐเซเชŸ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชคเชฐเซ€เช•เซ‡ เช† เชฌเชงเซเช‚ เชšเชฒเชพเชตเชตเซเช‚ เช เชนเช‚เชฎเซ‡เชถเชพ เช–เชฐเชพเชฌ เชตเชฟเชšเชพเชฐ เช›เซ‡, เชคเซ‡เชฅเซ€ เชคเชฎเชพเชฐเซ‡ เชเช• เช…เชฒเช— เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชฌเชจเชพเชตเชตเชพเชจเซ€ เช…เชจเซ‡ เชคเซ‡เชจเชพ เช…เชงเชฟเช•เชพเชฐเซ‹เชจเซ‡ เช—เซ‹เช เชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เช† เชชเช›เซ€, เชคเชฎเชพเชฐเซ‡ เช…เชฎเชพเชฐเซ‹ เช•เซ‹เชก เชธเชฐเซเชตเชฐ เชชเชฐ เช…เชชเชฒเซ‹เชก เช•เชฐเชตเซ‹ เชชเชกเชถเซ‡, nginx, postgres, เชตเช—เซ‡เชฐเซ‡ เชฎเชพเชŸเซ‡ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช“เชจเซ€ เชจเช•เชฒ เช•เชฐเชตเซ€ เชชเชกเชถเซ‡ เช…เชจเซ‡ เช† เชฌเชงเซ€ เชธเซ‡เชตเชพเช“ เชถเชฐเซ‚ เช•เชฐเชตเซ€ เชชเชกเชถเซ‡.

เชชเชฐเชฟเชฃเชพเชฎเซ‡, เช•เซเชฐเชฟเชฏเชพเช“เชจเซ‹ เช•เซเชฐเชฎ เชจเซ€เชšเซ‡ เชฎเซเชœเชฌ เช›เซ‡:

  1. เชฐเซ‚เชŸ เชคเชฐเซ€เช•เซ‡ เชฒเซ‹เช—เชฟเชจ เช•เชฐเซ‹
  2. เชธเชฟเชธเซเชŸเชฎ เชชเซ‡เช•เซ‡เชœเซ‹ เชธเซเชฅเชพเชชเชฟเชค เช•เชฐเซ‹
  3. เชจเชตเซ‹ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชฌเชจเชพเชตเซ‹, เช…เชงเชฟเช•เชพเชฐเซ‹ เช—เซ‹เช เชตเซ‹, ssh เช•เซ€
  4. เชธเชฟเชธเซเชŸเชฎ เชชเซ‡เช•เซ‡เชœเซ‹ (nginx เชตเช—เซ‡เชฐเซ‡) เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชฟเชค เช•เชฐเซ‹ เช…เชจเซ‡ เชคเซ‡เชฎเชจเซ‡ เชšเชฒเชพเชตเซ‹
  5. เช…เชฎเซ‡ เชกเซ‡เชŸเชพเชฌเซ‡เชเชฎเชพเช‚ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชฌเชจเชพเชตเซ€เช เช›เซ€เช (เชคเชฎเซ‡ เชคเชฐเชค เชœ เชกเซ‡เชŸเชพเชฌเซ‡เช เชฌเชจเชพเชตเซ€ เชถเช•เซ‹ เช›เซ‹)
  6. เชจเชตเชพ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชคเชฐเซ€เช•เซ‡ เชฒเซ‹เช—เชฟเชจ เช•เชฐเซ‹
  7. rbenv เช…เชจเซ‡ ruby โ€‹โ€‹เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ‹
  8. เชฌเช‚เชกเชฒเชฐ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡
  9. เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เช•เซ‹เชก เช…เชชเชฒเซ‹เชก เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช
  10. เชชเซเชฎเชพ เชธเชฐเซเชตเชฐ เชฒเซ‹เช‚เชš เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช

เชตเชงเซเชฎเชพเช‚, เช›เซ‡เชฒเซเชฒเชพ เชคเชฌเช•เซเช•เชพเช“ เช•เซ‡เชชเชฟเชธเซเชŸเซเชฐเชพเชจเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡, เช“เช›เชพเชฎเชพเช‚ เช“เช›เชพ เชฌเซ‰เช•เซเชธเชจเซ€ เชฌเชนเชพเชฐ เชคเซ‡ เช•เซ‹เชกเชจเซ‡ เชฐเชฟเชฒเซ€เช เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เช“เชฎเชพเช‚ เช•เซ‰เชชเชฟ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡, เชธเชซเชณ เชœเชฎเชพเชตเชŸ เชชเชฐ เชธเชฟเชฎเชฒเชฟเช‚เช• เชธเชพเชฅเซ‡ เชฐเชฟเชฒเซ€เชเชจเซ‡ เชธเซเชตเชฟเชš เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡, เชถเซ‡เชฐ เช•เชฐเซ‡เชฒเซ€ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เชฎเชพเช‚เชฅเซ€ เช•เซ‰เชชเชฟ เช•เซ‰เชชเชฟ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡, เชชเซเชฏเซเชฎเชพเชจเซ‡ เชซเชฐเซ€เชฅเซ€ เชถเชฐเซ‚ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡, เชตเช—เซ‡เชฐเซ‡. เช† เชฌเชงเซเช‚ Ansible เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡, เชชเชฃ เชถเชพ เชฎเชพเชŸเซ‡?

เชซเชพเช‡เชฒ เชฎเชพเชณเช–เซเช‚

Ansible เช•เชกเช• เช›เซ‡ เชซเชพเช‡เชฒ เชฎเชพเชณเช–เซเช‚ เชคเชฎเชพเชฐเซ€ เชฌเชงเซ€ เชซเชพเช‡เชฒเซ‹ เชฎเชพเชŸเซ‡, เชคเซ‡เชฅเซ€ เชคเซ‡ เชฌเชงเซเช‚ เช…เชฒเช— เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เชฎเชพเช‚ เชฐเชพเช–เชตเซเช‚ เชถเซเชฐเซ‡เชทเซเช  เช›เซ‡. เชคเชฆเซเชชเชฐเชพเช‚เชค, เชคเซ‡ เชเชŸเชฒเซเช‚ เชฎเชนเชคเซเชตเชจเซเช‚ เชจเชฅเซ€ เช•เซ‡ เชคเซ‡ เชฐเซ‡เชฒเซเชธ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชฎเชพเช‚ เชœ เชนเชถเซ‡, เช…เชฅเชตเชพ เช…เชฒเช—เชฅเซ€. เชคเชฎเซ‡ เชซเชพเช‡เชฒเซ‹เชจเซ‡ เช…เชฒเช— เช—เชฟเชŸ เชฐเชฟเชชเซ‹เชเซ€เชŸเชฐเซ€เชฎเชพเช‚ เชธเซเชŸเซ‹เชฐ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹. เช…เช‚เช—เชค เชฐเซ€เชคเซ‡, เชฎเชจเซ‡ เชฐเซ‡เชฒเซเชธ เชเชชเซเชฒเซ€เช•เซ‡เชถเชจเชจเซ€ /config เชกเชพเชฏเชฐเซ‡เช•เซเชŸเชฐเซ€เชฎเชพเช‚ เชœเชตเชพเชฌเชฆเชพเชฐ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€ เชฌเชจเชพเชตเชตเซ€ เช…เชจเซ‡ เชฆเชฐเซ‡เช• เชตเชธเซเชคเซเชจเซ‡ เชเช• เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€เชฎเชพเช‚ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเชตเชพเชจเซเช‚ เชธเซŒเชฅเซ€ เช…เชจเซเช•เซ‚เชณ เชฒเชพเช—เซเชฏเซเช‚.

เชธเชฐเชณ เชชเซเชฒเซ‡เชฌเซเช•

เชชเซเชฒเซ‡เชฌเซเช• เช เชเช• yml เชซเชพเช‡เชฒ เช›เซ‡ เชœเซ‡, เชตเชฟเชถเชฟเชทเซเชŸ เชตเชพเช•เซเชฏเชฐเชšเชจเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡, Ansible เชถเซเช‚ เช…เชจเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชฐเชตเซเช‚ เชœเซ‹เชˆเช เชคเซ‡เชจเซเช‚ เชตเชฐเซเชฃเชจ เช•เชฐเซ‡ เช›เซ‡. เชšเชพเชฒเซ‹ เชชเซเชฐเชฅเชฎ เชชเซเชฒเซ‡เชฌเซเช• เชฌเชจเชพเชตเซ€เช เชœเซ‡ เช•เช‚เชˆ เช•เชฐเชคเซเช‚ เชจเชฅเซ€:

---
- name: Simple playbook
  hosts: all

เช…เชนเซ€เช‚ เช†เชชเชฃเซ‡ เช–เชพเชฒเซ€ เช•เชนเซ€เช เช›เซ€เช เช•เซ‡ เช…เชฎเชพเชฐเซ€ เชชเซเชฒเซ‡เชฌเซเช• เช•เชนเซ‡เชตเชพเชฏ เช›เซ‡ Simple Playbook เช…เชจเซ‡ เชคเซ‡ เช•เซ‡ เชคเซ‡เชจเชพ เชธเชฎเชพเชตเชฟเชทเซเชŸเซ‹ เชฌเชงเชพ เชฏเชœเชฎเชพเชจเซ‹ เชฎเชพเชŸเซ‡ เชšเชฒเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡. เช…เชฎเซ‡ เชคเซ‡เชจเซ‡ เชจเชพเชฎ เชธเชพเชฅเซ‡ /ansible เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เชฎเชพเช‚ เชธเชพเชšเชตเซ€ เชถเช•เซ€เช เช›เซ€เช playbook.yml เช…เชจเซ‡ เชšเชฒเชพเชตเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซ‹:

ansible-playbook ./playbook.yml

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

เช…เชจเซเชธเชฟเชฌเชฒ เช•เชนเซ‡ เช›เซ‡ เช•เซ‡ เชคเซ‡ เช•เซ‹เชˆเชชเชฃ เชนเซ‹เชธเซเชŸเชจเซ‡ เชœเชพเชฃเชคเซเช‚ เชจเชฅเซ€ เชœเซ‡ เชฌเชงเซ€ เชธเซ‚เชšเชฟ เชธเชพเชฅเซ‡ เชฎเซ‡เชณ เช–เชพเชคเซเช‚ เชนเซ‹เชฏ. เชคเซ‡เช“ เชเช• เช–เชพเชธ เชฏเชพเชฆเซ€ เชฅเชฏเซ‡เชฒ เชนเซ‹เชตเซเช‚ เชœ เชœเซ‹เชˆเช เช‡เชจเซเชตเซ‡เชจเซเชŸเชฐเซ€ เชซเชพเช‡เชฒ.

เชšเชพเชฒเซ‹ เชคเซ‡เชจเซ‡ เช เชœ เชœเชตเชพเชฌเชฆเชพเชฐ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เชฎเชพเช‚ เชฌเชจเชพเชตเซ€เช:

123.123.123.123

เช† เชฐเซ€เชคเซ‡ เช…เชฎเซ‡ เชซเช•เซเชค เชนเซ‹เชธเซเชŸเชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเซ€เช เช›เซ€เช (เช†เชฆเชฐเซเชถ เชฐเซ€เชคเซ‡ เชชเชฐเซ€เช•เซเชทเชฃ เชฎเชพเชŸเซ‡ เช…เชฎเชพเชฐเชพ VPSเชจเซเช‚ เชฏเชœเชฎเชพเชจ, เช…เชฅเชตเชพ เชคเชฎเซ‡ เชฒเซ‹เช•เชฒเชนเซ‹เชธเซเชŸ เชฐเชœเซ€เชธเซเชŸเชฐ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹) เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชจเชพเชฎ เชนเซ‡เช เชณ เชธเชพเชšเชตเซ€เช เช›เซ€เช. inventory.
เชคเชฎเซ‡ เช‡เชจเซเชตเซ‡เชŸเชฐเซ€ เชซเชพเช‡เชฒ เชธเชพเชฅเซ‡ เชœเชตเชพเชฌ เช†เชชเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹:

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

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

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

เชœเซ‹ เชคเชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชจเชฟเชฐเซเชฆเชฟเชทเซเชŸ เชนเซ‹เชธเซเชŸเชจเซ€ ssh เชเช•เซเชธเซ‡เชธ เชนเซ‹เชฏ, เชคเซ‹ เชœเชตเชพเชฌเซ€เชฌเชฒ เช•เชจเซ‡เช•เซเชŸ เช•เชฐเชถเซ‡ เช…เชจเซ‡ เชฐเซ€เชฎเซ‹เชŸ เชธเชฟเชธเซเชŸเชฎ เชตเชฟเชถเซ‡เชจเซ€ เชฎเชพเชนเชฟเชคเซ€ เชเช•เชคเซเชฐเชฟเชค เช•เชฐเชถเซ‡. (เชกเชฟเชซเซ‰เชฒเซเชŸ เชŸเชพเชธเซเช• [เช—เซ‡เชงเชฐเชฟเช‚เช— เชซเซ‡เช•เซเชŸเซเชธ]) เชœเซ‡ เชชเช›เซ€ เชคเซ‡ เชเช•เซเชเซ‡เช•เซเชฏเซเชถเชจ เชชเชฐ เชŸเซ‚เช‚เช•เซ€ เชฐเชฟเชชเซ‹เชฐเซเชŸ เช†เชชเชถเซ‡ (RECAP เชชเซเชฒเซ‡ เช•เชฐเซ‹).

เชฎเซ‚เชณเชญเซ‚เชค เชฐเซ€เชคเซ‡, เชœเซ‹เชกเชพเชฃ เช เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเชพเชฎเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡ เช•เซ‡ เชœเซ‡เชจเชพ เชนเซ‡เช เชณ เชคเชฎเซ‡ เชธเชฟเชธเซเชŸเชฎเชฎเชพเช‚ เชฒเซ‰เช— เช‡เชจ เชฅเชฏเชพ เช›เซ‹. เชคเซ‡ เชฎเซ‹เชŸเซ‡ เชญเชพเช—เซ‡ เชนเซ‹เชธเซเชŸ เชชเชฐ เชฐเชนเซ‡เชถเซ‡ เชจเชนเซ€เช‚. เชชเซเชฒเซ‡เชฌเซเช• เชซเชพเช‡เชฒเชฎเชพเช‚, เชคเชฎเซ‡ remote_user เชกเชพเชฏเชฐเซ‡เช•เซเชŸเชฟเชตเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เชจเซ‡เช•เซเชŸ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช•เชฏเชพ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเซ‹ เชคเซ‡เชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹. เช‰เชชเชฐเชพเช‚เชค, เชฐเชฟเชฎเซ‹เชŸ เชธเชฟเชธเซเชŸเชฎ เชตเชฟเชถเซ‡เชจเซ€ เชฎเชพเชนเชฟเชคเซ€ เชคเชฎเชพเชฐเชพ เชฎเชพเชŸเซ‡ เช˜เชฃเซ€เชตเชพเชฐ เชฌเชฟเชจเชœเชฐเซ‚เชฐเซ€ เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเชฎเชพเชฐเซ‡ เชคเซ‡เชจเซ‡ เชเช•เชคเซเชฐเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เชธเชฎเชฏ เชฌเช—เชพเชกเชตเซ‹ เชœเซ‹เชˆเช เชจเชนเซ€เช‚. เช† เช•เชพเชฐเซเชฏเชจเซ‡ เช…เช•เซเชทเชฎ เชชเชฃ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡:

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

เชชเซเชฒเซ‡เชฌเซเช•เชจเซ‡ เชซเชฐเซ€เชฅเซ€ เชšเชฒเชพเชตเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซ‹ เช…เชจเซ‡ เช–เชพเชคเชฐเซ€ เช•เชฐเซ‹ เช•เซ‡ เช•เชจเซ‡เช•เซเชถเชจ เช•เชพเชฎ เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡. (เชœเซ‹ เชคเชฎเซ‡ เชฐเซ‚เชŸ เชฏเซเชเชฐเชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเซเชฏเซ‹ เช›เซ‡, เชคเซ‹ เชคเชฎเชพเชฐเซ‡ เชเชฒเชฟเชตเซ‡เชŸเซ‡เชก เช…เชงเชฟเช•เชพเชฐเซ‹ เชฎเซ‡เชณเชตเชตเชพ เชฎเชพเชŸเซ‡ become: true เชกเชพเชฏเชฐเซ‡เช•เซเชŸเชฟเชต เชชเชฃ เชธเซเชชเชทเซเชŸ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เชฐเชฃเชฎเชพเช‚ เชฒเช–เซเชฏเชพ เชชเซเชฐเชฎเชพเชฃเซ‡: become set to โ€˜trueโ€™/โ€™yesโ€™ to activate privilege escalation. เชœเซ‹ เช•เซ‡ เชคเซ‡ เชถเชพ เชฎเชพเชŸเซ‡ เชธเช‚เชชเซ‚เชฐเซเชฃเชชเชฃเซ‡ เชธเซเชชเชทเซเชŸ เชจเชฅเซ€).

เช•เชฆเชพเชš เชคเชฎเชจเซ‡ เช เชนเช•เซ€เช•เชคเชจเซ‡ เช•เชพเชฐเชฃเซ‡ เชญเซ‚เชฒ เชชเซเชฐเชพเชชเซเชค เชฅเชถเซ‡ เช•เซ‡ เชœเชตเชพเชฌเซ€ เชชเชพเชฏเชฅเซ‹เชจ เชฆเซเชญเชพเชทเชฟเชฏเชพเชจเซ‡ เชจเชฟเชฐเซเชงเชพเชฐเชฟเชค เช•เชฐเซ€ เชถเช•เชคเซเช‚ เชจเชฅเซ€, เชชเช›เซ€ เชคเชฎเซ‡ เชคเซ‡เชจเซ‡ เชœเชพเชคเซ‡ เชœ เชธเซเชชเชทเซเชŸ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹:

ansible_python_interpreter: /usr/bin/python3 

เชคเชฎเซ‡ เช†เชฆเซ‡เชถ เชตเชกเซ‡ เชถเซ‹เชงเซ€ เชถเช•เซ‹ เช›เซ‹ เช•เซ‡ เชคเชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชชเชพเชฏเชฅเซ‹เชจ เช•เซเชฏเชพเช‚ เช›เซ‡ whereis python.

เชธเชฟเชธเซเชŸเชฎ เชชเซ‡เช•เซ‡เชœเซ‹ เชธเซเชฅเชพเชชเชฟเชค เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช

Ansible เชจเชพ เชชเซเชฐเชฎเชพเชฃเชญเซ‚เชค เชตเชฟเชคเชฐเชฃเชฎเชพเช‚ เชตเชฟเชตเชฟเชง เชธเชฟเชธเซเชŸเชฎ เชชเซ‡เช•เซ‡เชœเซ‹ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช˜เชฃเชพ เชฎเซ‹เชกเซเชฏเซเชฒเซ‹เชจเซ‹ เชธเชฎเชพเชตเซ‡เชถ เชฅเชพเชฏ เช›เซ‡, เชคเซ‡เชฅเซ€ เช…เชฎเชพเชฐเซ‡ เช•เซ‹เชˆเชชเชฃ เช•เชพเชฐเชฃเซ‹เชธเชฐ เชฌเซ‡เชถ เชธเซเช•เซเชฐเชฟเชชเซเชŸเซ‹ เชฒเช–เชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชจเชฅเซ€. เชนเชตเซ‡ เช…เชฎเชจเซ‡ เชธเชฟเชธเซเชŸเชฎ เช…เชชเชกเซ‡เชŸ เช•เชฐเชตเชพ เช…เชจเซ‡ เชธเชฟเชธเซเชŸเชฎ เชชเซ‡เช•เซ‡เชœเซ‹ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช† เชฎเซ‹เชกเซเชฏเซเชฒเซ‹เชฎเชพเช‚เชฅเซ€ เชเช•เชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชฎเชพเชฐเชพ 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

เชŸเชพเชธเซเช• เชฌเชฐเชพเชฌเชฐ เช เชœ เช•เชพเชฐเซเชฏ เช›เซ‡ เชœเซ‡ Ansible เชฐเชฟเชฎเซ‹เชŸ เชธเชฐเซเชตเชฐเซเชธ เชชเชฐ เช•เชฐเชถเซ‡. เช…เชฎเซ‡ เช•เชพเชฐเซเชฏเชจเซ‡ เชเช• เชจเชพเชฎ เช†เชชเซ€เช เช›เซ€เช เชœเซ‡เชฅเซ€ เช•เชฐเซ€เชจเซ‡ เช…เชฎเซ‡ เชฒเซ‹เช—เชฎเชพเช‚ เชคเซ‡เชจเชพ เช…เชฎเชฒเชจเซ‡ เชŸเซเชฐเซ…เช• เช•เชฐเซ€ เชถเช•เซ€เช. เช…เชจเซ‡ เช…เชฎเซ‡ เชตเชฟเชถเชฟเชทเซเชŸ เชฎเซ‹เชกเซเชฏเซเชฒเชจเชพ เชตเชพเช•เซเชฏเชฐเชšเชจเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡, เชคเซ‡เชจเซ‡ เชถเซเช‚ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เชคเซ‡เชจเซเช‚ เชตเชฐเซเชฃเชจ เช•เชฐเซ€เช เช›เซ€เช. เช† เชฌเชพเชฌเชคเซ‡ apt: update_cache=yes - เชเชชเซเชŸ เชฎเซ‹เชกเซเชฏเซเชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชธเชฟเชธเซเชŸเชฎ เชชเซ‡เช•เซ‡เชœเซ‹เชจเซ‡ เช…เชชเชกเซ‡เชŸ เช•เชฐเชตเชพเชจเซเช‚ เช•เชนเซ‡ เช›เซ‡. เชฌเซ€เชœเซ‹ เช†เชฆเซ‡เชถ เชฅเซ‹เชกเซ‹ เชตเชงเซ เชœเชŸเชฟเชฒ เช›เซ‡. เช…เชฎเซ‡ apt เชฎเซ‹เชกเซเชฏเซเชฒเชจเซ‡ เชชเซ‡เช•เซ‡เชœเซ‹เชจเซ€ เชฏเชพเชฆเซ€ เช†เชชเซ€เช เช›เซ€เช เช…เชจเซ‡ เช•เชนเซ€เช เช›เซ€เช เช•เซ‡ เชคเซ‡ เช›เซ‡ state เชฌเชจเซ€ เชœเชตเซเช‚ เชœเซ‹เชˆเช present, เชเชŸเชฒเซ‡ เช•เซ‡, เช…เชฎเซ‡ เช•เชนเซ€เช เช›เซ€เช เช•เซ‡ เช† เชชเซ‡เช•เซ‡เชœเซ‹ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ‹. เชเชตเซ€ เชœ เชฐเซ€เชคเซ‡, เช…เชฎเซ‡ เชคเซ‡เชฎเชจเซ‡ เช•เชพเชขเซ€ เชจเชพเช–เชตเชพ เชฎเชพเชŸเซ‡ เช•เชนเซ€ เชถเช•เซ€เช เช›เซ€เช เช…เชฅเชตเชพ เชซเช•เซเชค เชฌเชฆเชฒเซ€เชจเซ‡ เช…เชชเชกเซ‡เชŸ เช•เชฐเซ€ เชถเช•เซ€เช เช›เซ€เช state. เชฎเชนเซ‡เชฐเชฌเชพเชจเซ€ เช•เชฐเซ€เชจเซ‡ เชจเซ‹เช‚เชง เช•เชฐเซ‹ เช•เซ‡ เชฐเซ‡เชฒเซเชธ postgresql เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช…เชฎเชจเซ‡ postgresql-contrib เชชเซ‡เช•เซ‡เชœเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡, เชœเซ‡ เช…เชฎเซ‡ เชนเชตเซ‡ เชธเซเชฅเชพเชชเชฟเชค เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช. เชซเชฐเซ€เชฅเซ€, เชคเชฎเชพเชฐเซ‡ เช† เชœเชพเชฃเชตเชพเชจเซ€ เช…เชจเซ‡ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡; เชคเซ‡เชจเชพ เชชเซ‹เชคเชพเชจเชพ เชชเชฐ เชœเชตเชพเชฌเชฆเชพเชฐ เช† เช•เชฐเชถเซ‡ เชจเชนเซ€เช‚.

เชชเซเชฒเซ‡เชฌเซเช•เชจเซ‡ เชซเชฐเซ€เชฅเซ€ เชšเชฒเชพเชตเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซ‹ เช…เชจเซ‡ เชคเชชเชพเชธเซ‹ เช•เซ‡ เชชเซ‡เช•เซ‡เชœเซ‹ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ‡เชฒเชพ เช›เซ‡.

เชจเชตเชพ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“ เชฌเชจเชพเชตเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช.

เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, 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') }}". เชฌเชพเชฌเชค เช เช›เซ‡ เช•เซ‡ เชœเชตเชพเชฌเซ€เชฌเชฒ เชฆเซเชตเชพเชฐเชพ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเซ‡ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชคเซเช‚ เชจเชฅเซ€ 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"

เชฌเชงเซเช‚ เชเช•เชฆเชฎ เชธเชฐเชณ เช›เซ‡, เช…เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชœเซ‚เชฅเซ‹ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชเช• เชœเซ‚เชฅ เชฎเซ‹เชกเซเชฏเซเชฒ เชชเชฃ เช›เซ‡, เชœเซ‡เชฎเชพเช‚ เชตเชพเช•เซเชฏเชฐเชšเชจเชพ เช–เซ‚เชฌ เชœ เชฏเซ‹เช—เซเชฏ เช›เซ‡. เชชเช›เซ€ เช† เชœเซ‚เชฅเชจเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเซ‡ เชจเซ‹เช‚เชงเชฃเซ€ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชคเซ‡ เชชเซ‚เชฐเชคเซเช‚ เช›เซ‡ (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

เชนเชตเซ‡ เช†เชชเชฃเชจเซ‡ เชซเชพเช‡เชฒเซ‹ เช…เชจเซ‡ เชŸเซ‡เชฎเซเชชเชฒเซ‡เชŸเซเชธเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เชคเซ‡เชฎเชจเซ€ เชตเชšเซเชšเซ‡เชจเซ‹ เชคเชซเชพเชตเชค เช เช›เซ‡ เช•เซ‡ เชœเชตเชพเชฌเซ€เชฆเชพเชฐ เชซเชพเช‡เชฒเซ‹เชจเซ€ เชธเซ€เชงเซ€ เชจเช•เชฒ เช•เชฐเซ‡ เช›เซ‡, เชœเซ‡เชฎ เช›เซ‡. เช…เชจเซ‡ เชŸเซ‡เชฎเซเชชเชฒเซ‡เชŸเซเชธเชฎเชพเช‚ j2 เชเช•เซเชธเซเชŸเซ‡เช‚เชถเชจ เชนเซ‹เชตเซเช‚ เช†เชตเชถเซเชฏเช• เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เช“ เชธเชฎเชพเชจ เชกเชฌเชฒ เช•เชฐเซเชฒเซ€ เช•เซŒเช‚เชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชšเชฒ เชฎเซ‚เชฒเซเชฏเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡.

เชšเชพเชฒเซ‹ nginx เชจเซ‡ เชธเช•เซเชทเชฎ เช•เชฐเซ€เช main.yml เชซเชพเช‡เชฒ เช† เชฎเชพเชŸเซ‡ เช…เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชเช• systemd เชฎเซ‹เชกเซเชฏเซเชฒ เช›เซ‡:

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

เช…เชนเซ€เช‚ เช…เชฎเซ‡ เชฎเชพเชคเซเชฐ เชเชŸเชฒเซเช‚ เชœ เช•เชนเซ€ เชถเช•เชคเชพ เชจเชฅเซ€ เช•เซ‡ nginx เชถเชฐเซ‚ เช•เชฐเชตเซเช‚ เช†เชตเชถเซเชฏเช• เช›เซ‡ (เชเชŸเชฒเซ‡ โ€‹โ€‹โ€‹โ€‹เช•เซ‡, เช…เชฎเซ‡ เชคเซ‡เชจเซ‡ เชฒเซ‹เชจเซเชš เช•เชฐเซ€เช เช›เซ€เช), เชชเชฐเช‚เชคเซ เช…เชฎเซ‡ เชคเชฐเชค เชœ เช•เชนเซ€เช เช›เซ€เช เช•เซ‡ เชคเซ‡ เชธเช•เซเชทเชฎ เชนเซ‹เชตเซเช‚ เชœเซ‹เชˆเช.
เชนเชตเซ‡ เชšเชพเชฒเซ‹ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชซเชพเช‡เชฒเซ‹เชจเซ€ เชจเช•เชฒ เช•เชฐเซ€เช:

# 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 เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชซเชพเช‡เชฒ เชฌเชจเชพเชตเซ€เช เช›เซ€เช (เชคเชฎเซ‡ เชคเซ‡เชจเซ‡ เชธเซ€เชงเชพ เชธเชฐเซเชตเชฐเชฎเชพเช‚เชฅเซ€ เชฒเชˆ เชถเช•เซ‹ เช›เซ‹, เช…เชฅเชตเชพ เชคเซ‡เชจเซ‡ เชœเชพเชคเซ‡ เชฒเช–เซ€ เชถเช•เซ‹ เช›เซ‹). เช…เชจเซ‡ เชธเชพเช‡เชŸเซเชธ_เช‰เชชเชฒเชฌเซเชง เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เชฎเชพเช‚ เช…เชฎเชพเชฐเซ€ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชฎเชพเชŸเซ‡เชจเซ€ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชซเชพเช‡เชฒ เชชเชฃ (เช† เชœเชฐเซ‚เชฐเซ€ เชจเชฅเซ€ เชชเชฃ เช‰เชชเชฏเซ‹เช—เซ€ เช›เซ‡). เชชเซเชฐเชฅเชฎ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เช…เชฎเซ‡ เชซเชพเช‡เชฒเซ‹เชจเซ€ เชจเช•เชฒ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช•เซ‰เชชเชฟ เชฎเซ‹เชกเซเชฏเซเชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เช เช›เซ€เช (เชซเชพเช‡เชฒ เชคเซ‡เชฎเชพเช‚ เชนเซ‹เชตเซ€ เช†เชตเชถเซเชฏเช• เช›เซ‡ /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 เชจเซ‡ เชชเซเชจเชƒเชชเซเชฐเชพเชฐเช‚เชญ เช•เชฐเชตเชพเชจเซ‹ เช•เซ‹เชˆ เช…เชฐเซเชฅ เชจเชฅเซ€. เชถเซเช‚ เชคเชฎเซ‡ เชจเซ‹เช‚เชงเซเชฏเซเช‚ เช›เซ‡ เช•เซ‡ เช…เชฎเซ‡ เช†เชฆเซ‡เชถเซ‹ เชฒเช–เชคเชพ เชจเชฅเซ€ เชœเซ‡เชฎ เช•เซ‡: โ€œเช†เชจเซ‡ เช† เชฐเซ€เชคเซ‡ เช•เชฐเซ‹โ€, เชธเชฟเชจเซเชŸเซ‡เช•เซเชธ เชตเชงเซ เชฆเซ‡เช–เชพเชฏ เช›เซ‡ โ€œเช†เชฎเชพเช‚ เช† เชธเซเชฅเชฟเชคเชฟ เชนเซ‹เชตเซ€ เชœเซ‹เชˆเชโ€. เช…เชจเซ‡ เชฎเซ‹เชŸเซ‡ เชญเชพเช—เซ‡ เช† เชฌเชฐเชพเชฌเชฐ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชœเชตเชพเชฌเชฆเชพเชฐ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡. เชœเซ‹ เชœเซ‚เชฅ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เช…เชธเซเชคเชฟเชคเซเชตเชฎเชพเช‚ เช›เซ‡, เช…เชฅเชตเชพ เชธเชฟเชธเซเชŸเชฎ เชชเซ‡เช•เซ‡เชœ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ‡เชฒเซเช‚ เช›เซ‡, เชคเซ‹ เชœเชตเชพเชฌเซ€เชฌเชฒ เช† เชฎเชพเชŸเซ‡ เชคเชชเชพเชธ เช•เชฐเชถเซ‡ เช…เชจเซ‡ เช•เชพเชฐเซเชฏเชจเซ‡ เช›เซ‹เชกเซ€ เชฆเซ‡เชถเซ‡. เช‰เชชเชฐเชพเช‚เชค, เชœเซ‹ เชซเชพเช‡เชฒเซ‹ เชธเชฐเซเชตเชฐ เชชเชฐ เชชเชนเซ‡เชฒเชพเชฅเซ€ เชœ เช›เซ‡ เชคเซ‡ เชธเชพเชฅเซ‡ เชธเช‚เชชเซ‚เชฐเซเชฃเชชเชฃเซ‡ เชฎเซ‡เชณ เช–เชพเชคเซ€ เชนเซ‹เชฏ เชคเซ‹ เชคเซ‡เชจเซ€ เชจเช•เชฒ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ เชจเชนเซ€เช‚. เช…เชฎเซ‡ เช†เชจเซ‹ เชฒเชพเชญ เชฒเชˆ เชถเช•เซ€เช เช›เซ€เช เช…เชจเซ‡ เชœเซ‹ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชซเชพเชˆเชฒเซ‹ เชฌเชฆเชฒเชพเชˆ เช—เชˆ เชนเซ‹เชฏ เชคเซ‹ เชœ 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 เชธเซเชฏเซ‹เชœเชฟเชค เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช

เช†เชชเชฃเซ‡ nginx เชจเซ€ เชœเซ‡เชฎ เชœ systemd เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ postgresql เชจเซ‡ เชธเช•เซเชทเชฎ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡, เช…เชจเซ‡ เชเช• เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชชเชฃ เชฌเชจเชพเชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เชœเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช†เชชเชฃเซ‡ เชกเซ‡เชŸเชพเชฌเซ‡เช เช…เชจเซ‡ เชกเซ‡เชŸเชพเชฌเซ‡เชเชจเซ‡ เชเช•เซเชธเซ‡เชธ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช•เชฐเซ€เชถเซเช‚.
เชšเชพเชฒเซ‹ เชเช• เชญเซ‚เชฎเชฟเช•เชพ เชฌเชจเชพเชตเซ€เช /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 เชฆเซเชตเชพเชฐเชพ เชฐเซ‚เชฌเซ€ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

rbenv เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ Ansible เชชเชพเชธเซ‡ เชฎเซ‹เชกเซเชฏเซเชฒเซ‹ เชจเชฅเซ€, เชชเชฐเช‚เชคเซ เชคเซ‡ เช—เชฟเชŸ เชฐเชฟเชชเซ‹เชเซ€เชŸเชฐเซ€เชจเซ‡ เช•เซเชฒเซ‹เชจ เช•เชฐเซ€เชจเซ‡ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ‡เชฒเซเช‚ เช›เซ‡. เชคเซ‡เชฅเซ€, เช† เชธเชฎเชธเซเชฏเชพ เชธเซŒเชฅเซ€ เชฌเชฟเชจ-เชฎเชพเชจเช• เชฌเชจเซ€ เชœเชพเชฏ เช›เซ‡. เชšเชพเชฒเซ‹ เชคเซ‡เชจเชพ เชฎเชพเชŸเซ‡ เชเช• เชญเซ‚เชฎเชฟเช•เชพ เชฌเชจเชพเชตเซ€เช /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 เชคเซ‡เชจเซ€ เชนเซ‹เชฎ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เชฎเชพเช‚ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ‡เชฒเซเช‚ เช›เซ‡, เช…เชจเซ‡ เชตเซˆเชถเซเชตเชฟเช• เชฐเซ€เชคเซ‡ เชจเชนเซ€เช‚. เช…เชจเซ‡ เช…เชฎเซ‡ เชฐเซ‡เชชเซ‹ เช…เชจเซ‡ เชกเซ‡เชธเซเชŸเชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเซ€เชจเซ‡ เชฐเชฟเชชเซ‹เชเซ€เชŸเชฐเซ€เชจเซ‡ เช•เซเชฒเซ‹เชจ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช—เชฟเชŸ เชฎเซ‹เชกเซเชฏเซเชฒเชจเซ‹ เชชเชฃ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เช เช›เซ€เช.

เช†เช—เชณ, เช†เชชเชฃเซ‡ bashrc เชฎเชพเช‚ rbenv init เชฐเชœเซ€เชธเซเชŸเชฐ เช•เชฐเชตเชพเชจเซ€ เช…เชจเซ‡ เชคเซเชฏเชพเช‚ PATH เชฎเชพเช‚ rbenv เช‰เชฎเซ‡เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เช† เชฎเชพเชŸเซ‡ เช…เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ 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 -)"'

เชชเช›เซ€ เชคเชฎเชพเชฐเซ‡ เชฐเซ‚เชฌเซ€_เชฌเชฟเชฒเซเชก เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡:

- 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 เชจเซ‡ เช˜เชฃเซ€เชตเชพเชฐ เชตเชงเชพเชฐเชพเชจเซ€ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชซเชพเชˆเชฒเซ‹เชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเซ‡ เช›เซ‡, เชœเซ‡เชฎ เช•เซ‡ database.yml เช…เชฅเชตเชพ .env เชคเซ‡เช“ nginx เชฎเชพเชŸเซ‡ เชซเชพเช‡เชฒเซ‹ เช…เชจเซ‡ เชจเชฎเซ‚เชจเชพเช“เชจเซ€ เชœเซ‡เชฎ เชœ เช•เซ‰เชชเชฟ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡. เชคเซเชฏเชพเช‚ เชฎเชพเชคเซเชฐ เชเช• เชธเซ‚เช•เซเชทเซเชฎเชคเชพ เช›เซ‡. เชซเชพเช‡เชฒเซ‹เชจเซ€ เชจเช•เชฒ เช•เชฐเชคเชพ เชชเชนเซ‡เชฒเชพ, เชคเชฎเชพเชฐเซ‡ เชคเซ‡เชฎเชจเชพ เชฎเชพเชŸเซ‡ เชเช• เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€ เชฎเชพเชณเช–เซเช‚ เชฌเชจเชพเชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡, เช•เช‚เชˆเช• เช†เชจเชพ เชœเซ‡เชตเซเช‚:

# 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 (เช…เชนเซ€เช‚ เชคเชฎเซ‡ เชฏเชœเชฎเชพเชจเซ‹เชจเชพ เชœเซเชฆเชพ เชœเซเชฆเชพ เชœเซ‚เชฅเซ‹ เชฎเชพเชŸเซ‡ เชตเชฟเชตเชฟเชง เชซเชพเช‡เชฒเซ‹ เชฌเชจเชพเชตเซ€ เชถเช•เซ‹ เช›เซ‹, เชœเซ‡เชฎ เช•เซ‡ เช‡เชจเซเชตเซ‡เชจเซเชŸเชฐเซ€ เชซเชพเช‡เชฒเชฎเชพเช‚: 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-playbook -i inventory ./playbook.yml -l "staging" --ask-vault-pass

เชชเชฐเช‚เชคเซ เชนเซเช‚ เชคเชฎเชจเซ‡ เชชเซเชฒเซ‡เชฌเซเช• เช…เชจเซ‡ เชญเซ‚เชฎเชฟเช•เชพเช“เชจเซเช‚ เชธเช‚เชชเซ‚เชฐเซเชฃ เชฒเช–เชพเชฃ เช†เชชเซ€เชถ เชจเชนเซ€เช‚, เชคเซ‡ เชœเชพเชคเซ‡ เชฒเช–เซ‹. เช•เชพเชฐเชฃ เช•เซ‡ เชœเชตเชพเชฌเซ€ เชเชตเซเช‚ เช›เซ‡ - เชœเซ‹ เชคเชฎเซ‡ เชธเชฎเชœเซ€ เชถเช•เชคเชพ เชจเชฅเซ€ เช•เซ‡ เชถเซเช‚ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡, เชคเซ‹ เชคเซ‡ เชคเชฎเชพเชฐเชพ เชฎเชพเชŸเซ‡ เชคเซ‡ เช•เชฐเชถเซ‡ เชจเชนเซ€เช‚.

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹