เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป€เบŠเบตเบšเป€เบงเบตเป€เบžเบทเปˆเบญเบ™เบณเปƒเบŠเป‰เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ Rails เป‚เบ”เบเปƒเบŠเป‰ Ansible

เบšเปเปˆเบ”เบปเบ™เบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบตเป‰เบ‚เป‰เบญเบเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบ‚เบฝเบ™เบ›เบทเป‰เบกเบซเบผเบดเป‰เบ™ Ansible เบซเบผเบฒเบเบญเบฑเบ™เป€เบžเบทเปˆเบญเบเบฐเบเบฝเบกเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ Rails. เปเบฅเบฐ, เป€เบ›เบฑเบ™เป€เบฅเบทเปˆเบญเบ‡เปเบ›เบเบ—เบตเปˆ, เบ‚เป‰เบญเบเบšเปเปˆเบžเบปเบšเบ„เบนเปˆเบกเบทเบ‚เบฑเป‰เบ™เบ•เบญเบ™เป‚เบ”เบเบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ‡เปˆเบฒเบเป†. เบ‚เป‰เบญเบเบšเปเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบ„เบฑเบ”เบฅเบญเบเบ›เบทเป‰เบกเบซเบผเบตเป‰เบ™เบ‚เบญเบ‡เบ„เบปเบ™เบญเบทเปˆเบ™เป‚เบ”เบเบ—เบตเปˆเบšเปเปˆเป€เบ‚เบปเป‰เบฒเปƒเบˆเบชเบดเปˆเบ‡เบ—เบตเปˆเป€เบเบตเบ”เบ‚เบทเป‰เบ™, เปเบฅเบฐเปƒเบ™เบ—เบตเปˆเบชเบธเบ”เบ‚เป‰เบญเบเบ•เป‰เบญเบ‡เบญเปˆเบฒเบ™เป€เบญเบเบฐเบชเบฒเบ™, เป€เบเบฑเบšเบ—เบธเบเบขเปˆเบฒเบ‡เบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡. เบšเบฒเบ‡เบ—เบตเบ‚เป‰เบญเบเบชเบฒเบกเบฒเบ”เบŠเปˆเบงเบเบœเบนเป‰เปƒเบ”เบœเบนเป‰เบซเบ™เบถเปˆเบ‡เป€เบฅเบฑเปˆเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ™เบตเป‰เบ”เป‰เบงเบเบเบฒเบ™เบŠเปˆเบงเบเป€เบซเบผเบทเบญเบ‚เบญเบ‡เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰.

เบชเบดเปˆเบ‡เบ—เปเบฒเบญเบดเบ”เบ—เบตเปˆเป€เบ‚เบปเป‰เบฒเปƒเบˆเปเบกเปˆเบ™เบงเปˆเบฒ ansible เปƒเบซเป‰เบ—เปˆเบฒเบ™เบกเบตเบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบ—เบตเปˆเบชเบฐเบ”เบงเบเปƒเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เป„เบงเป‰เบฅเปˆเบงเบ‡เบซเบ™เป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบซเปˆเบฒเบ‡เป„เบเบชเบญเบเบซเบผเบตเบเบœเปˆเบฒเบ™ SSH. เบšเปเปˆเบกเบต magic เบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰, เบ—เปˆเบฒเบ™เบšเปเปˆเบชเบฒเบกเบฒเบ”เบ•เบดเบ”เบ•เบฑเป‰เบ‡ plugin เปเบฅเบฐเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบขเบธเบ”เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เบญเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบเบฑเบš docker, เบเบฒเบ™เบ•เบดเบ”เบ•เบฒเบกเปเบฅเบฐเบชเบดเปˆเบ‡เบ”เบตเป†เบญเบทเปˆเบ™เป†เบญเบญเบเบˆเบฒเบเบเปˆเบญเบ‡. เป€เบžเบทเปˆเบญเบ‚เบฝเบ™เบšเบปเบ”เบฅเบฐเบ„เบญเบ™, เป€เบˆเบปเป‰เบฒเบ•เป‰เบญเบ‡เบฎเบนเป‰เบงเปˆเบฒเป€เบˆเบปเป‰เบฒเบขเบฒเบเป€เบฎเบฑเบ”เบญเบฑเบ™เปƒเบ” เปเบฅเบฐ เป€เบฎเบฑเบ”เปเบ™เบงเปƒเบ”. เบ™เบฑเป‰เบ™เปเบกเปˆเบ™เป€เบซเบ”เบœเบปเบ™เบ—เบตเปˆเบ‚เป‰เบญเบเบšเปเปˆเบžเปเปƒเบˆเบเบฑเบšเบ›เบทเป‰เบกเบซเบผเบดเป‰เบ™เบ—เบตเปˆเบเบฝเบกเบžเป‰เบญเบกเบˆเบฒเบ GitHub, เบซเบผเบทเบšเบปเบ”เบ„เบงเบฒเบกเป€เบŠเบฑเปˆเบ™: "เบ„เบฑเบ”เบฅเบญเบเปเบฅเบฐเปเบฅเปˆเบ™, เบกเบฑเบ™เบˆเบฐเป€เบฎเบฑเบ”เบงเบฝเบ."

เบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบซเบเบฑเบ‡?

เบ”เบฑเปˆเบ‡เบ—เบตเปˆเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เป€เบงเบปเป‰เบฒเบกเบฒเปเบฅเป‰เบง, เป€เบžเบทเปˆเบญเบ‚เบฝเบ™เบ›เบทเป‰เบกเบซเบผเบตเป‰เบ™, เบ—เปˆเบฒเบ™ เบˆเบณ เป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบฎเบนเป‰เบงเปˆเบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบฎเบฑเบ”เปเบฅเบฐเป€เบฎเบฑเบ”เปเบ™เบงเปƒเบ”. เปƒเบซเป‰เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบซเบเบฑเบ‡. เบชเปเบฒเบฅเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ Rails เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ•เป‰เบญเบ‡เบเบฒเบ™เบŠเบธเบ”เบฅเบฐเบšเบปเบšเบซเบผเบฒเบ: nginx, postgresql (redis, เปเบฅเบฐเบญเบทเปˆเบ™เป†). เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบชเบฐเบšเบฑเบšเบชเบฐเป€เบžเบฒเบฐเบ‚เบญเบ‡ ruby. เบกเบฑเบ™เบ”เบตเบ—เบตเปˆเบชเบธเบ”เบ—เบตเปˆเบˆเบฐเบ•เบดเบ”เบ•เบฑเป‰เบ‡เบกเบฑเบ™เบœเปˆเบฒเบ™ rbenv (rvm, asdf ... ). เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบ™เบตเป‰เป€เบ›เบฑเบ™เบœเบนเป‰เปƒเบŠเป‰เบฎเบฒเบเปเบกเปˆเบ™เบชเบฐเป€เบซเบกเบตเป€เบ›เบฑเบ™เบ„เบงเบฒเบกเบ„เบดเบ”เบ—เบตเปˆเบšเปเปˆเบ”เบต, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบชเป‰เบฒเบ‡เบœเบนเป‰เปƒเบŠเป‰เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเปเบฅเบฐเบเปเบฒเบ™เบปเบ”เบชเบดเบ”เบ—เบดเบ‚เบญเบ‡เบฅเบฒเบง. เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบตเป‰, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบญเบฑเบšเป‚เบซเบฅเบ”เบฅเบฐเบซเบฑเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเปƒเบชเปˆเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ, เบ„เบฑเบ”เบฅเบญเบเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบชเปเบฒเบฅเบฑเบš nginx, postgres, เปเบฅเบฐเบญเบทเปˆเบ™เป†เปเบฅเบฐเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบ—เบฑเบ‡เบซเบกเบปเบ”.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบฅเปเบฒเบ”เบฑเบšเบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เปเบกเปˆเบ™เบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

  1. เป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบšเป€เบ›เบฑเบ™เบฎเบฒเบ
  2. เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบŠเบธเบ”เบฅเบฐเบšเบปเบš
  3. เบชเป‰เบฒเบ‡เบœเบนเป‰เปƒเบŠเป‰เปƒเบซเบกเปˆ, เบเปเบฒเบ™เบปเบ”เบชเบดเบ”, เบฅเบฐเบซเบฑเบ” ssh
  4. เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบŠเบธเบ”เบฅเบฐเบšเบปเบš (nginx เปเบฅเบฐเบญเบทเปˆเบ™เป†) เปเบฅเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เปƒเบซเป‰เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒ
  5. เบžเบงเบเป€เบฎเบปเบฒเบชเป‰เบฒเบ‡เบœเบนเป‰เปƒเบŠเป‰เปƒเบ™เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™ (เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเป‰เบฒเบ‡เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เป„เบ”เป‰เบ—เบฑเบ™เบ—เบต)
  6. เป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบšเป€เบ›เบฑเบ™เบœเบนเป‰เปƒเบŠเป‰เปƒเบซเบกเปˆ
  7. เบ•เบดเบ”เบ•เบฑเป‰เบ‡ rbenv เปเบฅเบฐ ruby
  8. เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡ bundler เป„เบ”เป‰
  9. เบเบณเบฅเบฑเบ‡เบญเบฑเบšเป‚เบซเบฅเบ”เบฅเบฐเบซเบฑเบ”เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™
  10. เป€เบ›เบตเบ”เบ•เบปเบงเป€เบŠเบตเบšเป€เบงเบต Puma

