αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαžŠαžΎαž˜αŸ’αž”αžΈαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Rails αžŠαŸ„αž™αž”αŸ’αžšαžΎ Ansible

αž˜αž·αž“αž™αžΌαžšαž”αŸ‰αž»αž“αŸ’αž˜αžΆαž“αžαŸ’αž‰αž»αŸ†αžαŸ’αžšαžΌαžœαžŸαžšαžŸαŸαžšαžŸαŸ€αžœαž—αŸ…αž›αŸαž„ Ansible αž‡αžΆαž…αŸ’αžšαžΎαž“αžŠαžΎαž˜αŸ’αž”αžΈαžšαŸ€αž”αž…αŸ†αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Rails αŸ” αž αžΎαž™αž‚αž½αžšαž±αŸ’αž™αž—αŸ’αž‰αžΆαž€αŸ‹αž•αŸ’αž’αžΎαž›αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž˜αž·αž“αž”αžΆαž“αžšαž€αžƒαžΎαž‰αžŸαŸ€αžœαž—αŸ…αžŽαŸ‚αž“αžΆαŸ†αž‡αŸ†αž αžΆαž“αžŠαŸ„αž™αž‡αŸ†αž αžΆαž“αžŸαžΆαž˜αž‰αŸ’αž‰αŸ” αžαŸ’αž‰αž»αŸ†β€‹αž˜αž·αž“β€‹αž…αž„αŸ‹β€‹αž…αž˜αŸ’αž›αž„β€‹αžŸαŸ€αžœαž—αŸ…β€‹αž›αŸαž„β€‹αžšαž”αžŸαŸ‹β€‹αž’αŸ’αž“αž€β€‹αž•αŸ’αžŸαŸαž„β€‹αžŠαŸ„αž™β€‹αž˜αž·αž“β€‹αž™αž›αŸ‹β€‹αž–αžΈβ€‹αž’αŸ’αžœαžΈβ€‹αžŠαŸ‚αž›β€‹αž€αŸ†αž–αž»αž„β€‹αž€αžΎαžβ€‹αž‘αžΎαž„β€‹αž“αŸ„αŸ‡β€‹αž‘αŸ αž αžΎαž™β€‹αž“αŸ…β€‹αž‘αžΈβ€‹αž”αž‰αŸ’αž…αž”αŸ‹ αžαŸ’αž‰αž»αŸ†β€‹αžαŸ’αžšαžΌαžœβ€‹αž’αžΆαž“β€‹αž―αž€αžŸαžΆαžšβ€‹αž”αŸ’αžšαž˜αžΌαž›β€‹αž’αŸ’αžœαžΈαŸ—β€‹αž‘αžΆαŸ†αž„β€‹αž’αžŸαŸ‹β€‹αžŠαŸ„αž™β€‹αžαŸ’αž›αž½αž“β€‹αž―αž„αŸ” αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαžαŸ’αž‰αž»αŸ†αž’αžΆαž…αž‡αž½αž™αž“αžšαžŽαžΆαž˜αŸ’αž“αžΆαž€αŸ‹αž”αž„αŸ’αž€αžΎαž“αž›αŸ’αž”αžΏαž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸαŸ‡ αžŠαŸ„αž™αž˜αžΆαž“αž‡αŸ†αž“αž½αž™αž–αžΈαž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αŸ”

αžšαžΏαž„αžŠαŸ†αž”αžΌαž„αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž™αž›αŸ‹αž‚αžΊαžαžΆ ansible αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αž’αŸ’αž“αž€αž“αžΌαžœαž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹αž„αžΆαž™αžŸαŸ’αžšαž½αž›αžŠαžΎαž˜αŸ’αž”αžΈαž’αž“αž»αžœαžαŸ’αžαž”αž‰αŸ’αž‡αžΈαžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αžŠαŸ‚αž›αž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αž‡αžΆαž˜αž»αž“αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž–αžΈαž…αž˜αŸ’αž„αžΆαž™αžαžΆαž˜αžšαž™αŸˆ SSH αŸ” αž˜αž·αž“αž˜αžΆαž“αžœαŸαž‘αž˜αž“αŸ’αžαž“αŸ…αž‘αžΈαž“αŸαŸ‡αž‘αŸ αž’αŸ’αž“αž€αž˜αž·αž“αž’αžΆαž…αžŠαŸ†αž‘αžΎαž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‡αŸ†αž“αž½αž™ αž“αž·αž„αž‘αž‘αž½αž›αž”αžΆαž“αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αž–αŸαž›αž‘αŸ†αž“αŸαžšαž‡αžΆαž˜αž½αž™ docker αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™ αž“αž·αž„αž’αžαŸ’αžαž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž…αŸαž‰αž–αžΈαž”αŸ’αžšαž’αž”αŸ‹αž“αŸ„αŸ‡αž‘αŸαŸ” αžŠαžΎαž˜αŸ’αž”αžΈαžŸαžšαžŸαŸαžšαžŸαŸ€αžœαž—αŸ…αž›αŸαž„ αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαžαŸ‚αžŠαžΉαž„αž–αžΈαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž’αŸ’αž“αž€αž…αž„αŸ‹αž’αŸ’αžœαžΎ αž“αž·αž„αžšαž”αŸ€αž”αž’αŸ’αžœαžΎαžœαžΆαž±αŸ’αž™αž–αž·αžαž”αŸ’αžšαžΆαž€αžŠαŸ” αž“αŸ„αŸ‡αž αžΎαž™αž‡αžΆαž˜αžΌαž›αž αŸαžαž»αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž˜αž·αž“αž–αŸαž‰αž…αž·αžαŸ’αžαž“αžΉαž„αžŸαŸ€αžœαž—αŸ…αžŠαŸ‚αž›αžαŸ’αžšαŸ€αž˜αžšαž½αž…αž‡αžΆαžŸαŸ’αžšαŸαž…αž–αžΈ GitHub αž¬αž’αžαŸ’αžαž”αž‘αžŠαžΌαž…αž‡αžΆαŸ– "αž…αž˜αŸ’αž›αž„ αž αžΎαž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αžœαžΆαž“αžΉαž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ”"

αžαžΎαž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαž’αŸ’αžœαžΈαžαŸ’αž›αŸ‡?

αžŠαžΌαž…αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž“αž·αž™αžΆαž™αžšαž½αž…αž αžΎαž™ αžŠαžΎαž˜αŸ’αž”αžΈαžŸαžšαžŸαŸαžšαžŸαŸ€αžœαž—αŸ…αž›αŸαž„ αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαžŠαžΉαž„αž–αžΈαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž’αŸ’αž“αž€αž…αž„αŸ‹αž’αŸ’αžœαžΎ αž“αž·αž„αžšαž”αŸ€αž”αž’αŸ’αžœαžΎαžœαžΆαŸ” αž…αžΌαžšαž™αžΎαž„αžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αžαžαžΆαžαžΎαž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαž’αŸ’αžœαžΈαŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Rails αž™αžΎαž„αž“αžΉαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαž€αž‰αŸ’αž…αž”αŸ‹αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž‡αžΆαž…αŸ’αžšαžΎαž“αŸ– nginx, postgresql (redis, etc)αŸ” αž›αžΎαžŸαž–αžΈαž“αŸαŸ‡αž‘αŸ€αžαž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαž€αŸ†αžŽαŸ‚αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž“αŸƒ ruby β€‹β€‹αŸ” αžœαžΆαž‡αžΆαž€αžΆαžšαž›αŸ’αž’αž”αŸ†αž•αž»αžαž€αŸ’αž“αž»αž„αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αžœαžΆαžαžΆαž˜αžšαž™αŸˆ rbenv (rvm, asdf...)αŸ” αž€αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸαŸ‡αž€αŸ’αž“αž»αž„αž“αžΆαž˜αž‡αžΆαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ root αž‚αžΊαžαŸ‚αž„αžαŸ‚αž‡αžΆαž‚αŸ†αž“αž·αžαž’αžΆαž€αŸ’αžšαž€αŸ‹ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž”αž„αŸ’αž€αžΎαžαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€ αž“αž·αž„αž€αŸ†αžŽαžαŸ‹αžŸαž·αž‘αŸ’αž’αž·αžšαž”αžŸαŸ‹αž‚αžΆαžαŸ‹αŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž“αŸαŸ‡ αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž”αž‰αŸ’αž…αžΌαž›αž€αžΌαžŠαžšαž”αžŸαŸ‹αž™αžΎαž„αž‘αŸ…αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ αž…αž˜αŸ’αž›αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ nginx, postgres αž‡αžΆαžŠαžΎαž˜ αž αžΎαž™αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸαŸ‡αŸ”