เบเบดเปˆเบ‡เป„เบ›เบเบงเปˆเบฒเบ™เบฑเป‰เบ™, เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบชเบธเบ”เบ—เป‰เบฒเบเบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เป„เบ”เป‰เป‚เบ”เบเปƒเบŠเป‰ capistrano, เบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบเบญเบญเบเบˆเบฒเบเบเปˆเบญเบ‡เบกเบฑเบ™เบเปเปˆเบชเบฒเบกเบฒเบ”เบ„เบฑเบ”เบฅเบญเบเบฅเบฐเบซเบฑเบ”เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเบ›เปˆเบญเบ, เบ›เปˆเบฝเบ™เบเบฒเบ™เบ›เปˆเบญเบเบ”เป‰เบงเบ symlink เป€เบกเบทเปˆเบญเบ›เบฐเบชเบปเบšเบœเบปเบ™เบชเปเบฒเป€เบฅเบฑเบ”, เบ„เบฑเบ”เบฅเบญเบ configs เบˆเบฒเบเป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเบ—เบตเปˆเปƒเบŠเป‰เบฎเปˆเบงเบกเบเบฑเบ™, restart puma, เปเบฅเบฐเบญเบทเปˆเบ™เป†. เบ—เบฑเบ‡เบซเบกเบปเบ”เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เป„เบ”เป‰เป‚เบ”เบเปƒเบŠเป‰ Ansible, เปเบ•เปˆเป€เบ›เบฑเบ™เบซเบเบฑเบ‡?

เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เป„เบŸเบฅเปŒ

Ansible เบกเบตเบ„เบงเบฒเบกเป€เบ„เบฑเปˆเบ‡เบ„เบฑเบ” เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เป„เบŸเบฅเปŒ เบชเปเบฒเบฅเบฑเบšเป„เบŸเบฅเปŒเบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡เบ—เปˆเบฒเบ™, เบชเบฐเบ™เบฑเป‰เบ™เบกเบฑเบ™เบ”เบตเบ—เบตเปˆเบชเบธเบ”เบ—เบตเปˆเบˆเบฐเป€เบเบฑเบšเบกเบฑเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เป„เบงเป‰เปƒเบ™เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ. เบเบดเปˆเบ‡เป„เบ›เบเบงเปˆเบฒเบ™เบฑเป‰เบ™, เบกเบฑเบ™เบšเปเปˆเบชเปเบฒเบ„เบฑเบ™เบซเบผเบฒเบเบšเปเปˆเบงเปˆเบฒเบˆเบฐเบขเบนเปˆเปƒเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ rails เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡, เบซเบผเบทเปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ. เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเป„เบŸเบฅเปŒเปƒเบ™ repository git เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ. เบชเปˆเบงเบ™เบšเบธเบเบ„เบปเบ™, เบ‚เป‰เบญเบเบžเบปเบšเบงเปˆเบฒเบกเบฑเบ™เบชเบฐเบ”เบงเบเบ—เบตเปˆเบชเบธเบ”เบ—เบตเปˆเบˆเบฐเบชเป‰เบฒเบ‡เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบต ansible เปƒเบ™เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบต / config เบ‚เบญเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ rails เปเบฅเบฐเป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบขเบนเปˆเปƒเบ™เบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™.

Playbook เบ‡เปˆเบฒเบโ€‹เบ”เบฒเบโ€‹

Playbook เปเบกเปˆเบ™เป„เบŸเบฅเปŒ yml เบ—เบตเปˆ, เป‚เบ”เบเปƒเบŠเป‰ syntax เบžเบดเป€เบชเบ”, เบญเบฐเบ—เบดเบšเบฒเบเบชเบดเปˆเบ‡เบ—เบตเปˆ Ansible เบ„เบงเบ™เป€เบฎเบฑเบ”เปเบฅเบฐเบงเบดเบ—เบตเบเบฒเบ™. เบกเบฒเบชเป‰เบฒเบ‡เบ›เบถเป‰เบกเบซเบผเบดเป‰เบ™เบ—เบณเบญเบดเบ”เบ—เบตเปˆเบšเปเปˆเป€เบฎเบฑเบ”เบซเบเบฑเบ‡เป€เบฅเบตเบ:

---
- name: Simple playbook
  hosts: all

เปƒเบ™เบ—เบตเปˆเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบžเบฝเบ‡เปเบ•เปˆเป€เบงเบปเป‰เบฒเบงเปˆเบฒ playbook เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป€เบญเบตเป‰เบ™เบงเปˆเบฒ Simple Playbook เปเบฅเบฐเบงเปˆเบฒเป€เบ™เบทเป‰เบญเปƒเบ™เบ‚เบญเบ‡เบกเบฑเบ™เบ„เบงเบ™เบˆเบฐเบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เบชเปเบฒเบฅเบฑเบšเป€เบˆเบปเป‰เบฒเบžเบฒเบšเบ—เบฑเบ‡เบซเบกเบปเบ”. เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบšเบฑเบ™เบ—เบถเบเบกเบฑเบ™เป„เบงเป‰เปƒเบ™เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบต / ansible เบ”เป‰เบงเบเบŠเบทเปˆ playbook.yml เปเบฅเบฐเบžเบฐเบเบฒเบเบฒเบกเปเบฅเปˆเบ™:

ansible-playbook ./playbook.yml

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

Ansible เป€เบงเบปเป‰เบฒเบงเปˆเบฒเบกเบฑเบ™เบšเปเปˆเบฎเบนเป‰เบงเปˆเบฒเป€เบˆเบปเป‰เบฒเบžเบฒเบšเปƒเบ”เบ—เบตเปˆเบเบปเบ‡เบเบฑเบšเบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ—เบฑเบ‡เบซเบกเบปเบ”. เบžเบงเบเป€เบ‚เบปเบฒเบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบฅเบฐเบšเบธเป„เบงเป‰เปƒเบ™เบžเบดเป€เบชเบ” เป„เบŸเบฅเปŒเบชเบดเบ™เบ„เป‰เบฒเบ„เบปเบ‡เบ„เบฑเบ‡.

เปƒเบซเป‰เบชเป‰เบฒเบ‡เบกเบฑเบ™เบขเบนเปˆเปƒเบ™เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบต ansible เบ”เบฝเบงเบเบฑเบ™:

123.123.123.123