αž‡αžΆαž›αž‘αŸ’αž’αž•αž› αž›αŸ†αžŠαžΆαž”αŸ‹αž“αŸƒαžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αž˜αžΆαž“αžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

  1. αž…αžΌαž›αž‡αžΆ root
  2. αžŠαŸ†αž‘αžΎαž„αž€αž‰αŸ’αž…αž”αŸ‹αž”αŸ’αžšαž–αŸαž“αŸ’αž’
  3. αž”αž„αŸ’αž€αžΎαžαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžαŸ’αž˜αžΈ αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŸαž·αž‘αŸ’αž’αž· ssh key
  4. αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž€αž‰αŸ’αž…αž”αŸ‹αž”αŸ’αžšαž–αŸαž“αŸ’αž’ (nginx αž‡αžΆαžŠαžΎαž˜) αž αžΎαž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž–αž½αž€αžœαžΆ
  5. αž™αžΎαž„αž”αž„αŸ’αž€αžΎαžαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ (αž’αŸ’αž“αž€αž’αžΆαž…αž”αž„αŸ’αž€αžΎαžαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž—αŸ’αž›αžΆαž˜αŸ—)
  6. αž…αžΌαž›αž‡αžΆαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžαŸ’αž˜αžΈαŸ”
  7. αžŠαŸ†αž‘αžΎαž„ rbenv αž“αž·αž„ ruby
  8. αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αž€αž‰αŸ’αž…αž”αŸ‹
  9. αž€αŸ†αž–αž»αž„αž•αŸ’αž‘αž»αž€αž‘αžΎαž„αž€αžΌαžŠαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ
  10. αž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ Puma

αž›αžΎαžŸαž–αžΈαž“αŸαŸ‡αž‘αŸ…αž‘αŸ€αž αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαžŠαŸ„αž™αž”αŸ’αžšαžΎ capistrano αž™αŸ‰αžΆαž„αž αŸ„αž…αžŽαžΆαžŸαŸ‹αž…αŸαž‰αž–αžΈαž”αŸ’αžšαž’αž”αŸ‹ αžœαžΆαž’αžΆαž…αž…αž˜αŸ’αž›αž„αž€αžΌαžŠαž‘αŸ…αž€αŸ’αž“αž»αž„αž”αž‰αŸ’αž‡αžΈαž…αŸαž‰αž•αŸ’αžŸαžΆαž™ αž”αŸ’αžαžΌαžšαž€αžΆαžšαž…αŸαž‰αž•αŸ’αžŸαžΆαž™αžŠαŸ„αž™αž”αŸ’αžšαžΎαžαŸ†αžŽαž—αŸ’αž‡αžΆαž”αŸ‹αž“αž·αž˜αž·αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαž“αŸ…αž–αŸαž›αžŠαžΆαž€αŸ‹αž±αŸ’αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ„αž™αž‡αŸ„αž‚αž‡αŸαž™ αž…αž˜αŸ’αž›αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž–αžΈαžαžαžŠαŸ‚αž›αž”αžΆαž“αž…αŸ‚αž€αžšαŸ†αž›αŸ‚αž€ αž…αžΆαž”αŸ‹αž•αŸ’αžŠαžΎαž˜ puma αž‘αžΎαž„αžœαž·αž‰αŸ”αž›αŸ” αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸαŸ‡αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαžŠαŸ„αž™αž”αŸ’αžšαžΎ Ansible αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž αŸαžαž»αž’αŸ’αžœαžΈ?

αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž―αž€αžŸαžΆαžš

Ansible αž˜αžΆαž“αž—αžΆαž–αžαžΉαž„αžšαŸ‰αžΉαž„ αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž―αž€αžŸαžΆαžš αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž―αž€αžŸαžΆαžšαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž‘αžΆαŸ†αž„αž’αžŸαŸ‹ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžœαžΆαž‡αžΆαž€αžΆαžšαž›αŸ’αž’αž”αŸ†αž•αž»αžαž€αŸ’αž“αž»αž„αž€αžΆαžšαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αžœαžΆαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αžαžαžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€αž˜αž½αž™αŸ” αž›αžΎαžŸαž–αžΈαž“αŸαŸ‡αž‘αŸ…αž‘αŸ€αžαžœαžΆαž˜αž·αž“αžŸαŸ†αžαžΆαž“αŸ‹αž‘αŸαžαžΆαžαžΎαžœαžΆαž“αžΉαž„αžŸαŸ’αžαž·αžαž“αŸ…αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž•αŸ’αž›αžΌαžœαžŠαŸ‚αž€αžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„αž¬αžŠαŸ„αž™αž‘αŸ‚αž€αž–αžΈαž‚αŸ’αž“αžΆαŸ” αž’αŸ’αž“αž€αž’αžΆαž…αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž―αž€αžŸαžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„αžƒαŸ’αž›αžΆαŸ†αž„ git αžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€αŸ” αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹ αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžšαž€αžƒαžΎαž‰αžαžΆαžœαžΆαž„αžΆαž™αžŸαŸ’αžšαž½αž›αž”αŸ†αž•αž»αžαž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαžαžαž―αž€αžŸαžΆαžšαžŠαŸ‚αž›αž’αžΆαž…αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž”αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αžαž /config αž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž•αŸ’αž›αžΌαžœαžšαžαž—αŸ’αž›αžΎαž„ αž αžΎαž™αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž“αŸ…αž€αŸ’αž“αž»αž„αžƒαŸ’αž›αžΆαŸ†αž„αž˜αž½αž™αŸ”

αžŸαŸ€αžœαž—αŸ…αž›αŸαž„αžŸαžΆαž˜αž‰αŸ’αž‰

Playbook αž‚αžΊαž‡αžΆαž―αž€αžŸαžΆαžš yml αžŠαŸ‚αž›αž”αŸ’αžšαžΎαžœαžΆαž€αŸ’αž™αžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž–αž·αžŸαŸαžŸ αž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαž’αŸ’αžœαžΈαžŠαŸ‚αž› Ansible αž‚αž½αžšαž’αŸ’αžœαžΎ αž“αž·αž„αžšαž”αŸ€αž”αŸ” αžαŸ„αŸ‡αž”αž„αŸ’αž€αžΎαžαžŸαŸ€αžœαž—αŸ…αž›αŸαž„αžŠαŸ†αž”αžΌαž„αžŠαŸ‚αž›αž˜αž·αž“αž’αŸ’αžœαžΎαž’αŸ’αžœαžΈαžŸαŸ„αŸ‡αŸ–

---
- name: Simple playbook
  hosts: all

αž“αŸ…αž‘αžΈαž“αŸαŸ‡αž™αžΎαž„αž“αž·αž™αžΆαž™αž™αŸ‰αžΆαž„αžŸαžΆαž˜αž‰αŸ’αž‰αžαžΆαžŸαŸ€αžœαž—αŸ…αž›αŸαž„αžšαž”αžŸαŸ‹αž™αžΎαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž αŸ…αžαžΆ Simple Playbook αž αžΎαž™αž˜αžΆαžαž·αž€αžΆαžšαž”αžŸαŸ‹αžœαžΆαž‚αž½αžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ” αž™αžΎαž„β€‹αž’αžΆαž…β€‹αžšαž€αŸ’αžŸαžΆβ€‹αž‘αž»αž€β€‹αžœαžΆβ€‹αž€αŸ’αž“αž»αž„β€‹αžαž /ansible αžŠαŸ„αž™β€‹αž”αŸ’αžšαžΎβ€‹αžˆαŸ’αž˜αŸ„αŸ‡ playbook.yml αž αžΎαž™αž–αŸ’αž™αžΆαž™αžΆαž˜αžšαžαŸ‹αŸ–

ansible-playbook ./playbook.yml

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

Ansible αž“αž·αž™αžΆαž™αžαžΆαžœαžΆαž˜αž·αž“αžŸαŸ’αž‚αžΆαž›αŸ‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αžŽαžΆαž˜αž½αž™αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž“αžΉαž„αž”αž‰αŸ’αž‡αžΈαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ” αž–αž½αž€αž‚αŸαžαŸ’αžšαžΌαžœαžαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαžΆαž™αž”αž‰αŸ’αž‡αžΈαž–αž·αžŸαŸαžŸ αž―αž€αžŸαžΆαžšαžŸαžΆαžšαž–αžΎαž—αŸαžŽαŸ’αžŒ.

αž…αžΌαžšαž™αžΎαž„αž”αž„αŸ’αž€αžΎαžαžœαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αžαžαž―αž€αžŸαžΆαžšαžŠαžΌαž…αž‚αŸ’αž“αžΆαŸ–

123.123.123.123

αž“αŸαŸ‡αž‡αžΆαžšαž”αŸ€αž”αžŠαŸ‚αž›αž™αžΎαž„αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“ (αžαžΆαž˜αž§αžαŸ’αžŠαž˜αž‚αžαž·αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αŸƒ VPS αžšαž”αžŸαŸ‹αž™αžΎαž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„ αž¬αž’αŸ’αž“αž€αž’αžΆαž…αž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡ localhost) αž αžΎαž™αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αžœαžΆαž“αŸ…αž€αŸ’αžšαŸ„αž˜αžˆαŸ’αž˜αŸ„αŸ‡ inventory.
αž’αŸ’αž“αž€αž’αžΆαž…αžŸαžΆαž€αž›αŸ’αž”αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš ansible αž‡αžΆαž˜αž½αž™αž―αž€αžŸαžΆαžšαžŸαžΆαžšαž–αžΎαž—αŸαžŽαŸ’αžŒαŸ–

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

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

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

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž˜αžΆαž“αžŸαž·αž‘αŸ’αž’αž·αž…αžΌαž›αž”αŸ’αžšαžΎ ssh αž‘αŸ…αž€αžΆαž“αŸ‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹ αž“αŸ„αŸ‡ ansible αž“αžΉαž„αž—αŸ’αž‡αžΆαž”αŸ‹ αž“αž·αž„αž”αŸ’αžšαž˜αžΌαž›αž–αŸαžαŸŒαž˜αžΆαž“αž’αŸ†αž–αžΈαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž–αžΈαž…αž˜αŸ’αž„αžΆαž™αŸ” (αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜ TASK [Gathering Facts]) αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž“αŸ„αŸ‡αžœαžΆαž“αžΉαž„αž•αŸ’αžαž›αŸ‹αžšαž”αžΆαž™αž€αžΆαžšαžŽαŸαžαŸ’αž›αžΈαž˜αž½αž™αžŸαŸ’αžαžΈαž–αžΈαž€αžΆαžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž· (PLAY RECAP)αŸ”

αžαžΆαž˜αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜ αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž”αŸ’αžšαžΎαžˆαŸ’αž˜αŸ„αŸ‡αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŠαŸ‚αž›αž’αŸ’αž“αž€αž”αžΆαž“αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αž”αŸ’αžšαž–αŸαž“αŸ’αž’αŸ” αžœαžΆαž‘αŸ†αž“αž„αž‡αžΆαž“αžΉαž„αž˜αž·αž“αž“αŸ…αž›αžΎαž˜αŸ’αž…αžΆαžŸαŸ‹αž•αŸ’αž‘αŸ‡αž‘αŸαŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžš playbook αž’αŸ’αž“αž€αž’αžΆαž…αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŽαžΆαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αŸ’αžšαžΎαžŠαžΎαž˜αŸ’αž”αžΈαž—αŸ’αž‡αžΆαž”αŸ‹αžŠαŸ„αž™αž”αŸ’αžšαžΎαž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ† remote_user αŸ” αž•αž„αžŠαŸ‚αžš αž–αŸαžαŸŒαž˜αžΆαž“αž’αŸ†αž–αžΈαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž–αžΈαž…αž˜αŸ’αž„αžΆαž™ αž‡αžΆαžšαžΏαž™αŸ—αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€ αž αžΎαž™αž’αŸ’αž“αž€αž˜αž·αž“αž‚αž½αžšαžαŸ’αž‡αŸ‡αžαŸ’αž‡αžΆαž™αž–αŸαž›αžœαŸαž›αžΆαž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αŸ’αžšαž˜αžΌαž›αžœαžΆαž‘αŸαŸ” αž€αž·αž…αŸ’αž…αž€αžΆαžšαž“αŸαŸ‡αž€αŸαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž·αž‘αž•αž„αžŠαŸ‚αžšαŸ–

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

αžŸαžΆαž€αž›αŸ’αž”αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαŸ€αžœαž—αŸ…αž›αŸαž„αž˜αŸ’αžαž„αž‘αŸ€αž αž αžΎαž™αžαŸ’αžšαžΌαžœαž”αŸ’αžšαžΆαž€αžŠαžαžΆαž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ” (αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€β€‹αž”αžΆαž“β€‹αž”αž‰αŸ’αž‡αžΆαž€αŸ‹β€‹αž’αŸ’αž“αž€β€‹αž”αŸ’αžšαžΎβ€‹αž‡αžΆ root αž“αŸ„αŸ‡β€‹αž’αŸ’αž“αž€β€‹αž€αŸβ€‹αžαŸ’αžšαžΌαžœβ€‹αž”αž‰αŸ’αž‡αžΆαž€αŸ‹β€‹αž€αžΆαžšβ€‹αž€αŸ’αž›αžΆαž™β€‹αž‡αžΆαŸ– αžŸαŸαž…αž€αŸ’αžαžΈβ€‹αžŽαŸ‚αž“αžΆαŸ†β€‹αž–αž·αžβ€‹αž•αž„β€‹αžŠαŸ‚αžš αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αž‘αž‘αž½αž›β€‹αž”αžΆαž“β€‹αžŸαž·αž‘αŸ’αž’αž·β€‹αž€αžΎαž“αž‘αžΎαž„αŸ” αžŠαžΌαž…β€‹αžŠαŸ‚αž›β€‹αž”αžΆαž“β€‹αžŸαžšαžŸαŸαžšβ€‹αž€αŸ’αž“αž»αž„β€‹αž―αž€αžŸαžΆαžšαŸ– become set to β€˜true’/’yes’ to activate privilege escalation. αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαžœαžΆαž˜αž·αž“αž…αŸ’αž”αžΆαžŸαŸ‹αžαžΆαž αŸαžαž»αž’αŸ’αžœαžΈαž€αŸαžŠαŸ„αž™) αŸ”

αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž’αŸ’αž“αž€αž“αžΉαž„αž‘αž‘αž½αž›αž”αžΆαž“αž€αŸ†αž αž»αžŸαžŠαŸ‚αž›αž”αžŽαŸ’αžαžΆαž›αž˜αž€αž–αžΈαž€αžΆαžšαž–αž·αžαžŠαŸ‚αž›αžαžΆ ansible αž˜αž·αž“αž’αžΆαž…αž€αŸ†αžŽαžαŸ‹αž’αŸ’αž“αž€αž”αž€αž”αŸ’αžšαŸ‚ Python αž”αžΆαž“αž‘αŸ αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž’αŸ’αž“αž€αž’αžΆαž…αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αžœαžΆαžŠαŸ„αž™αžŠαŸƒαŸ–

ansible_python_interpreter: /usr/bin/python3 

αž’αŸ’αž“αž€αž’αžΆαž…αžŸαŸ’αžœαŸ‚αž„αžšαž€αž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž›αž’αŸ’αž“αž€αž˜αžΆαž“ python αžŠαŸ„αž™αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ whereis python.

αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αž€αž‰αŸ’αž…αž”αŸ‹αž”αŸ’αžšαž–αŸαž“αŸ’αž’

αž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™αžŸαŸ’αžαž„αŸ‹αžŠαžΆαžšαžšαž”αžŸαŸ‹ Ansible αžšαž½αž˜αž˜αžΆαž“αž˜αŸ‰αžΌαžŒαž»αž›αž‡αžΆαž…αŸ’αžšαžΎαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž€αž‰αŸ’αž…αž”αŸ‹αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž•αŸ’αžŸαŸαž„αŸ— αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž™αžΎαž„αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αžŸαžšαžŸαŸαžšαžŸαŸ’αž‚αŸ’αžšαžΈαž” bash αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž αŸαžαž»αž•αž›αžŽαžΆαž˜αž½αž™αž‘αžΎαž™αŸ” αž₯αž‘αžΌαžœαž“αŸαŸ‡αž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαž˜αŸ‰αžΌαžŒαž»αž›αž˜αž½αž™αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαŸ„αž˜αž˜αŸ‰αžΌαžŒαž»αž›αž‘αžΆαŸ†αž„αž“αŸαŸ‡αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αž”αŸ’αžšαž–αŸαž“αŸ’αž’ αž“αž·αž„αžŠαŸ†αž‘αžΎαž„αž€αž‰αŸ’αž…αž”αŸ‹αž”αŸ’αžšαž–αŸαž“αŸ’αž’αŸ” αžαŸ’αž‰αž»αŸ†αž˜αžΆαž“ Ubuntu Linux αž“αŸ…αž›αžΎ VPS αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ† αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αž‘αžΎαž„αž€αž‰αŸ’αž…αž”αŸ‹ αžαŸ’αž‰αž»αŸ†αž”αŸ’αžšαžΎ apt-get ΠΈ αž˜αŸ‰αžΌαžŒαž»αž›αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžœαžΆαŸ”. αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž€αŸ†αž–αž»αž„αž”αŸ’αžšαžΎαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž•αŸ’αžŸαŸαž„ αž“αŸ„αŸ‡αž’αŸ’αž“αž€αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαžαŸ’αžšαžΌαžœαž€αžΆαžšαž˜αŸ‰αžΌαžŒαž»αž›αž•αŸ’αžŸαŸαž„ (αžŸαžΌαž˜αž…αžΆαŸ†αžαžΆ αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž“αž·αž™αžΆαž™αž“αŸ…αžŠαžΎαž˜αžŠαŸ†αž”αžΌαž„αžαžΆ αž™αžΎαž„αžαŸ’αžšαžΌαžœαžŠαžΉαž„αž‡αžΆαž˜αž»αž“αž’αŸ†αž–αžΈαž’αŸ’αžœαžΈ αž“αž·αž„αžšαž”αŸ€αž”αžŠαŸ‚αž›αž™αžΎαž„αž“αžΉαž„αž’αŸ’αžœαžΎ)αŸ” αž‘αŸ„αŸ‡αž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αžœαžΆαž€αŸ’αž™αžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž‘αŸ†αž“αž„αž‡αžΆαž“αžΉαž„αžŸαŸ’αžšαžŠαŸ€αž„αž‚αŸ’αž“αžΆαŸ”