เบ™เบตเป‰เปเบกเปˆเบ™เบงเบดเบ—เบตเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบžเบฝเบ‡เปเบ•เปˆเบเปเบฒเบ™เบปเบ”เป€เบˆเบปเป‰เบฒเบžเบฒเบš (เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐเป€เบˆเบปเป‰เบฒเบžเบฒเบšเบ‚เบญเบ‡ VPS เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ—เบปเบ”เบชเบญเบš, เบซเบผเบทเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™ localhost) เปเบฅเบฐเบšเบฑเบ™เบ—เบถเบเบกเบฑเบ™เบžเบฒเบเปƒเบ•เป‰เบŠเบทเปˆ. inventory.
เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบฅเบญเบ‡เปเบฅเปˆเบ™ ansible เบ”เป‰เบงเบเป„เบŸเบฅเปŒ inventory:

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

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

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

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบกเบต ssh เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เป‚เบฎเบ”เบ—เบตเปˆเบฅเบฐเบšเบธ, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™ ansible เบˆเบฐเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเปเบฅเบฐเป€เบเบฑเบšเบเปเบฒเบ‚เปเป‰เบกเบนเบ™เบเปˆเบฝเบงเบเบฑเบšเบฅเบฐเบšเบปเบšเบซเปˆเบฒเบ‡เป„เบเบชเบญเบเบซเบผเบตเบ. (เบซเบ™เป‰เบฒ default TASK [Gathering Facts]) เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบกเบฑเบ™เบˆเบฐเปƒเบซเป‰เบšเบปเบ”เบฅเบฒเบเบ‡เบฒเบ™เบชเบฑเป‰เบ™เป†เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ” (PLAY RECAP).

เป‚เบ”เบเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเปƒเบŠเป‰เบŠเบทเปˆเบœเบนเป‰เปƒเบŠเป‰เบžเบฒเบเปƒเบ•เป‰เบเบฒเบ™เบ—เบตเปˆเบ—เปˆเบฒเบ™เป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบš. เบชเปˆเบงเบ™เบซเบผเบฒเบเบกเบฑเบ™เบญเบฒเบ”เบˆเบฐเบšเปเปˆเบขเบนเปˆเปƒเบ™เป€เบˆเบปเป‰เบฒเบžเบฒเบš. เปƒเบ™เป„เบŸเบฅเปŒ playbook, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบฅเบฐเบšเบธเบœเบนเป‰เปƒเบŠเป‰เปƒเบ”เบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰เป€เบžเบทเปˆเบญเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเป‚เบ”เบเปƒเบŠเป‰เบ„เปเบฒเบชเบฑเปˆเบ‡ remote_user. เบ™เบญเบเบˆเบฒเบเบ™เบตเป‰, เบ‚เปเป‰เบกเบนเบ™เบเปˆเบฝเบงเบเบฑเบšเบฅเบฐเบšเบปเบšเบซเปˆเบฒเบ‡เป„เบเบชเบญเบเบซเบผเบตเบเบกเบฑเบเบˆเบฐเบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบชเปเบฒเบฅเบฑเบšเบ—เปˆเบฒเบ™เปเบฅเบฐเบ—เปˆเบฒเบ™เบšเปเปˆเบ„เบงเบ™เป€เบชเบเป€เบงเบฅเบฒเป€เบเบฑเบšเบเปเบฒเบกเบฑเบ™. เบงเบฝเบเบ‡เบฒเบ™เบ™เบตเป‰เบเบฑเบ‡เบชเบฒเบกเบฒเบ”เบ–เบทเบเบ›เบดเบ”เปƒเบŠเป‰เบ‡เบฒเบ™เป„เบ”เป‰:

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

เบฅเบญเบ‡เปเบฅเปˆเบ™ playbook เบญเบตเบเบ„เบฑเป‰เบ‡ เปเบฅเบฐเปƒเบซเป‰เปเบ™เปˆเปƒเบˆเบงเปˆเบฒเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเป€เบฎเบฑเบ”เบงเบฝเบ. (เบ–เป‰เบฒโ€‹เบซเบฒเบโ€‹เบงเปˆเบฒโ€‹เบ—เปˆเบฒเบ™โ€‹เบฅเบฐโ€‹เบšเบธโ€‹เบœเบนเป‰โ€‹เปƒเบŠเป‰โ€‹เบฎเบฒเบโ€‹, เบซเบผเบฑเบ‡โ€‹เบˆเบฒเบโ€‹เบ™เบฑเป‰เบ™โ€‹เบ—เปˆเบฒเบ™โ€‹เบเบฑเบ‡โ€‹เบˆเปเบฒโ€‹เป€เบ›เบฑเบ™โ€‹เบ•เป‰เบญเบ‡โ€‹เป„เบ”เป‰โ€‹เบเปเบฒโ€‹เบ™เบปเบ”โ€‹เบเบฒเบ™โ€‹เบเบฒเบโ€‹เป€เบ›เบฑเบ™โ€‹: เบ„เปเบฒโ€‹เปเบ™เบฐโ€‹เบ™เปเบฒโ€‹เบ—เบตเปˆโ€‹เปเบ—เป‰โ€‹เบˆเบดเบ‡โ€‹เปƒเบ™โ€‹เบ„เปเบฒโ€‹เบชเบฑเปˆเบ‡โ€‹เบ—เบตเปˆโ€‹เบˆเบฐโ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบชเบดเบ”โ€‹เบชเบนเบ‡โ€‹. เบ”เบฑเปˆเบ‡โ€‹เบ—เบตเปˆโ€‹เป„เบ”เป‰โ€‹เบ‚เบฝเบ™โ€‹เป„เบงเป‰โ€‹เปƒเบ™โ€‹เป€เบญโ€‹เบเบฐโ€‹เบชเบฒเบ™โ€‹: become set to โ€˜trueโ€™/โ€™yesโ€™ to activate privilege escalation. เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบกเบฑเบ™เบšเปเปˆเบŠเบฑเบ”เป€เบˆเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบงเปˆเบฒเป€เบ›เบฑเบ™เบซเบเบฑเบ‡).

เบšเบฒเบ‡เบ—เบตเบ—เปˆเบฒเบ™เบญเบฒเบ”เบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ—เบตเปˆเป€เบเบตเบ”เบˆเบฒเบเบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒ ansible เบšเปเปˆเบชเบฒเบกเบฒเบ”เบเปเบฒเบ™เบปเบ”เบ•เบปเบงเปเบ› Python, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบเปเบฒเบ™เบปเบ”เบกเบฑเบ™เบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡:

ansible_python_interpreter: /usr/bin/python3 

เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบŠเบญเบเบซเบฒเบšเปˆเบญเบ™เบ—เบตเปˆเบ—เปˆเบฒเบ™เบกเบต python เบ”เป‰เบงเบเบ„เปเบฒเบชเบฑเปˆเบ‡ whereis python.

เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบŠเบธเบ”เบฅเบฐเบšเบปเบš

เบเบฒเบ™เปเบˆเบเบขเบฒเบเบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™เบ‚เบญเบ‡ Ansible เบ›เบฐเบเบญเบšเบกเบตเบซเบผเบฒเบเป‚เบกเบ”เบนเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบŠเบธเบ”เบฅเบฐเบšเบปเบšเบ•เปˆเบฒเบ‡เป†, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบ‚เบฝเบ™ bash scripts เบชเปเบฒเบฅเบฑเบšเป€เบซเบ”เบœเบปเบ™เปƒเบ”เบเปเปˆเบ•เบฒเบก. เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบซเบ™เบถเปˆเบ‡เปƒเบ™เป‚เบกเบ”เบนเบ™เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เป€เบžเบทเปˆเบญเบ›เบฑเบšเบ›เบธเบ‡เบฅเบฐเบšเบปเบšเปเบฅเบฐเบ•เบดเบ”เบ•เบฑเป‰เบ‡เบŠเบธเบ”เบฅเบฐเบšเบปเบš. เบ‚เป‰เบญเบเบกเบต Ubuntu Linux เปƒเบ™ VPS เบ‚เบญเบ‡เบ‚เป‰เบญเบ, เบชเบฐเบ™เบฑเป‰เบ™เป€เบžเบทเปˆเบญเบ•เบดเบ”เบ•เบฑเป‰เบ‡เปเบžเบฑเบเป€เบเบฑเบ”เบ—เบตเปˆเบ‚เป‰เบญเบเปƒเบŠเป‰ apt-get ะธ เป‚เบกเบ”เบนเบ™เบชเปเบฒเบฅเบฑเบšเบกเบฑเบ™. เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบเปเบฒเบฅเบฑเบ‡เปƒเบŠเป‰เบฅเบฐเบšเบปเบšเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™, เบ—เปˆเบฒเบ™เบญเบฒเบ”เบˆเบฐเบ•เป‰เบญเบ‡เบเบฒเบ™เป‚เบกเบ”เบนเบ™เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™ (เบˆเบทเปˆเป„เบงเป‰เบงเปˆเบฒ, เบ‚เป‰เบญเบเป„เบ”เป‰เบเปˆเบฒเบงเปƒเบ™เบ•เบญเบ™เบ•เบปเป‰เบ™เบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบฎเบนเป‰เบฅเปˆเบงเบ‡เบซเบ™เป‰เบฒเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบฎเบฑเบ”เปเบ™เบงเปƒเบ”). เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, syntax เบชเปˆเบงเบ™เบซเบผเบฒเบเบญเบฒเบ”เบˆเบฐเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™.