αžαŸ„αŸ‡αž”αŸ†αž–αŸαž‰αžŸαŸ€αžœαž—αŸ…αž›αŸαž„αžšαž”αžŸαŸ‹αž™αžΎαž„αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αž·αž…αŸ’αž…αž€αžΆαžšαžŠαŸ†αž”αžΌαž„αŸ–

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

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

Task αž‚αžΊαž–αž·αžαž‡αžΆαž€αž·αž…αŸ’αž…αž€αžΆαžšαžŠαŸ‚αž› Ansible αž“αžΉαž„αž’αž“αž»αžœαžαŸ’αžαž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž–αžΈαž…αž˜αŸ’αž„αžΆαž™αŸ” αž™αžΎαž„αž•αŸ’αžαž›αŸ‹αžˆαŸ’αž˜αŸ„αŸ‡αž±αŸ’αž™αž—αžΆαžšαž€αž·αž…αŸ’αž… αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž™αžΎαž„αž’αžΆαž…αžαžΆαž˜αžŠαžΆαž“αž€αžΆαžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αžšαž”αžŸαŸ‹αžœαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž€αŸ†αžŽαžαŸ‹αž αŸαžαž»αŸ” αž αžΎαž™αž™αžΎαž„αž–αžŽαŸŒαž“αžΆ αžŠαŸ„αž™αž”αŸ’αžšαžΎαžœαžΆαž€αŸ’αž™αžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž“αŸƒαž˜αŸ‰αžΌαžŒαž»αž›αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž˜αž½αž™ αžαžΎαžœαžΆαžαŸ’αžšαžΌαžœαž’αŸ’αžœαžΎαž’αŸ’αžœαžΈαžαŸ’αž›αŸ‡αŸ” αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈβ€‹αž“αŸαŸ‡ apt: update_cache=yes - αž“αž·αž™αžΆαž™αžαžΆαžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αž€αž‰αŸ’αž…αž”αŸ‹αž”αŸ’αžšαž–αŸαž“αŸ’αž’αžŠαŸ„αž™αž”αŸ’αžšαžΎαž˜αŸ‰αžΌαžŒαž»αž› apt αŸ” αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž‘αžΈαž–αžΈαžšαž‚αžΊαžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž”αž“αŸ’αžαž·αž…αŸ” αž™αžΎαž„αž”αž‰αŸ’αž‡αžΌαž“αž”αž‰αŸ’αž‡αžΈαž€αž‰αŸ’αž…αž”αŸ‹αž˜αž½αž™αž‘αŸ…αž˜αŸ‰αžΌαžŒαž»αž› apt αž αžΎαž™αž“αž·αž™αžΆαž™αžαžΆαž–αž½αž€αž‚αŸαž‚αžΊ state αž‚αž½αžšαžαŸ‚αž€αŸ’αž›αžΆαž™αž‡αžΆ presentαž“αŸ„αŸ‡αž‚αžΊαž™αžΎαž„αž“αž·αž™αžΆαž™αžαžΆαžŠαŸ†αž‘αžΎαž„αž€αž‰αŸ’αž…αž”αŸ‹αž‘αžΆαŸ†αž„αž“αŸαŸ‡αŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αžœαž·αž’αžΈαžŸαŸ’αžšαžŠαŸ€αž„αž‚αŸ’αž“αžΆαž“αŸαŸ‡ αž™αžΎαž„αž’αžΆαž…αž”αŸ’αžšαžΆαž”αŸ‹αž–αž½αž€αž‚αŸαž±αŸ’αž™αž›αž»αž”αž–αž½αž€αžœαžΆ αž¬αž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αž–αž½αž€αžœαžΆαžŠαŸ„αž™αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžš state. αžŸαžΌαž˜αž…αŸ†αžŽαžΆαŸ†αžαžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž•αŸ’αž›αžΌαžœαžŠαŸ‚αž€αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ postgresql αž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαž€αž‰αŸ’αž…αž”αŸ‹ postgresql-contrib αžŠαŸ‚αž›αž™αžΎαž„αž€αŸ†αž–αž»αž„αžŠαŸ†αž‘αžΎαž„αž₯αž‘αžΌαžœαž“αŸαŸ‡αŸ” αž‡αžΆαžαŸ’αž˜αžΈαž˜αŸ’αžαž„αž‘αŸ€αž αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαžŠαžΉαž„ αž αžΎαž™αž’αŸ’αžœαžΎαžœαžΆαžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„ αž“αžΉαž„αž˜αž·αž“αž’αŸ’αžœαžΎαž”αŸ‚αž”αž“αŸαŸ‡αž‘αŸαŸ”

αžŸαžΆαž€αž›αŸ’αž”αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαŸ€αžœαž—αŸ…αž›αŸαž„αž˜αŸ’αžαž„αž‘αŸ€αž αž αžΎαž™αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžαžΆαž€αž‰αŸ’αž…αž”αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ†αž‘αžΎαž„αŸ”

αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžαŸ’αž˜αžΈαŸ”

αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ Ansible αž€αŸαž˜αžΆαž“αž˜αŸ‰αžΌαžŒαž»αž›αž•αž„αžŠαŸ‚αžš - αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αŸ” αž…αžΌαžšαž”αž“αŸ’αžαŸ‚αž˜αž€αž·αž…αŸ’αž…αž€αžΆαžšαž˜αž½αž™αž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αž (αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž›αžΆαž€αŸ‹αž•αŸ’αž“αŸ‚αž€αžŠαŸ‚αž›αž‚αŸαžŸαŸ’αž‚αžΆαž›αŸ‹αžšαž½αž…αž αžΎαž™αž“αŸƒαžŸαŸ€αžœαž—αŸ…αž›αŸαž„αž“αŸ…αž–αžΈαž€αŸ’αžšαŸ„αž™αž˜αžαž·αž™αŸ„αž”αž›αŸ‹ αžŠαžΎαž˜αŸ’αž”αžΈαž€αž»αŸ†αž±αŸ’αž™αž…αž˜αŸ’αž›αž„αžœαžΆαž‘αžΆαŸ†αž„αžŸαŸ’αžšαž»αž„αžšαžΆαž›αŸ‹αž–αŸαž›)αŸ–

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

αž™αžΎαž„αž”αž„αŸ’αž€αžΎαžαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžαŸ’αž˜αžΈ αž€αŸ†αžŽαžαŸ‹αž‚αŸ’αžšαŸ„αž„αž€αžΆαžšαžŽαŸ αž“αž·αž„αž–αžΆαž€αŸ’αž™αžŸαž˜αŸ’αž„αžΆαžαŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžœαžΆαŸ” αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž™αžΎαž„αž‡αž½αž”αž”αž‰αŸ’αž αžΆαž‡αžΆαž…αŸ’αžšαžΎαž“αŸ” αž…αž»αŸ‡β€‹αž”αžΎβ€‹αžˆαŸ’αž˜αŸ„αŸ‡β€‹αž’αŸ’αž“αž€β€‹αž”αŸ’αžšαžΎβ€‹αžαŸ’αžšαžΌαžœβ€‹αž€αžΆαžšβ€‹αžαž»αžŸβ€‹αž‚αŸ’αž“αžΆβ€‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹β€‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“β€‹αž•αŸ’αžŸαŸαž„? αž αžΎαž™β€‹αž€αžΆαžšβ€‹αž‘αž»αž€β€‹αž›αŸαžβ€‹αžŸαž˜αŸ’αž„αžΆαžαŸ‹β€‹αž‡αžΆβ€‹αž’αž€αŸ’αžŸαžšβ€‹αž…αŸ’αž”αžΆαžŸαŸ‹β€‹αž€αŸ’αž“αž»αž„β€‹αžŸαŸ€αžœαž—αŸ…β€‹αž›αŸαž„β€‹αž‚αžΊαž‡αžΆβ€‹αž‚αŸ†αž“αž·αžβ€‹αž’αžΆαž€αŸ’αžšαž€αŸ‹β€‹αžŽαžΆαžŸαŸ‹αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ αž…αžΌαžšαž™αžΎαž„αžŠαžΆαž€αŸ‹αžˆαŸ’αž˜αŸ„αŸ‡αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ αž“αž·αž„αž–αžΆαž€αŸ’αž™αžŸαž˜αŸ’αž„αžΆαžαŸ‹αž‘αŸ…αž‡αžΆαž’αžαŸαžš αž αžΎαž™αž“αŸ…αž…αž»αž„αž”αž‰αŸ’αž…αž”αŸ‹αž“αŸƒαž’αžαŸ’αžαž”αž‘ αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž”αž„αŸ’αž αžΆαž‰αž–αžΈαžšαž”αŸ€αž”αž’αŸŠαž·αž“αž‚αŸ’αžšαžΈαž”αž–αžΆαž€αŸ’αž™αžŸαž˜αŸ’αž„αžΆαžαŸ‹αŸ”

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