เบกเบฒเป€เบชเบตเบกเบ›เบถเป‰เบกเบซเบผเบดเป‰เบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบเบฑเบšเปœเป‰เบฒเบงเบฝเบเบ—เบณเบญเบดเบ”:

---
- 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 เบˆเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เบขเบนเปˆเปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบซเปˆเบฒเบ‡เป„เบเบชเบญเบเบซเบผเบตเบ. เบžเบงเบเป€เบฎเบปเบฒเบ•เบฑเป‰เบ‡เบŠเบทเปˆเปƒเบซเป‰เปœเป‰เบฒเบงเบฝเบเป€เบžเบทเปˆเบญเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบ•เบดเบ”เบ•เบฒเบกเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เบกเบฑเบ™เบขเบนเปˆเปƒเบ™เบšเบฑเบ™เบ—เบถเบ. เปเบฅเบฐเบžเบงเบเป€เบฎเบปเบฒเบญเบฐเบ—เบดเบšเบฒเบ, เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ syntax เบ‚เบญเบ‡เป‚เบกเบ”เบนเบ™เบชเบฐเป€เบžเบฒเบฐเปƒเบ”เบซเบ™เบถเปˆเบ‡, เบกเบฑเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบฎเบฑเบ”เปเบ™เบงเปƒเบ”. เปƒเบ™โ€‹เบเปโ€‹เบฅเบฐโ€‹เบ™เบตโ€‹เบ™เบตเป‰ apt: update_cache=yes - เป€เบงเบปเป‰เบฒเบงเปˆเบฒเบˆเบฐเบ›เบฑเบšเบ›เบธเบ‡เบŠเบธเบ”เบฅเบฐเบšเบปเบšเป‚เบ”เบเปƒเบŠเป‰เป‚เบกเบ”เบนเบ™เบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบก. เบ„เปเบฒเบชเบฑเปˆเบ‡เบ—เบตเบชเบญเบ‡เปเบกเปˆเบ™เบชเบฑเบšเบชเบปเบ™เบซเบผเบฒเบ. เบžเบงเบเป€เบฎเบปเบฒเบœเปˆเบฒเบ™เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เบเบฒเบ™เบซเบธเป‰เบกเบซเปเปˆเปƒเบซเป‰เบเบฑเบšเป‚เบกเบ”เบนเบ™เบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบกเปเบฅเบฐเป€เบงเบปเป‰เบฒเบงเปˆเบฒเบžเบงเบเป€เบ‚เบปเบฒเปเบกเปˆเบ™ state เบ„เบงเบ™เบˆเบฐเบเบฒเบเป€เบ›เบฑเบ™ present, เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบžเบงเบเป€เบฎเบปเบฒเป€เบงเบปเป‰เบฒเบงเปˆเบฒเบ•เบดเบ”เบ•เบฑเป‰เบ‡เบŠเบธเบ”เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰. เปƒเบ™เบ—เบฒเบ‡เบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™, เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบšเบญเบเบžเบงเบเป€เบ‚เบปเบฒเปƒเบซเป‰เบฅเบถเบšเบžเบงเบเบกเบฑเบ™, เบซเบผเบทเบ›เบฑเบšเบ›เบธเบ‡เบžเบงเบเบกเบฑเบ™เป‚เบ”เบเบเบฒเบ™เบ›เปˆเบฝเบ™เบžเบฝเบ‡เปเบ•เปˆ state. เบเบฐเบฅเบธเบ™เบฒเบชเบฑเบ‡เป€เบเบ”เบงเปˆเบฒเบชเปเบฒเบฅเบฑเบš rails เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš postgresql เบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบŠเบธเบ” postgresql-contrib, เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบฅเบฑเบ‡เบ•เบดเบ”เบ•เบฑเป‰เบ‡เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™. เบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบฎเบนเป‰เปเบฅเบฐเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰; ansible เบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡เบˆเบฐเบšเปเปˆเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰.

เบฅเบญเบ‡เปเบฅเปˆเบ™ playbook เบญเบตเบเบ„เบฑเป‰เบ‡ เปเบฅเบฐเบเบงเบ”เป€เบšเบดเปˆเบ‡เบงเปˆเบฒเปเบžเบฑเบเป€เบเบฑเบ”เบ–เบทเบเบ•เบดเบ”เบ•เบฑเป‰เบ‡เปเบฅเป‰เบง.

เบเบฒเบ™เบชเป‰เบฒเบ‡เบœเบนเป‰เปƒเบŠเป‰เปƒเบซเบกเปˆ.

เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบœเบนเป‰เปƒเบŠเป‰, Ansible เบเบฑเบ‡เบกเบตเป‚เบกเบ”เบนเบ™ - เบœเบนเป‰เปƒเบŠเป‰. เบ‚เปเปƒเบซเป‰เป€เบžเบตเปˆเบกเบญเบตเบเบซเบ™เบถเปˆเบ‡เบงเบฝเบเบ‡เบฒเบ™ (เบ‚เป‰เบญเบเป„เบ”เป‰เป€เบŠเบทเปˆเบญเบ‡เบชเปˆเบงเบ™เบ—เบตเปˆเบฎเบนเป‰เปเบฅเป‰เบงเบ‚เบญเบ‡ playbook เบขเบนเปˆเบซเบฅเบฑเบ‡เบ„เปเบฒเป€เบซเบฑเบ™เป€เบžเบทเปˆเบญเบšเปเปˆเปƒเบซเป‰เบชเปเบฒเป€เบ™เบปเบฒเบกเบฑเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบธเบเป†เบ„เบฑเป‰เบ‡):

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

เบžเบงเบเป€เบฎเบปเบฒเบชเป‰เบฒเบ‡เบœเบนเป‰เปƒเบŠเป‰เปƒเบซเบกเปˆ, เบเปเบฒเบ™เบปเบ” schell เปเบฅเบฐเบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™เบชเปเบฒเบฅเบฑเบšเบกเบฑเบ™. เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบšเบฑเบ™เบซเบฒเบˆเปเบฒเบ™เบงเบ™เบซเบ™เบถเปˆเบ‡. เบˆเบฐเป€เบ›เบฑเบ™เปเบ™เบงเปƒเบ”เบ–เป‰เบฒเบŠเบทเปˆเบœเบนเป‰เปƒเบŠเป‰เบ•เป‰เบญเบ‡เปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบชเปเบฒเบฅเบฑเบšเป€เบˆเบปเป‰เบฒเบžเบฒเบšเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™? เปเบฅเบฐเบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™เป€เบ›เบฑเบ™เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™เบขเบนเปˆเปƒเบ™ playbook เปเบกเปˆเบ™เบ„เบงเบฒเบกเบ„เบดเบ”เบ—เบตเปˆเบšเปเปˆเบ”เบตเบซเบผเบฒเบ. เป€เบžเบทเปˆเบญเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ”เป‰เบงเบ, เปƒเบซเป‰เปƒเบชเปˆเบŠเบทเปˆเบœเบนเป‰เปƒเบŠเป‰เปเบฅเบฐเบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบ•เบปเบงเปเบ›, เปเบฅเบฐเปƒเบ™เบ•เบญเบ™เบ—เป‰เบฒเบเบ‚เบญเบ‡เบšเบปเบ”เบ„เบงเบฒเบกเบ‚เป‰เบญเบเบˆเบฐเบชเบฐเปเบ”เบ‡เบงเบดเบ—เบตเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™.

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