αž’αžαŸαžšβ€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž€αŸ†αžŽαžαŸ‹β€‹αž€αŸ’αž“αž»αž„β€‹αžŸαŸ€αžœαž—αŸ…β€‹αž…αžΆαž€αŸ‹β€‹αžŠαŸ„αž™β€‹αž”αŸ’αžšαžΎβ€‹αžŠαž„αŸ’αž€αŸ€αž”β€‹αžšαž½αž‰β€‹αž‘αŸ’αžœαŸαŸ”

αž™αžΎαž„αž“αžΉαž„αž”αž„αŸ’αž αžΆαž‰αž–αžΈαžαž˜αŸ’αž›αŸƒαž“αŸƒαž’αžαŸαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžšαžŸαžΆαžšαž–αžΎαž—αŸαžŽαŸ’αžŒαŸ–

123.123.123.123

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

αžŸαžΌαž˜αž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ† [all:vars] - αžœαžΆαž“αž·αž™αžΆαž™αžαžΆαž”αŸ’αž›αž»αž€αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž“αŸƒαž’αžαŸ’αžαž”αž‘αž‚αžΊαž‡αžΆαž’αžαŸαžš (vars) αž αžΎαž™αž–αž½αž€αžœαžΆαž’αžΆαž…αž’αž“αž»αžœαžαŸ’αžαž”αžΆαž“αž…αŸ†αž–αŸ„αŸ‡αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž‘αžΆαŸ†αž„αž’αžŸαŸ‹ (αž‘αžΆαŸ†αž„αž’αžŸαŸ‹) αŸ”

αž€αžΆαžšαžšαž…αž“αžΆαž€αŸαž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž•αž„αžŠαŸ‚αžšαŸ” "{{ user_password | password_hash('sha512') }}". αžšαžΏαž„αž“αŸαŸ‡αž‚αžΊαžαžΆ ansible αž˜αž·αž“αžŠαŸ†αž‘αžΎαž„αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžαžΆαž˜αžšαž™αŸˆ user_add αžŠαžΌαž…αž‡αžΆαž’αŸ’αž“αž€αž“αžΉαž„αž’αŸ’αžœαžΎαžœαžΆαžŠαŸ„αž™αžŠαŸƒαŸ” αž αžΎαž™αžœαžΆαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹ αžŠαŸ‚αž›αž‡αžΆαž˜αžΌαž›αž αŸαžαž»αžŠαŸ‚αž›αž™αžΎαž„αžαŸ’αžšαžΌαžœαžαŸ‚αž”αŸ†αž”αŸ’αž›αŸ‚αž„αž–αžΆαž€αŸ’αž™αžŸαž˜αŸ’αž„αžΆαžαŸ‹αž‘αŸ…αž‡αžΆ 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"

αž’αŸ’αžœαžΈβ€‹αž‚αŸ’αžšαž”αŸ‹β€‹αž™αŸ‰αžΆαž„β€‹αž‚αžΊβ€‹αžŸαžΆαž˜αž‰αŸ’αž‰β€‹αžŽαžΆαžŸαŸ‹ αž™αžΎαž„β€‹αž€αŸβ€‹αž˜αžΆαž“β€‹αž˜αŸ‰αžΌαžŒαž»αž›β€‹αž€αŸ’αžšαž»αž˜β€‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹β€‹αž”αž„αŸ’αž€αžΎαžβ€‹αž€αŸ’αžšαž»αž˜ αžŠαŸ„αž™β€‹αž˜αžΆαž“β€‹αžœαžΆαž€αŸ’αž™αžŸαž˜αŸ’αž–αŸαž“αŸ’αž’β€‹αžŸαŸ’αžšαžŠαŸ€αž„β€‹αž“αžΉαž„ apt αŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€ αžœαžΆαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αž αžΎαž™αž€αŸ’αž“αž»αž„αž€αžΆαžšαž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡αž€αŸ’αžšαž»αž˜αž“αŸαŸ‡αž‘αŸ…αž€αžΆαž“αŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ (groups: "sudo").
αžœαžΆαž€αŸαž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž•αž„αžŠαŸ‚αžšαž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αž“αŸ’αžαŸ‚αž˜αžŸαŸ„ ssh αž‘αŸ…αž€αžΆαž“αŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž“αŸαŸ‡ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž™αžΎαž„αž’αžΆαž…αž…αžΌαž›αžŠαŸ„αž™αž”αŸ’αžšαžΎαžœαžΆαžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αž–αžΆαž€αŸ’αž™αžŸαž˜αŸ’αž„αžΆαžαŸ‹αŸ–

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

αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸαŸ‡αž€αžΆαžšαžšαž…αž“αžΆαž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸ "{{ lookup('file', '~/.ssh/id_rsa.pub') }}" β€” αžœαžΆαž…αž˜αŸ’αž›αž„αž˜αžΆαžαž·αž€αžΆαž“αŸƒαž―αž€αžŸαžΆαžš id_rsa.pub (αžˆαŸ’αž˜αŸ„αŸ‡αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž’αžΆαž…αžαž»αžŸαž‚αŸ’αž“αžΆ) αž“αŸ„αŸ‡αž‚αžΊαž‡αžΆαž•αŸ’αž“αŸ‚αž€αžŸαžΆαž’αžΆαžšαžŽαŸˆαž“αŸƒαžŸαŸ„ ssh αž αžΎαž™αž”αž‰αŸ’αž…αžΌαž›αžœαžΆαž‘αŸ…αž€αŸ’αž“αž»αž„αž”αž‰αŸ’αž‡αžΈαž“αŸƒαžŸαŸ„αžŠαŸ‚αž›αž”αžΆαž“αž’αž“αž»αž‰αŸ’αž‰αžΆαžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαŸ”

αžαž½αž“αžΆαž‘αžΈ

αž€αž·αž…αŸ’αž…αž€αžΆαžšαž‘αžΆαŸ†αž„αž”αžΈαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αžΆαžαŸ‹αžαŸ’αž“αžΆαž€αŸ‹αž™αŸ‰αžΆαž„αž„αžΆαž™αžŸαŸ’αžšαž½αž›αž‘αŸ…αž‡αžΆαž€αŸ’αžšαž»αž˜αž˜αž½αž™αž“αŸƒαž€αž·αž…αŸ’αž…αž€αžΆαžš αž αžΎαž™αžœαžΆαž‡αžΆαž€αžΆαžšαž›αŸ’αž’αž€αŸ’αž“αž»αž„αž€αžΆαžšαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž€αŸ’αžšαž»αž˜αž“αŸαŸ‡αžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€αž–αžΈαžŸαŸ€αžœαž—αŸ…αž›αŸαž„αžŸαŸ†αžαžΆαž“αŸ‹ αžŠαžΎαž˜αŸ’αž”αžΈαž€αž»αŸ†αž±αŸ’αž™αžœαžΆαž’αŸ†αž–αŸαž€αŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αŸ„αž›αž”αŸ†αžŽαž„αž“αŸαŸ‡ Ansible αž˜αžΆαž“ αžαž½αž“αžΆαž‘αžΈ.
αž™αŸ„αž„αžαžΆαž˜αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž―αž€αžŸαžΆαžšαžŠαŸ‚αž›αž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αž“αŸ…αžŠαžΎαž˜αžŠαŸ†αž”αžΌαž„ αžαž½αž“αžΆαž‘αžΈαžαŸ’αžšαžΌαžœαžαŸ‚αžŠαžΆαž€αŸ‹αž€αŸ’αž“αž»αž„αžαžαžαž½αž“αžΆαž‘αžΈαžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€ αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαž½αž“αžΆαž‘αžΈαž“αžΈαž˜αž½αž™αŸ—αž˜αžΆαž“αžαžαžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€αžŠαŸ‚αž›αž˜αžΆαž“αžˆαŸ’αž˜αŸ„αŸ‡αžŠαžΌαž…αž‚αŸ’αž“αžΆ αž“αŸ…αžαžΆαž„αž€αŸ’αž“αž»αž„αž€αž·αž…αŸ’αž…αž€αžΆαžš αž―αž€αžŸαžΆαžš αž‚αŸ†αžšαžΌ αžαžαž―αž€αžŸαžΆαžšαŸ”αž›αŸ”
αžαŸ„αŸ‡αž”αž„αŸ’αž€αžΎαžαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž―αž€αžŸαžΆαžšαŸ– ./ansible/roles/user/tasks/main.yml (αž˜αŸαž‚αžΊαž‡αžΆαž―αž€αžŸαžΆαžšαžŸαŸ†αžαžΆαž“αŸ‹αžŠαŸ‚αž›αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‘αž»αž€ αž“αž·αž„αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αžαž½αž“αžΆαž‘αžΈαžαŸ’αžšαžΌαžœαž”αžΆαž“αž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ…αžŸαŸ€αžœαž—αŸ…αž›αŸαž„αŸ” αž―αž€αžŸαžΆαžšαžαž½αž“αžΆαž‘αžΈαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž’αžΆαž…αž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ…αžœαžΆαž”αžΆαž“)αŸ” αž₯αž‘αžΌαžœβ€‹αž“αŸαŸ‡ αž’αŸ’αž“αž€β€‹αž’αžΆαž…β€‹αž•αŸ’αž‘αŸαžšβ€‹αž€αž·αž…αŸ’αž…αž€αžΆαžšβ€‹αž‘αžΆαŸ†αž„αž’αžŸαŸ‹β€‹αžŠαŸ‚αž›β€‹αž‘αžΆαž€αŸ‹αž‘αž„β€‹αž“αžΉαž„β€‹αž’αŸ’αž“αž€β€‹αž”αŸ’αžšαžΎβ€‹αž‘αŸ…β€‹αž―αž€αžŸαžΆαžšβ€‹αž“αŸαŸ‡αŸ–

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

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

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

αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ€αžœαž—αŸ…αž…αžΆαž€αŸ‹αž˜αŸ αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαžαŸ‚αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαž”αŸ’αžšαžΎαžαž½αž“αžΆαž‘αžΈαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαŸ–

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

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

  roles:
    - user

αžŠαžΌαž…αž‚αŸ’αž“αžΆαž“αŸαŸ‡αž•αž„αžŠαŸ‚αžš, αžœαžΆαž’αžΆαž…αžŸαž˜αž αŸαžαž»αž•αž›αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž˜αž»αž“αž–αŸαž›αž€αžΆαžšαž„αžΆαžšαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž‘αžΆαŸ†αž„αž’αžŸαŸ‹; αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžŠαžΌαž…αž“αŸαŸ‡αž’αŸ’αž“αž€αž’αžΆαž…αž”αŸ’αžαžΌαžšαžˆαŸ’αž˜αŸ„αŸ‡αž”αŸ’αž›αž»αž€ tasks αžŠαŸ‚αž›αž–αž½αž€αž‚αŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„ pre_tasks.

αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„ nginx

αž™αžΎαž„αž‚αž½αžšαžαŸ‚αžŠαŸ†αž‘αžΎαž„ Nginx αžšαž½αž…αž αžΎαž™ αž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αŸ†αžŽαžαŸ‹αžœαžΆ αž αžΎαž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžœαžΆαŸ” αž…αžΌαžšαž’αŸ’αžœαžΎαžœαžΆαž—αŸ’αž›αžΆαž˜αŸ—αž“αŸ…αž€αŸ’αž“αž»αž„αžαž½αž“αžΆαž‘αžΈαŸ” αžαŸ„αŸ‡αž”αž„αŸ’αž€αžΎαžαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž―αž€αžŸαžΆαžšαŸ–

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

αž₯αž‘αžΌαžœαž“αŸαŸ‡αž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαž―αž€αžŸαžΆαžš αž“αž·αž„αž‚αŸ†αžšαžΌαŸ” αž—αžΆαž–αžαž»αžŸαž‚αŸ’αž“αžΆαžšαžœαžΆαž„αž–αž½αž€αžœαžΆαž‚αžΊαžαžΆ ansible αž…αž˜αŸ’αž›αž„αž―αž€αžŸαžΆαžšαžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αžŠαžΌαž…αž‡αžΆαŸ” αž αžΎαž™αž‚αŸ†αžšαžΌαžαŸ’αžšαžΌαžœαžαŸ‚αž˜αžΆαž“αž•αŸ’αž“αŸ‚αž€αž”αž“αŸ’αžαŸ‚αž˜ j2 αž αžΎαž™αž–αž½αž€αž‚αŸαž’αžΆαž…αž”αŸ’αžšαžΎαžαž˜αŸ’αž›αŸƒαž’αžαŸαžšαžŠαŸ„αž™αž”αŸ’αžšαžΎαžŠαž„αŸ’αž€αŸ€αž” curly αž‘αŸ’αžœαŸαžŠαžΌαž…αž‚αŸ’αž“αžΆαŸ”

αžαŸ„αŸ‡αž”αžΎαž€ 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 }};
  ....
}