เบ•เบปเบงเปเบ›เบ–เบทเบเบ•เบฑเป‰เบ‡เป„เบงเป‰เปƒเบ™เบ›เบถเป‰เบกเบซเบผเบดเป‰เบ™เป‚เบ”เบเปƒเบŠเป‰เบงเบปเบ‡เป€เบฅเบฑเบš curly เบชเบญเบ‡เป€เบ—เบปเปˆเบฒ.

เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบŠเบตเป‰เบšเบญเบเบ„เปˆเบฒเบ‚เบญเบ‡เบ•เบปเบงเปเบ›เปƒเบ™เป€เบญเบเบฐเบชเบฒเบ™เบชเบดเบ™เบ„เป‰เบฒเบ„เบปเบ‡เบ„เบฑเบ‡:

123.123.123.123

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

เบเบฐเบฅเบธเบ™เบฒเบชเบฑเบ‡เป€เบเบ”เบ„เปเบฒเบชเบฑเปˆเบ‡ [all:vars] - เบกเบฑเบ™เบšเบญเบเบงเปˆเบฒเบšเบฅเบฑเบญเบเบ•เปเปˆเป„เบ›เบ‚เบญเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเปเบกเปˆเบ™เบ•เบปเบงเปเบ› (vars) เปเบฅเบฐเบžเบงเบเบกเบฑเบ™เปƒเบŠเป‰เป„เบ”เป‰เบเบฑเบšเป‚เบฎเบ”เบ—เบฑเบ‡เบซเบกเบปเบ” (เบ—เบฑเบ‡เบซเบกเบปเบ”).

เบเบฒเบ™เบญเบญเบเปเบšเบšเบเบฑเบ‡เบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆ "{{ user_password | password_hash('sha512') }}". เบชเบดเปˆเบ‡เบ—เบตเปˆเปเบกเปˆเบ™เบงเปˆเบฒ ansible เบšเปเปˆเป„เบ”เป‰เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบœเบนเป‰เปƒเบŠเป‰เบœเปˆเบฒเบ™ user_add เบ„เบทเบเบฑเบšเบงเปˆเบฒเป€เบˆเบปเป‰เบฒเบˆเบฐเป€เบฎเบฑเบ”เบกเบฑเบ™เบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡. เปเบฅเบฐเบกเบฑเบ™เบŠเปˆเบงเบเบ›เบฐเบขเบฑเบ”เบ‚เปเป‰เบกเบนเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เป‚เบ”เบเบเบปเบ‡, เบŠเบถเปˆเบ‡เป€เบ›เบฑเบ™เป€เบซเบ”เบœเบปเบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบ›เปˆเบฝเบ™เบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™เป€เบ›เบฑเบ™ hash เบฅเปˆเบงเบ‡เบซเบ™เป‰เบฒ, เบŠเบถเปˆเบ‡เป€เบ›เบฑเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡เบ™เบตเป‰เป€เบฎเบฑเบ”.

เปƒเบซเป‰เป€เบžเบตเปˆเบกเบœเบนเป‰เปƒเบŠเป‰เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบเบธเปˆเบก 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"

เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เปเบกเปˆเบ™เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบ‡เปˆเบฒเบเบ”เบฒเบ, เบžเบงเบเป€เบฎเบปเบฒเบเบฑเบ‡เบกเบตเป‚เบกเบ”เบนเบ™เบเบธเปˆเบกเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเป‰เบฒเบ‡เบเบธเปˆเบก, เบกเบต syntax เบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบเบฑเบš 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 เปเบฅเบฐเบญเบฑเบšเป‚เบซเบฅเบ”เบกเบฑเบ™เปƒเบชเปˆเบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเบญเบฐเบ™เบธเบเบฒเบ”เบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เปƒเบŠเป‰เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ.

เบšเบปเบ”เบšเบฒเบ”

เบ—เบฑเบ‡เบชเบฒเบกเบงเบฝเบเบ‡เบฒเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเป‰เบฒเบ‡เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบชเบฒเบกเบฒเบ”เปเบšเปˆเบ‡เบญเบญเบเป€เบ›เบฑเบ™เบเบธเปˆเบกเบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡เบซเบ™เป‰เบฒเบงเบฝเบ, เปเบฅเบฐเบกเบฑเบ™เป€เบ›เบฑเบ™เบ„เบงเบฒเบกเบ„เบดเบ”เบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบˆเบฐเป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบเบธเปˆเบกเบ™เบตเป‰เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบˆเบฒเบ playbook เบ•เบปเป‰เบ™เบ•เปเป€เบžเบทเปˆเบญเบšเปเปˆเปƒเบซเป‰เบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆเป€เบเบตเบ™เป„เบ›. เบชเปเบฒเบฅเบฑเบšเบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เบ™เบตเป‰, Ansible เบกเบต เบžเบฒเบฅเบฐเบšเบปเบ”เบšเบฒเบ”.
เบญเบตเบ‡เบ•เบฒเบกเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เป„เบŸเบฅเปŒเบ—เบตเปˆเบŠเบตเป‰เปƒเบซเป‰เป€เบซเบฑเบ™เปƒเบ™เบ•เบญเบ™เบ•เบปเป‰เบ™, เบžเบฒเบฅเบฐเบšเบปเบ”เบšเบฒเบ”เบ•เป‰เบญเบ‡เบ–เบทเบเบˆเบฑเบ”เปƒเบชเปˆเปƒเบ™เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเบžเบฒเบฅเบฐเบšเบปเบ”เบšเบฒเบ”เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ, เบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบšเบปเบ”เบšเบฒเบ”เบกเบตเป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบ—เบตเปˆเบกเบตเบŠเบทเปˆเบ”เบฝเบงเบเบฑเบ™, เบžเบฒเบเปƒเบ™เบซเบ™เป‰เบฒเบงเบฝเบ, เป„เบŸเบฅเปŒ, เปเบกเปˆเปเบšเบš, เปเบฅเบฐเบญเบทเปˆเบ™เป†.
เบกเบฒเบชเป‰เบฒเบ‡เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เป„เบŸเบฅเปŒ: ./ansible/roles/user/tasks/main.yml (เบ•เบปเป‰เบ™เบ•เปเปเบกเปˆเบ™เป„เบŸเบฅเปŒเบ•เบปเป‰เบ™เบ•เปเบ—เบตเปˆเบˆเบฐเบ–เบทเบเป‚เบซเบฅเบ”เปเบฅเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบžเบฒเบฅเบฐเบšเบปเบ”เบšเบฒเบ”เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบš playbook; เป„เบŸเบฅเปŒเบžเบฒเบฅเบฐเบšเบปเบ”เบšเบฒเบ”เบญเบทเปˆเบ™เป†เบชเบฒเบกเบฒเบ”เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเบกเบฑเบ™เป„เบ”เป‰). เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป‚เบญเบ™เบงเบฝเบเบ‡เบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบตเปˆเบเปˆเบฝเบงเบเบฑเบšเบœเบนเป‰เปƒเบŠเป‰เป„เบ›เบซเบฒเป„เบŸเบฅเปŒเบ™เบตเป‰:

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

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

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

เปƒเบ™ playbook เบ•เบปเป‰เบ™เบ•เป, เบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบฅเบฐเบšเบธเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบšเบปเบ”เบšเบฒเบ”เบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰:

---
- 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 เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบขเบนเปˆเปเบฅเป‰เบง; เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡ configure เบกเบฑเบ™เปเบฅเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™. เปƒเบซเป‰เป€เบฎเบฑเบ”เบ—เบฑเบ™เบ—เบตเปƒเบ™เบžเบฒเบฅเบฐเบšเบปเบ”เบšเบฒเบ”. เบกเบฒเบชเป‰เบฒเบ‡เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เป„เบŸเบฅเปŒ:

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

เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เป„เบŸเบฅเปŒเปเบฅเบฐเปเบกเปˆเปเบšเบš. เบ„เบงเบฒเบกเปเบ•เบเบ•เปˆเบฒเบ‡เบฅเบฐเบซเบงเปˆเบฒเบ‡เบžเบงเบเบกเบฑเบ™เปเบกเปˆเบ™เบงเปˆเบฒ ansible เบ„เบฑเบ”เบฅเบญเบเป„เบŸเบฅเปŒเป‚เบ”เบเบเบปเบ‡, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบš. เปเบฅเบฐเปเบกเปˆเปเบšเบšเบ•เป‰เบญเบ‡เบกเบตเบ™เบฒเบกเบชเบฐเบเบธเบ™ j2 เปเบฅเบฐเบžเบงเบเป€เบ‚เบปเบฒเบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เบ„เปˆเบฒเบ•เบปเบงเปเบ›เป‚เบ”เบเปƒเบŠเป‰เบงเบปเบ‡เป€เบฅเบฑเบš curly double เบ”เบฝเบงเบเบฑเบ™.

เปƒเบซเป‰เป€เบ›เบตเบ”เปƒเบŠเป‰ 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 directory (เบญเบฑเบ™เบ™เบตเป‰เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เปเบ•เปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”). เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ—เปเบฒเบญเบดเบ”, เบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰เป‚เบกเบ”เบนเบ™เบชเปเบฒเป€เบ™เบปเบฒเป€เบžเบทเปˆเบญเบ„เบฑเบ”เบฅเบญเบเป„เบŸเบฅเปŒ (เป„เบŸเบฅเปŒเบ•เป‰เบญเบ‡เบขเบนเปˆเปƒเบ™ /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 }};
  ....
}

เป€เบญเบปเบฒเปƒเบˆเปƒเบชเปˆเบเบฑเบš inserts เป„เบ”เป‰ {{ app_name }}, {{ app_path }}, {{ server_name }}, {{ inventory_hostname }} โ€” เป€เบซเบผเบปเปˆเบฒโ€‹เบ™เบตเป‰โ€‹เปเบกเปˆเบ™โ€‹เบ•เบปเบงโ€‹เปเบ›โ€‹เบ—เบฑเบ‡โ€‹เบซเบกเบปเบ”โ€‹เบ—เบตเปˆโ€‹เบ„เปˆเบฒโ€‹เบ‚เบญเบ‡ Ansible เบˆเบฐโ€‹เบ—เบปเบ”โ€‹เปเบ—เบ™โ€‹เบเบฒเบ™โ€‹เป€เบ‚เบปเป‰เบฒโ€‹เป„เบ›โ€‹เปƒเบ™โ€‹เปเบกเปˆโ€‹เปเบšเบšโ€‹เบเปˆเบญเบ™โ€‹เบ—เบตเปˆโ€‹เบˆเบฐโ€‹เบชเปเบฒโ€‹เป€เบ™เบปเบฒโ€‹. เบ™เบตเป‰เปเบกเปˆเบ™เป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบ–เป‰เบฒเบ—เปˆเบฒเบ™เปƒเบŠเป‰ playbook เบชเปเบฒเบฅเบฑเบšเบเบธเปˆเบกเป€เบˆเบปเป‰เบฒเบžเบฒเบšเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™. เบ•เบปเบงเบขเปˆเบฒเบ‡, เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เป€เบžเบตเปˆเบกเป„เบŸเบฅเปŒเบชเบดเบ™เบ„เป‰เบฒเบ„เบปเบ‡เบ„เบฑเบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ:

[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

เบ–เป‰เบฒเบžเบงเบเป€เบฎเบปเบฒเป€เบ›เบตเบ”เบ•เบปเบง playbook เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, เบกเบฑเบ™เบˆเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เบงเบฝเบเบ‡เบฒเบ™เบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เบชเปเบฒเบฅเบฑเบšเบ—เบฑเบ‡เบชเบญเบ‡เป€เบˆเบปเป‰เบฒเบžเบฒเบš. เปเบ•เปˆเปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบงเบเบฑเบ™, เบชเปเบฒเบฅเบฑเบšเป€เบˆเบปเป‰เบฒเบžเบฒเบšเบˆเบฑเบ”เบฅเปเบฒเบ”เบฑเบš, เบ•เบปเบงเปเบ›เบˆเบฐเปเบ•เบเบ•เปˆเบฒเบ‡เบˆเบฒเบเบเบฒเบ™เบœเบฐเบฅเบดเบ”, เปเบฅเบฐเบšเปเปˆเบžเบฝเบ‡เปเบ•เปˆเบขเบนเปˆเปƒเบ™เบžเบฒเบฅเบฐเบšเบปเบ”เบšเบฒเบ”เปเบฅเบฐ playbooks, เปเบ•เปˆเบเบฑเบ‡เบขเบนเปˆเปƒเบ™ configs nginx. {{ inventory_hostname }} เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบฅเบฐเบšเบธเป„เบงเป‰เปƒเบ™เป€เบญเบเบฐเบชเบฒเบ™เบชเบดเบ™เบ„เป‰เบฒเบ„เบปเบ‡เบ„เบฑเบ‡ - เบ™เบตเป‰ เบ•เบปเบงเปเบ›เบžเบดเป€เบชเบ” ansible เปเบฅเบฐเป€เบˆเบปเป‰เบฒเบžเบฒเบšเบ—เบตเปˆ playbook เบเปเบฒเบฅเบฑเบ‡เปเบฅเปˆเบ™เบขเบนเปˆเปƒเบ™เบ™เบฑเป‰เบ™เปเบกเปˆเบ™เป€เบเบฑเบšเป„เบงเป‰เบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™.
เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบ—เบตเปˆเบˆเบฐเบกเบตเป„เบŸเบฅเปŒเบ„เบปเบ‡เบ„เบฑเบ‡เบชเปเบฒเบฅเบฑเบšเบซเบฅเบฒเบเป€เบˆเบปเป‰เบฒเบžเบฒเบš, เปเบ•เปˆเบงเปˆเบฒเบžเบฝเบ‡เปเบ•เปˆเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบชเปเบฒเบฅเบฑเบšเบเบธเปˆเบกเบ”เบฝเบง, เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เป„เบ”เป‰เบ”เป‰เบงเบเบ„เปเบฒเบชเบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

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

เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบญเบทเปˆเบ™เปเบกเปˆเบ™เบเบฒเบ™เบกเบตเป„เบŸเบฅเปŒเบชเบดเบ™เบ„เป‰เบฒเบ„เบปเบ‡เบ„เบฑเบ‡เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบชเปเบฒเบฅเบฑเบšเบเบธเปˆเบกเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™. เบซเบผเบทเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเบปเบกเบ—เบปเบšเบชเบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบกเบตเป€เบˆเบปเป‰เบฒเบžเบฒเบšเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบซเบผเบฒเบ.

เปƒเบซเป‰เบเบฑเบšเบ„เบทเบ™เป„เบ›เบซเบฒเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ nginx. เบซเบผเบฑเบ‡เบˆเบฒเบเบ„เบฑเบ”เบฅเบญเบเป„เบŸเบฅเปŒเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ, เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบชเป‰เบฒเบ‡ symlink เปƒเบ™ sitest_enabled เบเบฑเบš my_app.conf เบˆเบฒเบ sites_available. เปเบฅเบฐ restart 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

เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เปเบกเปˆเบ™เบ‡เปˆเบฒเบเบ”เบฒเบเบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰ - เบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡ ansible modules เบ—เบตเปˆเบกเบต syntax เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™เบ—เบตเปˆเบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡. เปเบ•เปˆเบกเบตเบˆเบธเบ”เบซเบ™เบถเปˆเบ‡. เบšเปเปˆเบกเบตเบˆเบธเบ”เปƒเบ”เปƒเบ™เบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปƒเบซเบกเปˆ nginx เบ—เบธเบเป†เบ„เบฑเป‰เบ‡. เบ—เปˆเบฒเบ™เบชเบฑเบ‡เป€เบเบ”เป€เบซเบฑเบ™เบšเปเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเป„เบ”เป‰เบ‚เบฝเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡เป€เบŠเบฑเปˆเบ™: "เป€เบฎเบฑเบ”เปเบšเบšเบ™เบตเป‰", syntax เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒ "เบ™เบตเป‰เบ„เบงเบ™เบˆเบฐเบกเบตเบชเบฐเบ–เบฒเบ™เบฐเบ™เบตเป‰". เปเบฅเบฐเบชเปˆเบงเบ™เบซเบผเบฒเบเปเบฅเป‰เบง, เบ™เบตเป‰เปเบกเปˆเบ™เบงเบดเบ—เบตเบ—เบตเปˆ ansible เป€เบฎเบฑเบ”เบงเบฝเบ. เบ–เป‰เบฒเบเบธเปˆเบกเบกเบตเบขเบนเปˆเปเบฅเป‰เบง, เบซเบผเบทเบŠเบธเบ”เบฅเบฐเบšเบปเบšเบ–เบทเบเบ•เบดเบ”เบ•เบฑเป‰เบ‡เปเบฅเป‰เบง, ansible เบˆเบฐเบเบงเบ”เป€เบšเบดเปˆเบ‡เบ™เบตเป‰เปเบฅเบฐเบ‚เป‰เบฒเบกเบซเบ™เป‰เบฒเบงเบฝเบ. เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เป„เบŸเบฅเปŒเบˆเบฐเบšเปเปˆเบ–เบทเบเบ„เบฑเบ”เบฅเบญเบเบ–เป‰เบฒเบžเบงเบเป€เบ‚เบปเบฒเบเบปเบ‡เบเบฑเบšเบชเบดเปˆเบ‡เบ—เบตเปˆเบขเบนเปˆเปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเปเบฅเป‰เบง. เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เบ›เบฐเป‚เบซเบเบ”เบˆเบฒเบเบชเบดเปˆเบ‡เบ™เบตเป‰เปเบฅเบฐ restart 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 เบเบฑเบš playbook เบ•เบปเป‰เบ™เบ•เป.

เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ 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 }}"

เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเบšเปเปˆเบญเบฐเบ—เบดเบšเบฒเบเบงเบดเบ—เบตเบเบฒเบ™เป€เบžเบตเปˆเบกเบ•เบปเบงเปเบ›เปƒเบ™เบชเบดเบ™เบ„เป‰เบฒเบ„เบปเบ‡เบ„เบฑเบ‡, เบ™เบตเป‰เป„เบ”เป‰เป€เบฎเบฑเบ”เปเบฅเป‰เบงเบซเบผเบฒเบเบ„เบฑเป‰เบ‡, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบš syntax เบ‚เบญเบ‡เป‚เบกเบ”เบนเบ™ postgresql_db เปเบฅเบฐ postgresql_user. เบ‚เปเป‰เบกเบนเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบชเบฒเบกเบฒเบ”เบžเบปเบšเป„เบ”เป‰เปƒเบ™เป€เบญเบเบฐเบชเบฒเบ™. เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเบ—เบตเปˆเบชเบธเบ”เบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰เปเบกเปˆเบ™ become_user: postgres. เบ„เบงเบฒเบกเบˆเบดเบ‡เปเบฅเป‰เบงเปเบกเปˆเบ™เบงเปˆเบฒเป‚เบ”เบเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, เบžเบฝเบ‡เปเบ•เปˆเบœเบนเป‰เปƒเบŠเป‰ postgres เบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™ postgresql เปเบฅเบฐเบžเบฝเบ‡เปเบ•เปˆเบขเบนเปˆเปƒเบ™เบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™. เบ„เปเบฒเบชเบฑเปˆเบ‡เบ™เบตเป‰เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบ›เบฐเบ•เบดเบšเบฑเบ”เบ„เปเบฒเบชเบฑเปˆเบ‡เปƒเบ™เบ™เบฒเบกเบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰เบ™เบตเป‰ (เบ–เป‰เบฒเบžเบงเบเป€เบฎเบปเบฒเป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡, เปเบ™เปˆเบ™เบญเบ™).
เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบ—เปˆเบฒเบ™เบญเบฒเบ”เบˆเบฐเบ•เป‰เบญเบ‡เป€เบžเบตเปˆเบกเปเบ–เบงเปƒเบชเปˆ pg_hba.conf เป€เบžเบทเปˆเบญเปƒเบซเป‰เบœเบนเป‰เปƒเบŠเป‰เปƒเบซเบกเปˆเป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™. เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เป„เบ”เป‰เปƒเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเบ”เบฝเบงเบเบฑเบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบ›เปˆเบฝเบ™เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ nginx.

เปเบฅเบฐเปเบ™เปˆเบ™เบญเบ™, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบžเบตเปˆเบกเบšเบปเบ”เบšเบฒเบ” postgresql เบเบฑเบš playbook เบ•เบปเป‰เบ™เบ•เป.

เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡ ruby โ€‹โ€‹โ€‹โ€‹เบœเปˆเบฒเบ™ rbenv

Ansible เบšเปเปˆเบกเบตเป‚เบกเบ”เบนเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš rbenv, เปเบ•เปˆเบกเบฑเบ™เบ–เบทเบเบ•เบดเบ”เบ•เบฑเป‰เบ‡เป‚เบ”เบ cloning git repository. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบšเบฑเบ™เบซเบฒเบ™เบตเป‰เบเบฒเบเป€เบ›เบฑเบ™เบšเบฑเบ™เบซเบฒเบ—เบตเปˆเบšเปเปˆเบกเบตเบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™เบ—เบตเปˆเบชเบธเบ”. เบ‚เปเปƒเบซเป‰เบชเป‰เบฒเบ‡เบšเบปเบ”เบšเบฒเบ”เบ‚เบญเบ‡เบ™เบฒเบ‡ /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

เบžเบงเบเป€เบฎเบปเบฒเบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡เบ™เปเบฒเปƒเบŠเป‰เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบเบฒเบเป€เบ›เบฑเบ™เบœเบนเป‰เปƒเบŠเป‰เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบงเบฝเบเบžเบฒเบเปƒเบ•เป‰เบœเบนเป‰เปƒเบŠเป‰เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบชเป‰เบฒเบ‡เป€เบžเบทเปˆเบญเบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰. เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบ rbenv เบ–เบทเบเบ•เบดเบ”เบ•เบฑเป‰เบ‡เบขเบนเปˆเปƒเบ™เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเป€เบฎเบทเบญเบ™เบ‚เบญเบ‡เบกเบฑเบ™, เปเบฅเบฐเบšเปเปˆเปเบกเปˆเบ™เบ—เบปเปˆเบงเป‚เบฅเบ. เปเบฅเบฐเบžเบงเบเป€เบฎเบปเบฒเบเบฑเบ‡เปƒเบŠเป‰เป‚เบกเบ”เบนเบ™ git เป€เบžเบทเปˆเบญ clone repository, เบฅเบฐเบšเบธ repo เปเบฅเบฐ dest.

เบ•เปเปˆเป„เบ›, เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™ rbenv init เปƒเบ™ bashrc เปเบฅเบฐเป€เบžเบตเปˆเบก rbenv เบเบฑเบš PATH เบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™. เบชเปเบฒเบฅเบฑเบšเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบกเบตเป‚เบกเบ”เบนเบ™ lineinfile:

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

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

เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบ•เบดเบ”เบ•เบฑเป‰เบ‡ ruby_build:

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

เปเบฅเบฐเบชเบธเบ”เบ—เป‰เบฒเบเบ•เบดเบ”เบ•เบฑเป‰เบ‡ ruby. เบ™เบตเป‰เปเบกเปˆเบ™เป€เบฎเบฑเบ”เป„เบ”เป‰เป‚เบ”เบเบœเปˆเบฒเบ™ rbenv, เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบžเบฝเบ‡เปเบ•เปˆเบกเบตเบ„เปเบฒเบชเบฑเปˆเบ‡ bash:

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