αž™αž€αž…αž·αžαŸ’αžαž‘αž»αž€αžŠαžΆαž€αŸ‹αž›αžΎαž€αžΆαžšαž”αž‰αŸ’αž…αžΌαž› {{ 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 αž–αž·αžŸαŸαžŸ αž αžΎαž™αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αžŠαŸ‚αž›αžŸαŸ€αžœαž—αŸ…αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž“αŸ…αž‘αžΈαž“αŸ„αŸ‡αŸ”
αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž…αž„αŸ‹αž˜αžΆαž“αž―αž€αžŸαžΆαžšαžŸαžΆαžšαž–αžΎαž—αŸαžŽαŸ’αžŒαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž‡αžΆαž…αŸ’αžšαžΎαž“ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αŸ’αžšαž»αž˜αžαŸ‚αž˜αž½αž™ αž“αŸαŸ‡αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαžŠαŸ„αž™αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

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

αž‡αž˜αŸ’αžšαžΎαžŸαž˜αž½αž™αž‘αŸ€αžαž‚αžΊαžαŸ’αžšαžΌαžœαž˜αžΆαž“αž―αž€αžŸαžΆαžšαžŸαžΆαžšαž–αžΎαž—αŸαžŽαŸ’αžŒαžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αŸ’αžšαž»αž˜αž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆαŸ” αž¬αž’αŸ’αž“αž€αž’αžΆαž…αž”αž‰αŸ’αž…αžΌαž›αž‚αŸ’αž“αžΆαž“αžΌαžœαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž‘αžΆαŸ†αž„αž–αžΈαžš αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž•αŸ’αžŸαŸαž„αž‚αŸ’αž“αžΆαž‡αžΆαž…αŸ’αžšαžΎαž“αŸ”

αž…αžΌαžšαž™αžΎαž„αžαŸ’αžšαž›αž”αŸ‹αž‘αŸ…αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„ nginx αžœαž·αž‰αŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž…αž˜αŸ’αž›αž„αž―αž€αžŸαžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ αž™αžΎαž„αžαŸ’αžšαžΌαžœαž”αž„αŸ’αž€αžΎαž symlink αž€αŸ’αž“αž»αž„ 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

αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž‚αžΊαžŸαžΆαž˜αž‰αŸ’αž‰αž“αŸ…αž‘αžΈαž“αŸαŸ‡ - αž˜αŸ‰αžΌαžŒαž»αž› ansible αž˜αŸ’αžαž„αž‘αŸ€αžαž‡αžΆαž˜αž½αž™αž“αžΉαž„αžœαžΆαž€αŸ’αž™αžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŸαŸ’αžαž„αŸ‹αžŠαžΆαžšαžŸαž˜αžšαž˜αŸ’αž™αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž˜αžΆαž“αž…αŸ†αžŽαž»αž…αž˜αž½αž™αŸ” αžšαžΆαž›αŸ‹αž–αŸαž›αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ nginx αž‘αžΎαž„αžœαž·αž‰αž˜αž·αž“αž˜αžΆαž“αž…αŸ†αžŽαž»αž…αž’αŸ’αžœαžΈαž“αŸ„αŸ‡αž‘αŸαŸ” αžαžΎαž’αŸ’αž“αž€αž”αžΆαž“αž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž‘αŸαžαžΆαž™αžΎαž„αž˜αž·αž“αžŸαžšαžŸαŸαžšαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžŠαžΌαž…αž‡αžΆ "αž’αŸ’αžœαžΎαžŠαžΌαž…αž“αŸαŸ‡" αžœαžΆαž€αŸ’αž™αžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž˜αžΎαž›αž‘αŸ…αž αžΆαž€αŸ‹αžŠαžΌαž…αž‡αžΆ "αž“αŸαŸ‡αž‚αž½αžšαžαŸ‚αž˜αžΆαž“αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž“αŸαŸ‡" αŸ” αž αžΎαž™αž—αžΆαž‚αž…αŸ’αžšαžΎαž“αž“αŸαŸ‡αž–αž·αžαž‡αžΆαžšαž”αŸ€αž”αžŠαŸ‚αž› ansible αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž€αŸ’αžšαž»αž˜αž˜αžΆαž“αžšαž½αž…αž αžΎαž™ αž¬αž€αž‰αŸ’αž…αž”αŸ‹αž”αŸ’αžšαž–αŸαž“αŸ’αž’αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ†αž‘αžΎαž„αžšαž½αž…αž αžΎαž™ ansible αž“αžΉαž„αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžœαžΆ αž αžΎαž™αžšαŸ†αž›αž„αž€αž·αž…αŸ’αž…αž€αžΆαžšαž“αŸαŸ‡αŸ” αžŠαžΌαž…αž‚αŸ’αž“αžΆαž“αŸαŸ‡αž•αž„αžŠαŸ‚αžš αž―αž€αžŸαžΆαžšαž“αžΉαž„αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αž˜αŸ’αž›αž„αž‘αŸ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž–αž½αž€αžœαžΆαžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαž‘αžΆαŸ†αž„αžŸαŸ’αžšαž»αž„αž“αžΌαžœαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž˜αžΆαž“αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαŸ” αž™αžΎαž„αž’αžΆαž…αž‘αžΆαž‰αž™αž€αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž–αžΈαžœαžΆ αž αžΎαž™αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ nginx αž‘αžΎαž„αžœαž·αž‰αž”αžΆαž“αž›αž»αŸ‡αžαŸ’αžšαžΆαžαŸ‚αž―αž€αžŸαžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαŸ” αž˜αžΆαž“αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž’αŸ†αž–αžΈαž€αžΆαžšαž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžšαžΏαž„αž“αŸαŸ‡αŸ–

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

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

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

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

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

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž―αž€αžŸαžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŽαžΆαž˜αž½αž™αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžš αž…αŸ’αž”αžΆαž”αŸ‹αž…αž˜αŸ’αž›αž„αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαž‘αžΎαž„ αž αžΎαž™αž’αžαŸαžšαž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡ restart_nginx. αž αžΎαž™αž›αž»αŸ‡αžαŸ’αžšαžΆαžαŸ‚αž’αžαŸαžšαž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡ αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž“αžΉαž„αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž‘αžΎαž„αžœαž·αž‰αŸ”

αž αžΎαž™αž‡αžΆαž€αžΆαžšαž–αž·αžαžŽαžΆαžŸαŸ‹ αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž”αž“αŸ’αžαŸ‚αž˜αžαž½αž“αžΆαž‘αžΈ nginx αž‘αŸ…αžŸαŸ€αžœαž—αŸ…αž›αŸαž„αž˜αŸαŸ”

αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„ postgresql

αž™αžΎαž„αžαŸ’αžšαžΌαžœαž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš postgresql αžŠαŸ„αž™αž”αŸ’αžšαžΎ systemd αžαžΆαž˜αžšαž”αŸ€αž”αžŠαžΌαž…αžŠαŸ‚αž›αž™αžΎαž„αž”αžΆαž“αž’αŸ’αžœαžΎαž‡αžΆαž˜αž½αž™ nginx αž αžΎαž™αž€αŸαž’αžΆαž…αž”αž„αŸ’αž€αžΎαž user αžŠαŸ‚αž›αž™αžΎαž„αž“αžΉαž„αž”αŸ’αžšαžΎαžŠαžΎαž˜αŸ’αž”αžΈαž…αžΌαž›αž”αŸ’αžšαžΎ database αž“αž·αž„ database αžαŸ’αž›αž½αž“αž―αž„αž•αž„αžŠαŸ‚αžšαŸ”
αžαŸ„αŸ‡αž”αž„αŸ’αž€αžΎαžαžαž½αž“αžΆαž‘αžΈ /ansible/roles/postgresql/tasks/main.yml:

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

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

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

αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž˜αž·αž“αžšαŸ€αž”αžšαžΆαž”αŸ‹αž–αžΈαžšαž”αŸ€αž”αž”αž“αŸ’αžαŸ‚αž˜αž’αžαŸαžšαž‘αŸ…αž€αŸ’αž“αž»αž„αžŸαžΆαžšαž–αžΎαž—αŸαžŽαŸ’αžŒαž‘αŸ αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαž‡αžΆαž…αŸ’αžšαžΎαž“αžŠαž„αžšαž½αž…αž˜αž€αž αžΎαž™ αž€αŸαžŠαžΌαž…αž‡αžΆαžœαžΆαž€αŸ’αž™αžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž“αŸƒαž˜αŸ‰αžΌαžŒαž»αž› postgresql_db αž“αž·αž„ postgresql_user αŸ” αž–αŸαžαŸŒαž˜αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αž’αžΆαž…αžšαž€αž”αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžšαŸ” αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž”αŸ†αž•αž»αžαž“αŸ…αž‘αžΈαž“αŸαŸ‡αž‚αžΊ become_user: postgres. αž€αžΆαžšαž–αž·αžαž‚αžΊαžαžΆαžαžΆαž˜αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜ αž˜αžΆαž“αžαŸ‚αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ postgres αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αžŠαŸ‚αž›αž’αžΆαž…αž…αžΌαž›αž”αŸ’αžšαžΎαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ postgresql αž αžΎαž™αž˜αžΆαž“αžαŸ‚αž€αŸ’αž“αž»αž„αžŸαŸ’αžšαž»αž€αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ” αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž“αŸαŸ‡αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž™αžΎαž„αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž‡αŸ†αž“αž½αžŸαž±αŸ’αž™αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž“αŸαŸ‡ (αž‡αžΆαž€αžΆαžšαž–αž·αžαžŽαžΆαžŸαŸ‹αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž™αžΎαž„αž˜αžΆαž“αžŸαž·αž‘αŸ’αž’αž·αž…αžΌαž›αž”αŸ’αžšαžΎ)αŸ”
αžŠαžΌαž…αž‚αŸ’αž“αžΆαž“αŸαŸ‡αž•αž„αžŠαŸ‚αžš αž’αŸ’αž“αž€αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαžαŸ’αžšαžΌαžœαž”αž“αŸ’αžαŸ‚αž˜αž”αž“αŸ’αž‘αžΆαžαŸ‹αž‘αŸ… pg_hba.conf αžŠαžΎαž˜αŸ’αž”αžΈαž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαžαŸ’αž˜αžΈαž…αžΌαž›αž”αŸ’αžšαžΎαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ” αž“αŸαŸ‡αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαžαžΆαž˜αžšαž”αŸ€αž”αžŠαžΌαž…αž‚αŸ’αž“αžΆαž“αžΉαž„αž™αžΎαž„αž”αžΆαž“αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ nginx αŸ”

αž αžΎαž™αž‡αžΆαž€αžΆαžšαž–αž·αžαžŽαžΆαžŸαŸ‹ αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž”αž“αŸ’αžαŸ‚αž˜αžαž½αž“αžΆαž‘αžΈ postgresql αž‘αŸ…αžŸαŸ€αžœαž—αŸ…αž›αŸαž„αžŸαŸ†αžαžΆαž“αŸ‹αŸ”

αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„ Ruby β€‹β€‹αžαžΆαž˜αžšαž™αŸˆ rbenv

Ansible αž˜αž·αž“αž˜αžΆαž“αž˜αŸ‰αžΌαžŒαž»αž›αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ rbenv αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ†αž‘αžΎαž„αžŠαŸ„αž™αž€αžΆαžšαž€αŸ’αž›αžΌαž“ git 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

αž™αžΎαž„αž”αŸ’αžšαžΎαž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžšαž”αžŸαŸ‹ become_user αž˜αŸ’αžαž„αž‘αŸ€αž αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž€αžΆαžšαž€αŸ’αžšαŸ„αž˜αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŠαŸ‚αž›αž™αžΎαž„αž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αŸ„αž›αž”αŸ†αžŽαž„αž‘αžΆαŸ†αž„αž“αŸαŸ‡αŸ” αž…αžΆαž”αŸ‹αžαžΆαŸ†αž„αž–αžΈ rbenv αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ†αž‘αžΎαž„αž“αŸ…αž€αŸ’αž“αž»αž„αžαžαž•αŸ’αž‘αŸ‡αžšαž”αžŸαŸ‹αžœαžΆ αž αžΎαž™αž˜αž·αž“αž˜αŸ‚αž“αž“αŸ…αž‘αžΌαž‘αžΆαŸ†αž„αž–αž·αž—αž–αž›αŸ„αž€αž‘αŸαŸ” αž αžΎαž™αž™αžΎαž„αž€αŸαž”αŸ’αžšαžΎαž˜αŸ‰αžΌαžŒαž»αž› git αžŠαžΎαž˜αŸ’αž”αžΈαž€αŸ’αž›αžΌαž“αžƒαŸ’αž›αžΆαŸ†αž„ αžŠαŸ„αž™αž”αž‰αŸ’αž‡αžΆαž€αŸ‹ repo αž“αž·αž„ dest αŸ”

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž™αžΎαž„αžαŸ’αžšαžΌαžœαž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡ rbenv init αž“αŸ…αž€αŸ’αž“αž»αž„ bashrc αž αžΎαž™αž”αž“αŸ’αžαŸ‚αž˜ rbenv αž‘αŸ… PATH αž“αŸ…αž‘αžΈαž“αŸ„αŸ‡αŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž“αŸαŸ‡αž™αžΎαž„αž˜αžΆαž“αž˜αŸ‰αžΌαžŒαž»αž› lineinfile:

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

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

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαžŠαŸ†αž‘αžΎαž„ ruby_buildαŸ–

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

αž αžΎαž™αž‘αžΈαž”αŸ†αž•αž»αžαžŠαŸ†αž‘αžΎαž„ Ruby αŸ” αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαžαžΆαž˜αžšαž™αŸˆ rbenv αž–αŸ„αž›αž‚αžΊαžŸαžΆαž˜αž‰αŸ’αž‰αž‡αžΆαž˜αž½αž™αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ bash:

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

αž™αžΎαž„αž“αž·αž™αžΆαž™αžαžΆαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž˜αž½αž™αžŽαžΆαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž· αž“αž·αž„αž‡αžΆαž˜αž½αž™αž’αŸ’αžœαžΈαŸ” αž‘αŸ„αŸ‡αž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αž“αŸ…αž‘αžΈαž“αŸαŸ‡αž™αžΎαž„αž”αžΆαž“αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αž€αžΆαžšαž–αž·αžαžŠαŸ‚αž›αžαžΆ ansible αž˜αž·αž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αžΌαžŠαžŠαŸ‚αž›αž˜αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„ bashrc αž˜αž»αž“αž–αŸαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαŸ” αž“αŸαŸ‡αž˜αžΆαž“αž“αŸαž™αžαžΆ rbenv αž“αžΉαž„αžαŸ’αžšαžΌαžœαž€αŸ†αžŽαžαŸ‹αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ’αž‚αŸ’αžšαžΈαž”αžαŸ‚αž˜αž½αž™αŸ”

αž”αž‰αŸ’αž αžΆαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž‚αžΊαžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚αž€αžΆαžšαž–αž·αžαžŠαŸ‚αž›αžαžΆαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžŸαŸ‚αž›αž˜αž·αž“αž˜αžΆαž“αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž–αžΈαž‘αžŸαŸ’αžŸαž“αŸˆαžŠαŸ‚αž›αž’αžΆαž…αž™αž›αŸ‹αž”αžΆαž“αŸ” αž“αŸ„αŸ‡αž‚αžΊαžœαžΆαž“αžΉαž„αž˜αž·αž“αž˜αžΆαž“αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αžαžΆαžαžΎαž€αŸ†αžŽαŸ‚ Ruby αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ†αž‘αžΎαž„αž¬αž’αžαŸ‹αŸ” αž™αžΎαž„αž’αžΆαž…αž’αŸ’αžœαžΎαžœαžΆαžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„αž”αžΆαž“αŸ–

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

αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž“αŸ…αžŸαž›αŸ‹αž‚αžΊαžαŸ’αžšαžΌαžœαžŠαŸ†αž‘αžΎαž„ bundlerαŸ–

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

αž αžΎαž™αž˜αŸ’αžαž„αž‘αŸ€αž αž”αž“αŸ’αžαŸ‚αž˜αžαž½αž“αžΆαž‘αžΈαžšαž”αžŸαŸ‹αž™αžΎαž„ ruby_rbenv αž‘αŸ…αžŸαŸ€αžœαž—αŸ…αž›αŸαž„αžŸαŸ†αžαžΆαž“αŸ‹αŸ”

αž―αž€αžŸαžΆαžšαžŠαŸ‚αž›αž”αžΆαž“αž…αŸ‚αž€αžšαŸ†αž›αŸ‚αž€αŸ”

αž‡αžΆαž‘αžΌαž‘αŸ… αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž…αž”αŸ‹αž“αŸ…αž‘αžΈαž“αŸαŸ‡αŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€ αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž“αŸ…αžŸαŸαžŸαžŸαž›αŸ‹αž‚αžΊαžαŸ’αžšαžΌαžœαžŠαŸ†αžŽαžΎαžšαž€αžΆαžš capistrano αž αžΎαž™αžœαžΆαž“αžΉαž„αž…αž˜αŸ’αž›αž„αž€αžΌαžŠαžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„ αž”αž„αŸ’αž€αžΎαžαžαžαž―αž€αžŸαžΆαžšαž…αžΆαŸ†αž”αžΆαž…αŸ‹ αž“αž·αž„αž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ (αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αžœαžΈαŸ—αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœ)αŸ” αž‘αŸ„αŸ‡αž‡αžΆαž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ capistrano αž‡αžΆαžšαžΏαž™αŸ—αžαž˜αŸ’αžšαžΌαžœαž±αŸ’αž™αž˜αžΆαž“αž―αž€αžŸαžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž”αž“αŸ’αžαŸ‚αž˜αžŠαžΌαž…αž‡αžΆ database.yml ឬ .env αž–αž½αž€αžœαžΆαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αž˜αŸ’αž›αž„αžŠαžΌαž…αž―αž€αžŸαžΆαžš αž“αž·αž„αž‚αŸ†αžšαžΌαžŸαž˜αŸ’αžšαžΆαž”αŸ‹ nginx αžŠαŸ‚αžšαŸ” αž˜αžΆαž“αžαŸ‚αž—αžΆαž–αž”αŸ‰αž·αž“αž”αŸ’αžšαžŸαž”αŸ‹αž˜αž½αž™αŸ” αž˜αž»αž“αž–αŸαž›αž…αž˜αŸ’αž›αž„αž―αž€αžŸαžΆαžš αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž”αž„αŸ’αž€αžΎαžαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžαžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž–αž½αž€αžœαžΆ αž’αŸ’αžœαžΈαž˜αž½αž™αžŠαžΌαž…αž“αŸαŸ‡αŸ–

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

αž™αžΎαž„αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αžαŸ‚αžαžαž˜αž½αž™αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡ αž αžΎαž™ ansible αž“αžΉαž„αž”αž„αŸ’αž€αžΎαžαž˜αŸαžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž…αžΆαŸ†αž”αžΆαž…αŸ‹αŸ”

αžαž»αžŠαŸαž€ Ansible

αž™αžΎαž„αž”αžΆαž“αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αž€αžΆαžšαž–αž·αžαžŠαŸ‚αž›αžαžΆαž’αžαŸαžšαž’αžΆαž…αž˜αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŸαž˜αŸ’αž„αžΆαžαŸ‹αžŠαžΌαž…αž‡αžΆαž–αžΆαž€αŸ’αž™αžŸαž˜αŸ’αž„αžΆαžαŸ‹αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž”αžΆαž“αž”αž„αŸ’αž€αžΎαž .env αž―αž€αžŸαžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αž“αž·αž„ database.yml αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€ αžœαžΆαžαŸ’αžšαžΌαžœαžαŸ‚αž˜αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŸαŸ†αžαžΆαž“αŸ‹αŸ—αž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αžαŸ” αžœαžΆαž‡αžΆαž€αžΆαžšαž›αŸ’αž’αž€αŸ’αž“αž»αž„αž€αžΆαžšαž›αžΆαž€αŸ‹αž–αž½αž€αž‚αŸαž–αžΈαž—αŸ’αž“αŸ‚αž€αŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αŸ„αž›αž”αŸ†αžŽαž„αž“αŸαŸ‡αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎ αžαž»αžŠαŸαž€ ansible.

αžαŸ„αŸ‡αž”αž„αŸ’αž€αžΎαžαž―αž€αžŸαžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αžαŸαžš /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 αž“αžΉαž„αžŸαž½αžšαžšαž€αž–αžΆαž€αŸ’αž™αžŸαž˜αŸ’αž„αžΆαžαŸ‹ αž‘αžΆαž‰αž™αž€αž’αžαŸαžš αž“αž·αž„αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž—αžΆαžšαž€αž·αž…αŸ’αž…αŸ” αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αžΉαž„αž“αŸ…αžαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸŠαž·αž“αž‚αŸ’αžšαžΈαž”αŸ”

αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž–αŸαž‰αž›αŸαž‰αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αŸ’αžšαž»αž˜αž‡αžΆαž…αŸ’αžšαžΎαž“αž“αŸƒ hosts αž“αž·αž„ ansible vault αž“αžΉαž„αž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž“αŸαŸ‡αŸ–

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

αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž˜αž·αž“αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αž’αŸ’αž“αž€αž“αžΌαžœαž’αžαŸ’αžαž”αž‘αž–αŸαž‰αž›αŸαž‰αž“αŸƒαžŸαŸ€αžœαž—αŸ…αž›αŸαž„ αž“αž·αž„αžαž½αž“αžΆαž‘αžΈαž‘αŸ αžŸαžΌαž˜αžŸαžšαžŸαŸαžšαžœαžΆαžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„αŸ” αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚ ansible αž‚αžΊαž”αŸ‚αž”αž“αŸ„αŸ‡ - αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž˜αž·αž“αž™αž›αŸ‹αž–αžΈαž’αŸ’αžœαžΈαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž’αŸ’αžœαžΎ αž“αŸ„αŸ‡αžœαžΆαž“αžΉαž„αž˜αž·αž“αž’αŸ’αžœαžΎαžœαžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž‘αŸαŸ”

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