เบžเบงเบเป€เบฎเบปเบฒเป€เบงเบปเป‰เบฒเบงเปˆเบฒเบ„เปเบฒเบชเบฑเปˆเบ‡เปƒเบ”เบ—เบตเปˆเบˆเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เปเบฅเบฐเบ”เป‰เบงเบเบญเบฑเบ™เปƒเบ”. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เปƒเบ™เบ—เบตเปˆเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบžเบปเบšเบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒ ansible เบšเปเปˆเป„เบ”เป‰เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบกเบตเบขเบนเปˆเปƒเบ™ bashrc เบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡. เบ™เบตเป‰เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒ rbenv เบˆเบฐเบ•เป‰เบญเบ‡เบ–เบทเบเบเปเบฒเบ™เบปเบ”เป‚เบ”เบเบเบปเบ‡เปƒเบ™เบชเบฐเบ„เบดเบšเบ”เบฝเบงเบเบฑเบ™.

เบšเบฑเบ™เบซเบฒเบ•เปเปˆเป„เบ›เปเบกเปˆเบ™เป€เบ™เบทเปˆเบญเบ‡เบกเบฒเบˆเบฒเบเบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒเบ„เปเบฒเบชเบฑเปˆเบ‡ shell เบšเปเปˆเบกเบตเบชเบฐเบ–เบฒเบ™เบฐเบˆเบฒเบเบˆเบธเบ”เบ—เบตเปˆเบšเปเปˆเบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเปƒเบˆเป„เบ”เป‰. เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบˆเบฐเบšเปเปˆเบกเบตเบเบฒเบ™เบเบงเบ”เบชเบญเบšเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบงเปˆเบฒ Ruby เบฎเบธเปˆเบ™เบ™เบตเป‰เบ–เบทเบเบ•เบดเบ”เบ•เบฑเป‰เบ‡เบซเบผเบทเบšเปเปˆ. เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เป„เบ”เป‰เบ”เป‰เบงเบเบ•เบปเบงเป€เบฎเบปเบฒเป€เบญเบ‡:

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

เบชเบดเปˆเบ‡เบ—เบตเปˆเบเบฑเบ‡เป€เบซเบผเบทเบญเปเบกเปˆเบ™เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡ bundle:

- 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. เบกเบตเบžเบฝเบ‡เปเบ•เปˆเบซเบ™เบถเปˆเบ‡ subtlety. เบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเบ„เบฑเบ”เบฅเบญเบเป„เบŸเบฅเปŒ, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบชเป‰เบฒเบ‡เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเบชเปเบฒเบฅเบฑเบšเบžเบงเบเบกเบฑเบ™, เบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เป€เบŠเบฑเปˆเบ™เบ™เบตเป‰:

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

เบžเบงเบเป€เบฎเบปเบฒเบฅเบฐเบšเบธเบžเบฝเบ‡เปเบ•เปˆเบซเบ™เบถเปˆเบ‡เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเปเบฅเบฐ ansible เบˆเบฐเบชเป‰เบฒเบ‡เบ•เบปเบงเปเบกเปˆเป‚เบ”เบเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ–เป‰เบฒเบˆเปเบฒเป€เบ›เบฑเบ™.

Ansible Vault

เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบžเบปเบšเปเบฅเป‰เบงเบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒเบ•เบปเบงเปเบ›เบชเบฒเบกเบฒเบ”เบกเบตเบ‚เปเป‰เบกเบนเบ™เบฅเบฑเบšเป€เบŠเบฑเปˆเบ™เบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™เบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰. เบ–เป‰เบฒเบ—เปˆเบฒเบ™เป„เบ”เป‰เบชเป‰เบฒเบ‡ .env เป„เบŸเบฅเปŒเบชเปเบฒเบฅเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ, เปเบฅเบฐ database.yml เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบ•เป‰เบญเบ‡เบกเบตเบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบซเบผเบฒเบเบเบงเปˆเบฒเป€เบเบปเปˆเบฒ. เบกเบฑเบ™เบˆเบฐเป€เบ›เบฑเบ™เบเบฒเบ™เบ”เบตเบ—เบตเปˆเบˆเบฐเบ›เบดเบ”เบšเบฑเบ‡เบžเบงเบเป€เบ‚เบปเบฒเบˆเบฒเบเบ•เบฒ prying. เบชเปเบฒเบฅเบฑเบšเบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เบ™เบตเป‰, เบกเบฑเบ™เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰ vault ansible.

เปƒเบซเป‰เบชเป‰เบฒเบ‡เป„เบŸเบฅเปŒเบชเปเบฒเบฅเบฑเบšเบ•เบปเบงเปเบ› /ansible/vars/all.yml (เบ—เบตเปˆเบ™เบตเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเป‰เบฒเบ‡เป„เบŸเบฅเปŒเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบชเปเบฒเบฅเบฑเบšเบเบธเปˆเบกเป€เบˆเบปเป‰เบฒเบžเบฒเบšเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™, เบ„เบทเบเบฑเบ™เบเบฑเบšเบขเบนเปˆเปƒเบ™เป„เบŸเบฅเปŒเบชเบดเบ™เบ„เป‰เบฒเบ„เบปเบ‡เบ„เบฑเบ‡: production.yml, staging.yml, เปเบฅเบฐเบญเบทเปˆเบ™เป†).
เบ—เบธเบเบ•เบปเบงเปเบ›เบ—เบตเปˆเบ•เป‰เบญเบ‡เบ–เบทเบเป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เบ•เป‰เบญเบ‡เบ–เบทเบเป‚เบญเบ™เป„เบ›เบซเบฒเป„เบŸเบฅเปŒเบ™เบตเป‰เป‚เบ”เบเปƒเบŠเป‰ syntax 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 เบˆเบฐเบฎเป‰เบญเบ‡เบ‚เปเปƒเบซเป‰เบกเบตเบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™, เบ”เบถเบ‡เป€เบญเบปเบฒเบ•เบปเบงเปเบ›, เปเบฅเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เบซเบ™เป‰เบฒเบงเบฝเบ. เบ‚เปเป‰เบกเบนเบ™เบ—เบฑเบ‡เปเบปเบ”เบˆเบฐเบเบฑเบ‡เบ„เบปเบ‡เบ–เบทเบเป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เป„เบงเป‰.

เบ„เปเบฒเบชเบฑเปˆเบ‡เบ„เบปเบšเบ–เป‰เบงเบ™เบชเบปเบกเบšเบนเบ™เบชเปเบฒเบฅเบฑเบšเบซเบผเบฒเบเป†เบเบธเปˆเบกเบ‚เบญเบ‡ hosts เปเบฅเบฐ vault ansible เบˆเบฐเบกเบตเบฅเบฑเบเบชเบฐเบ™เบฐเป€เบŠเบฑเปˆเบ™เบ™เบตเป‰:

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

เปเบ•เปˆเบ‚เป‰เบญเบเบˆเบฐเบšเปเปˆเปƒเบซเป‰เบšเบปเบ”เป€เบฅเบทเปˆเบญเบ‡เป€เบ•เบฑเบกเบ‚เบญเบ‡ playbooks เปเบฅเบฐเบžเบฒเบฅเบฐเบšเบปเบ”เบšเบฒเบ”, เบ‚เบฝเบ™เบกเบฑเบ™เป€เบญเบ‡. เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒ ansible เป€เบ›เบฑเบ™เปเบšเบšเบ™เบฑเป‰เบ™ - เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบšเปเปˆเป€เบ‚เบปเป‰เบฒเปƒเบˆเบชเบดเปˆเบ‡เบ—เบตเปˆเบ•เป‰เบญเบ‡เป€เบฎเบฑเบ”, เบกเบฑเบ™เบˆเบฐเบšเปเปˆเป€เบฎเบฑเบ”เบชเปเบฒเบฅเบฑเบšเบ—เปˆเบฒเบ™.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™