เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒ: เบงเบดเบ—เบตเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบšเบปเบ”เบšเบฒเบ” ansible เปเบฅเบฐเบŠเบญเบเบซเบฒเบšเบฑเบ™เบซเบฒเบเปˆเบญเบ™เบเบฒเบ™เบœเบฐเบฅเบดเบ”

เบชเบฐเบšเบฒเบเบ”เบตเบ—เบธเบเบ„เบปเบ™!

เบ‚เป‰เบญเบเป€เบฎเบฑเบ”เบงเบฝเบเป€เบ›เบฑเบ™เบงเบดเบชเบฐเบงเบฐเบเบญเบ™ DevOps เปƒเบ™เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบˆเบญเบ‡เป‚เบฎเบ‡เปเบฎเบก. Ostrovok.ru. เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเบ›เบฐเบชเบปเบšเบเบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเปƒเบ™เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบšเบปเบ”เบšเบฒเบ” ansible.

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

เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒ: เบงเบดเบ—เบตเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบšเบปเบ”เบšเบฒเบ” ansible เปเบฅเบฐเบŠเบญเบเบซเบฒเบšเบฑเบ™เบซเบฒเบเปˆเบญเบ™เบเบฒเบ™เบœเบฐเบฅเบดเบ”

เป‚เบกเป€เบฅเบเบธเบ™

เป‚เบกเป€เบฅเบเบธเบ™ - เป‚เบ„เบ‡โ€‹เบฎเปˆเบฒเบ‡โ€‹เบเบฒเบ™โ€‹เบ—เบตเปˆโ€‹เบˆเบฐโ€‹เบŠเปˆเบงเบโ€‹เปƒเบซเป‰โ€‹เบเบฒเบ™โ€‹เบ—เบปเบ”โ€‹เบชเบญเบšโ€‹เบžเบฒโ€‹เบฅเบฐโ€‹เบšเบปเบ”โ€‹เบšเบฒเบ” ansibleโ€‹.

เบฅเบฒเบโ€‹เบฅเบฐโ€‹เบญเบฝเบ”โ€‹เบ‡เปˆเบฒเบโ€‹เบ”เบฒเบโ€‹: เป‚เบกโ€‹เป€เบฅโ€‹เบเบธเบ™โ€‹เบชเป‰เบฒเบ‡โ€‹เบ•เบปเบงโ€‹เบขเปˆเบฒเบ‡โ€‹เปƒเบ™โ€‹เป€เบงโ€‹เบ—เบตโ€‹เบ—เบตเปˆโ€‹เบ—เปˆเบฒเบ™โ€‹เบเปเบฒโ€‹เบ™เบปเบ” (cloudโ€‹, virtual machinesโ€‹, containerโ€‹; เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบฅเบฒเบโ€‹เบฅเบฐโ€‹เบญเบฝเบ”โ€‹เป€เบžเบตเปˆเบกโ€‹เป€เบ•เบตเบกโ€‹, เป€เบšเบดเปˆเบ‡โ€‹เบžเบฒเบโ€‹เบชเปˆเบงเบ™โ€‹. Driver), เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบžเบฒเบฅเบฐเบšเบปเบ”เบšเบฒเบ”เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เปƒเบ™เบกเบฑเบ™, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเปเบฅเบฐเบฅเบถเบšเบ•เบปเบงเบขเปˆเบฒเบ‡. เปƒเบ™โ€‹เบเปโ€‹เบฅเบฐโ€‹เบ™เบตโ€‹เบ‚เบญเบ‡โ€‹เบ„เบงเบฒเบกโ€‹เบฅเบปเป‰เบกโ€‹เป€เบซเบผเบงโ€‹เปƒเบ™โ€‹เบ‚เบฑเป‰เบ™โ€‹เบ•เบญเบ™โ€‹เบซเบ™เบถเปˆเบ‡โ€‹, Molecule เบˆเบฐโ€‹เปเบˆเป‰เบ‡โ€‹เปƒเบซเป‰โ€‹เบ—เปˆเบฒเบ™โ€‹เบฎเบนเป‰โ€‹เบเปˆเบฝเบงโ€‹เบเบฑเบšโ€‹เบกเบฑเบ™โ€‹.

เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบก.

เบšเบดเบ”เบ‚เบญเบ‡เบ—เบดเบ”เบชเบฐเบ”เบต

เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบชเบญเบ‡เบซเบ™เปˆเบงเบเบ‡เบฒเบ™เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบ‚เบญเบ‡เป‚เบกเป€เบฅเบเบธเบ™: เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เปเบฅเบฐเป„เบ”เป€เบงเบต.

เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™

script เบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบ‚เบญเบ‡เบชเบดเปˆเบ‡เบ—เบตเปˆ, เบšเปˆเบญเบ™เปƒเบ”, เบงเบดเบ—เบตเบเบฒเบ™เปเบฅเบฐเปƒเบ™เบฅเปเบฒเบ”เบฑเบšเปƒเบ”เบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”. เบžเบฒเบฅเบฐเบšเบปเบ”เบšเบฒเบ”เบซเบ™เบถเปˆเบ‡เบชเบฒเบกเบฒเบ”เบกเบตเบชเบฐเบ„เบดเบšเบซเบผเบฒเบ, เปเบฅเบฐเปเบ•เปˆเบฅเบฐเบ„เบปเบ™เปเบกเปˆเบ™เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเบ•เบฒเบกเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡ <role>/molecule/<scenario>, เป€เบŠเบดเปˆเบ‡เบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ—เบปเบ”เบชเบญเบš. Script เบ•เป‰เบญเบ‡เบ–เบทเบเบฅเบงเบกเป€เบ‚เบปเป‰เบฒ default, เป€เบŠเบดเปˆเบ‡เบˆเบฐเบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™เป‚เบ”เบเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ–เป‰เบฒเบ—เปˆเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบšเบปเบ”เบšเบฒเบ”เบ—เบตเปˆเบกเบตเป‚เบกเป€เบฅเบเบธเบ™. เบŠเบทเปˆเบ‚เบญเบ‡เบชเบฐเบ„เบฃเบดเบšเบ•เปเปˆเป„เบ›เบ™เบตเป‰เปเบกเปˆเบ™เบ‚เบถเป‰เบ™เบเบฑเบšเบ—เปˆเบฒเบ™.

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

(เบ‚เบฑเป‰เบ™โ€‹เบ•เบญเบ™โ€‹เบ—เบตเปˆโ€‹เบ•เบดเบ”โ€‹เบชเบฐโ€‹เบซเบผเบฒเบโ€‹ ?, เบ‚เป‰เบฒเบกเป‚เบ”เบเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ–เป‰เบฒเบšเปเปˆเป„เบ”เป‰เบฅเบฐเบšเบธเป‚เบ”เบเบœเบนเป‰เปƒเบŠเป‰)

  • lint - เปเบฅเปˆเบ™ linters. เป‚เบ”เบเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปเบกเปˆเบ™เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰ yamllint ะธ flake8,
  • destroy - เบเบฒเบ™โ€‹เบฅเบปเบšโ€‹เบ•เบปเบงโ€‹เบขเปˆเบฒเบ‡โ€‹เบˆเบฒเบโ€‹เบเบฒเบ™โ€‹เป€เบ›เบตเบ”โ€‹เบ•เบปเบงโ€‹เบชเบธเบ”โ€‹เบ—เป‰เบฒเบโ€‹เบ‚เบญเบ‡ Molecule (เบ–เป‰เบฒโ€‹เบกเบตโ€‹)โ€‹,
  • dependency? - เบเบฒเบ™โ€‹เบ•เบดเบ”โ€‹เบ•เบฑเป‰เบ‡โ€‹เบ‚เบญเบ‡โ€‹เบเบฒเบ™โ€‹เบญเบตเบ‡โ€‹เปƒเบชเปˆ ansible เบ‚เบญเบ‡โ€‹เบšเบปเบ”โ€‹เบšเบฒเบ”โ€‹เบเบฒเบ™โ€‹เบ—เบปเบ”โ€‹เบชเบญเบšโ€‹,
  • syntax - เบเบฒเบ™เบเบงเบ”เบชเบญเบš syntax เบ‚เบญเบ‡เบžเบฒเบฅเบฐเบšเบปเบ”เบšเบฒเบ”เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ ansible-playbook --syntax-check,
  • create - เบเบฒเบ™โ€‹เบชเป‰เบฒเบ‡โ€‹เบ•เบปเบงโ€‹เบขเปˆเบฒเบ‡โ€‹,
  • prepare? - เบเบฒเบ™โ€‹เบเบฐโ€‹เบเบฝเบกโ€‹เบ‚เบญเบ‡โ€‹เบ•เบปเบงโ€‹เบขเปˆเบฒเบ‡โ€‹; เบ•เบปเบงเบขเปˆเบฒเบ‡: เบเบงเบ”เป€เบšเบดเปˆเบ‡/เบ•เบดเบ”เบ•เบฑเป‰เบ‡ python2
  • converge - เบเบฒเบ™โ€‹เป€เบ›เบตเบ”โ€‹เบ•เบปเบงโ€‹เบ‚เบญเบ‡ playbook เป„เบ”เป‰โ€‹เบ–เบทเบโ€‹เบ—เบปเบ”โ€‹เบชเบญเบšโ€‹,
  • idempotence - restarting playbook เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ—เบปเบ”โ€‹เบชเบญเบš ideempotencyโ€‹,
  • side_effect? - เบเบฒเบ™โ€‹เบเบฐโ€‹เบ—เปเบฒโ€‹เบ—เบตเปˆโ€‹เบšเปเปˆโ€‹เบเปˆเบฝเบงโ€‹เบ‚เป‰เบญเบ‡โ€‹เป‚เบ”เบโ€‹เบเบปเบ‡โ€‹เบเบฑเบšโ€‹เบšเบปเบ”โ€‹เบšเบฒเบ”โ€‹, เปเบ•เปˆโ€‹เบˆเปเบฒโ€‹เป€เบ›เบฑเบ™โ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ—เบปเบ”โ€‹เบชเบญเบšโ€‹,
  • verify - เบเบฒเบ™โ€‹เบ”เปเบฒโ€‹เป€เบ™เบตเบ™โ€‹เบเบฒเบ™โ€‹เบ—เบปเบ”โ€‹เบชเบญเบšโ€‹เบเบฒเบ™โ€‹เบ•เบฑเป‰เบ‡โ€‹เบ„เปˆเบฒโ€‹เบœเบปเบ™โ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹ testinfra(เบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™) /goss/inspec,
  • cleanup? - (เปƒเบ™เบชเบฐเบšเบฑเบšเปƒเบซเบกเปˆ) - เป€เบงเบปเป‰เบฒเบ›เบฐเบกเบฒเบ™, "เบ—เปเบฒเบ„เบงเบฒเบกเบชเบฐเบญเบฒเบ”" เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบžเบทเป‰เบ™เบ–เบฒเบ™เบžเบฒเบเบ™เบญเบเบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเบœเบปเบ™เบเบฐเบ—เบปเบšเบˆเบฒเบเป‚เบกเป€เบฅเบเบธเบ™,
  • destroy - เบเบฒเบ™โ€‹เบฅเบปเบšโ€‹เบ•เบปเบงโ€‹เบขเปˆเบฒเบ‡โ€‹.

เบฅเปเบฒเบ”เบฑเบšเบ™เบตเป‰เบเบงเบกเป€เบญเบปเบฒเบเปเบฅเบฐเบ™เบตเบชเปˆเบงเบ™เปƒเบซเบเปˆ, เปเบ•เปˆเบชเบฒเบกเบฒเบ”เบ›เปˆเบฝเบ™เปเบ›เบ‡เป„เบ”เป‰เบ–เป‰เบฒเบˆเปเบฒเป€เบ›เบฑเบ™.

เปเบ•เปˆเบฅเบฐเบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เบชเบฒเบกเบฒเบ”เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบเบฑเบš molecule <command>. เปเบ•เปˆเบกเบฑเบ™เบ„เบงเบ™เบˆเบฐเป€เบ‚เบปเป‰เบฒเปƒเบˆเบงเปˆเบฒเบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐ cli-command เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเบญเบฒเบ”เบกเบตเบฅเปเบฒเบ”เบฑเบšเบ‚เบญเบ‡เบ•เบปเบ™เป€เบญเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”, เป€เบŠเบดเปˆเบ‡เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบŠเบญเบเบซเบฒเป„เบ”เป‰เป‚เบ”เบเบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™. molecule matrix <command>. เบ•เบปเบงเบขเปˆเบฒเบ‡, เป€เบกเบทเปˆเบญเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡ converge (เบเบฒเบ™โ€‹เบ”เปเบฒโ€‹เป€เบ™เบตเบ™โ€‹เบเบฒเบ™ playbook เบžเบฒเบโ€‹เปƒเบ•เป‰โ€‹เบเบฒเบ™โ€‹เบ—เบปเบ”โ€‹เบชเบญเบšโ€‹)โ€‹, เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹เบ”เบฑเปˆเบ‡โ€‹เบ•เปเปˆโ€‹เป„เบ›โ€‹เบ™เบตเป‰โ€‹เบˆเบฐโ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹:

$ molecule matrix converge
...
โ””โ”€โ”€ default         # ะฝะฐะทะฒะฐะฝะธะต ัั†ะตะฝะฐั€ะธั
    โ”œโ”€โ”€ dependency  # ัƒัั‚ะฐะฝะพะฒะบะฐ ะทะฐะฒะธัะธะผะพัั‚ะตะน
    โ”œโ”€โ”€ create      # ัะพะทะดะฐะฝะธะต ะธะฝัั‚ะฐะฝัะฐ
    โ”œโ”€โ”€ prepare     # ะฟั€ะตะดะฝะฐัั‚ั€ะพะนะบะฐ ะธะฝัั‚ะฐะฝัะฐ
    โ””โ”€โ”€ converge    # ะฟั€ะพะณะพะฝ ะฟะปะตะนะฑัƒะบะฐ

เบฅเปเบฒเบ”เบฑเบšเบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบชเบฒเบกเบฒเบ”เปเบเป‰เป„เบ‚เป„เบ”เป‰. เบ–เป‰เบฒเบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบˆเบฒเบเบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ–เบทเบเป€เบฎเบฑเบ”เปเบฅเป‰เบง, เบกเบฑเบ™เบˆเบฐเบ–เบทเบเบ‚เป‰เบฒเบก. เบชเบฐเบ–เบฒเบ™เบฐเบ›เบฑเบ”เบˆเบธเบšเบฑเบ™, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ‚เบญเบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡, เป‚เบกเป€เบฅเบเบธเบ™เป€เบเบฑเบšเบขเบนเปˆเปƒเบ™เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบต $TMPDIR/molecule/<role>/<scenario>.

เป€เบžเบตเปˆเบกเบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ”เป‰เบงเบ ? เบ—เปˆเบฒเบ™โ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบญเบฐโ€‹เบ—เบดโ€‹เบšเบฒเบโ€‹เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹เบ—เบตเปˆโ€‹เบ•เป‰เบญเบ‡โ€‹เบเบฒเบ™โ€‹เปƒเบ™โ€‹เบฎเบนเบšโ€‹เปเบšเบš ansible-playbookโ€‹, เปเบฅเบฐโ€‹เป€เบฎเบฑเบ”โ€‹เปƒเบซเป‰โ€‹เบŠเบทเปˆโ€‹เป„เบŸเบฅโ€‹เปŒโ€‹เบ•เบฒเบกโ€‹เบ‚เบฑเป‰เบ™โ€‹เบ•เบญเบ™โ€‹: prepare.yml/side_effect.yml. เบ„เบฒเบ”เบซเบงเบฑเบ‡เบงเปˆเบฒเป„เบŸเบฅเปŒเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เป‚เบกเป€เบฅเบเบธเบ™เบˆเบฐเบขเบนเปˆเปƒเบ™เป‚เบŸเป€เบ”เบตเบชเบฐเบ„เบดเบš.

Driver

เป„เบ”เป€เบงเบตเปเบกเปˆเบ™เปœเปˆเบงเบเบ‡เบฒเบ™เบ—เบตเปˆเบชเป‰เบฒเบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡เบเบฒเบ™เบ—เบปเบ”เบชเบญเบš.
เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เป„เบ”เป€เบงเบตเบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™เบ—เบตเปˆ Molecule เบกเบตเปเบกเปˆเปเบšเบšเบ—เบตเปˆเบเบฝเบกเบžเป‰เบญเบกเปเบกเปˆเบ™เบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰: Azure, Docker, EC2, GCE, LXC, LXD, OpenStack, Vagrant, Delegated.

เปƒเบ™เบเปเบฅเบฐเบ™เบตเบซเบผเบฒเบเบ—เบตเปˆเบชเบธเบ”, เปเบกเปˆเปเบšเบšเปเบกเปˆเบ™เป„เบŸเบฅเปŒ create.yml ะธ destroy.yml เปƒเบ™เป‚เบŸเป€เบ”เบตเบชเบฐเบ„เบฃเบดเบšเบ—เบตเปˆเบญเบฐเบ—เบดเบšเบฒเบเบเบฒเบ™เบชเป‰เบฒเบ‡เปเบฅเบฐเบเบฒเบ™เบฅเบถเบšเบ•เบปเบงเบขเปˆเบฒเบ‡, เบ•เบฒเบกเบฅเปเบฒเบ”เบฑเบš.
เบ‚เปเป‰เบเบปเบเป€เบงเบฑเป‰เบ™เปเบกเปˆเบ™ Docker เปเบฅเบฐ Vagrant, เบเป‰เบญเบ™เบงเปˆเบฒเบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบเบฑเบšเป‚เบกเบ”เบนเบ™เบ‚เบญเบ‡เบžเบงเบเบกเบฑเบ™เบชเบฒเบกเบฒเบ”เป€เบเบตเบ”เบ‚เบทเป‰เบ™เป„เบ”เป‰เป‚เบ”เบเบšเปเปˆเบกเบตเป„เบŸเบฅเปŒเบ—เบตเปˆเป„เบ”เป‰เบเปˆเบฒเบงเบกเบฒเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡.

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

เป„เบ”เป€เบงเบตเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปเบกเปˆเบ™ Docker.

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

เบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™

เปƒเบ™เบ–เบฒเบ™เบฐเป€เบ›เบฑเบ™ "เบชเบฐเบšเบฒเบเบ”เบตเป‚เบฅเบ", เปƒเบซเป‰เบ—เบปเบ”เบชเบญเบšเบšเบปเบ”เบšเบฒเบ”เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡ nginx เบ‡เปˆเบฒเบเป†. เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบฅเบทเบญเบ docker เป€เบ›เบฑเบ™เป„เบ”เป€เบงเบต - เบ‚เป‰เบญเบเบ„เบดเบ”เบงเปˆเบฒเป€เบˆเบปเป‰เบฒเบชเปˆเบงเบ™เปƒเบซเบเปˆเป„เบ”เป‰เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบกเบฑเบ™ (เปเบฅเบฐเบˆเบทเปˆเป„เบงเป‰เบงเปˆเบฒ docker เป€เบ›เบฑเบ™เป„เบ”เป€เบงเบตเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™).

เบเบฝเบกเบ•เบปเบง virtualenv เปเบฅเบฐเบ•เบดเบ”เบ•เบฑเป‰เบ‡เบขเบนเปˆเปƒเบ™เบกเบฑเบ™ molecule:

> pip install virtualenv
> virtualenv -p `which python2` venv
> source venv/bin/activate
> pip install molecule docker  # molecule ัƒัั‚ะฐะฝะพะฒะธั‚ ansible ะบะฐะบ ะทะฐะฒะธัะธะผะพัั‚ัŒ; docker ะดะปั ะดั€ะฐะนะฒะตั€ะฐ

เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ•เปเปˆเป„เบ›เปเบกเปˆเบ™เป€เบžเบทเปˆเบญเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบšเบปเบ”เบšเบฒเบ”เปƒเบซเบกเปˆ.
เบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ‚เบญเบ‡เบšเบปเบ”เบšเบฒเบ”เปƒเบซเบกเปˆ, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบชเบฐเบ„เบดเบšเปƒเบซเบกเปˆ, เปเบกเปˆเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เป‚เบ”เบเปƒเบŠเป‰เบ„เปเบฒเบชเบฑเปˆเบ‡ molecule init <params>:

> molecule init role -r nginx
--> Initializing new role nginx...
Initialized role in <path>/nginx successfully.
> cd nginx
> tree -L 1
.
โ”œโ”€โ”€ README.md
โ”œโ”€โ”€ defaults
โ”œโ”€โ”€ handlers
โ”œโ”€โ”€ meta
โ”œโ”€โ”€ molecule
โ”œโ”€โ”€ tasks
โ””โ”€โ”€ vars

6 directories, 1 file

เบกเบฑเบ™เป„เบ”เป‰เบเบฒเบเบกเบฒเป€เบ›เบฑเบ™เบšเบปเบ”เบšเบฒเบ”เบ›เบปเบเบเบฐเบ•เบด. เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบ—เบฑเบ‡เบซเบกเบปเบ”เบเบฑเบš CLI Molecules เปเบกเปˆเบ™เบกเบฒเบˆเบฒเบเบฎเบฒเบเบ‚เบญเบ‡เบšเบปเบ”เบšเบฒเบ”.

เบกเบฒเป€เบšเบดเปˆเบ‡เบชเบดเปˆเบ‡เบ—เบตเปˆเบขเบนเปˆเปƒเบ™เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเบžเบฒเบฅเบฐเบšเบปเบ”เบšเบฒเบ”:

> tree molecule/default/
molecule/default/
โ”œโ”€โ”€ Dockerfile.j2  # Jinja-ัˆะฐะฑะปะพะฝ ะดะปั Dockerfile
โ”œโ”€โ”€ INSTALL.rst.   # ะะตะผะฝะพะณะพ ะธะฝั„ะพั€ะผะฐั†ะธะธ ะพะฑ ัƒัั‚ะฐะฝะพะฒะบะต ะทะฐะฒะธัะธะผะพัั‚ะตะน ัั†ะตะฝะฐั€ะธั
โ”œโ”€โ”€ molecule.yml   # ะคะฐะนะป ะบะพะฝั„ะธะณัƒั€ะฐั†ะธะธ
โ”œโ”€โ”€ playbook.yml   # ะŸะปะตะนะฑัƒะบ ะทะฐะฟัƒัะบะฐ ั€ะพะปะธ
โ””โ”€โ”€ tests          # ะ”ะธั€ะตะบั‚ะพั€ะธั ั ั‚ะตัั‚ะฐะผะธ ัั‚ะฐะดะธะธ verify
    โ””โ”€โ”€ test_default.py

1 directory, 6 files

เปƒเบซเป‰เบงเบดเป€เบ„เบฒเบฐ config molecule/default/molecule.yml (เปเบ—เบ™เบ—เบตเปˆเบžเบฝเบ‡เปเบ•เปˆเบฎเบนเบšเบžเบฒเบš docker):

---
dependency:
  name: galaxy
driver:
  name: docker
lint:
  name: yamllint
platforms:
  - name: instance
    image: centos:7
provisioner:
  name: ansible
  lint:
    name: ansible-lint
scenario:
  name: default
verifier:
  name: testinfra
  lint:
    name: flake8

เบเบฒเบ™เป€เบžเบดเปˆเบ‡เบžเบฒเบญเบฒเป„เบช

เบžเบฒเบเบ™เบตเป‰เบญเบฐเบ—เบดเบšเบฒเบเปเบซเบผเปˆเบ‡เบ—เบตเปˆเบกเบฒเบ‚เบญเบ‡เบเบฒเบ™เป€เบžเบดเปˆเบ‡เบžเบฒเบญเบฒเป„เบช.

เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰: galaxy, เบ›เบนเบ™, เปเบเบฐ.

Shell เปเบกเปˆเบ™เบžเบฝเบ‡เปเบ•เปˆเปเบเบฐเบ„เปเบฒเบชเบฑเปˆเบ‡เบ—เบตเปˆเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ—เบตเปˆ galaxy เปเบฅเบฐ gilt เบšเปเปˆเป„เบ”เป‰เบเบงเบกเป€เบญเบปเบฒเบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒ.

เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบˆเบฐโ€‹เบšเปเปˆโ€‹เป„เบ”เป‰โ€‹เบญเบฒโ€‹เปƒเบชโ€‹เบขเบนเปˆโ€‹เบ—เบตเปˆโ€‹เบ™เบตเป‰โ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เปƒเบŠเป‰โ€‹เป€เบงโ€‹เบฅเบฒโ€‹เบ”เบปเบ™โ€‹เบ™เบฒเบ™, เบกเบฑเบ™โ€‹เปเบกเปˆเบ™โ€‹เบžเบฝเบ‡โ€‹เบžเปโ€‹เบ—เบตเปˆโ€‹เบญเบฐโ€‹เบ—เบดโ€‹เบšเบฒเบโ€‹เปƒเบ™ เป€เบญเบเบฐเบชเบฒเบ™.

เบ„เบปเบ™เบ‚เบฑเบš

เบŠเบทเปˆเบ„เบปเบ™เบ‚เบฑเบšเบฅเบปเบ”. เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเปเบกเปˆเบ™ docker.

เบเบฑเบ

linter เปเบกเปˆเบ™ yamllint.

เบ•เบปเบงเป€เบฅเบทเบญเบเบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เปƒเบ™เบชเปˆเบงเบ™เบ‚เบญเบ‡เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ™เบตเป‰เปเบกเปˆเบ™เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เปƒเบ™เบเบฒเบ™เบเปเบฒเบ™เบปเบ”เป„เบŸเบฅเปŒเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบชเปเบฒเบฅเบฑเบš yamllint, เบ•เบปเบงเปเบ›เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบชเบปเปˆเบ‡เบ•เปเปˆ, เบซเบผเบทเบ›เบดเบ”เบเบฒเบ™เปƒเบŠเป‰เบ‡เบฒเบ™ linter:

lint:
  name: yamllint
  options:
    config-file: foo/bar
  env:
    FOO: bar
  enabled: False

เปเบžเบฅเบฐเบ•เบฐเบŸเบญเบก

เบญเบฐเบ—เบดเบšเบฒเบเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ‚เบญเบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡.
เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡ docker เป€เบ›เบฑเบ™เบœเบนเป‰เบ‚เบฑเบšเบ‚เบตเปˆ, Molecule เปเบกเปˆเบ™ iterated เปƒเบ™เป„เบฅเบเบฐเบ™เบตเป‰, เปเบฅเบฐเปเบ•เปˆเบฅเบฐเบญเบปเบ‡เบ›เบฐเบเบญเบšเบ‚เบญเบ‡เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเปเบกเปˆเบ™เบกเบตเบขเบนเปˆเปƒเบ™. Dockerfile.j2 เป€เบ›เบฑเบ™เบ•เบปเบงเปเบ› item.

เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบ„เบปเบ™เบ‚เบฑเบšเบฅเบปเบ”เบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™ create.yml ะธ destroy.yml, เบžเบฒเบเบชเปˆเบงเบ™เปเบกเปˆเบ™เบกเบตเบขเบนเปˆเปƒเบ™เปƒเบซเป‰เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเป€เบ›เบฑเบ™ molecule_yml.platforms, เปเบฅเบฐเบเบฒเบ™เบŠเปเป‰เบฒเบ„เบทเบ™เบกเบฑเบ™เป„เบ”เป‰เบ–เบทเบเบญเบฐเบ—เบดเบšเบฒเบเปเบฅเป‰เบงเปƒเบ™เป„เบŸเบฅเปŒเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰.

เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบ Molecule เบชเบฐเบซเบ™เบญเบ‡เบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเบ‚เบญเบ‡ instances เบเบฑเบšเป‚เบกเบ”เบนเบ™ ansible, เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ—เบตเปˆเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ„เบงเบ™เบˆเบฐเบ–เบทเบเบŠเบญเบเบซเบฒเบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™. เบชเปเบฒเบฅเบฑเบš docker, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบปเบเบ•เบปเบงเบขเปˆเบฒเบ‡, เป‚เบกเบ”เบนเบ™เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰ docker_container_module. เป‚เบกเบ”เบนเบ™เปƒเบ”เบ—เบตเปˆเปƒเบŠเป‰เปƒเบ™เป„เบ”เป€เบงเบตเบญเบทเปˆเบ™เบชเบฒเบกเบฒเบ”เบžเบปเบšเป„เบ”เป‰เปƒเบ™ เป€เบญเบเบฐเบชเบฒเบ™.

เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เป„เบ”เป€เบงเบตเบ•เปˆเบฒเบ‡เป†เบชเบฒเบกเบฒเบ”เบžเบปเบšเป„เบ”เป‰ เปƒเบ™เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบ‚เบญเบ‡เป‚เบกเป€เบฅเบเบธเบ™เบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡.

เปเบ—เบ™เบ—เบตเปˆเบ™เบตเป‰ เบชเบนเบ™:7 เบชเบธเบ” ubuntu.

เบœเบนเป‰เบชเบฐเปœเบญเบ‡

"เบœเบนเป‰เบชเบฐเบซเบ™เบญเบ‡" - เบซเบ™เปˆเบงเบเบ‡เบฒเบ™เบ—เบตเปˆเบ„เบธเป‰เบกเบ„เบญเบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡ Molecule, เบ™เบตเป‰เปเบกเปˆเบ™ ansible, เบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบชเปเบฒเบฅเบฑเบšเบ„เบปเบ™เบญเบทเปˆเบ™เบšเปเปˆเป„เบ”เป‰เบงเบฒเบ‡เปเบœเบ™เป„เบงเป‰, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบžเบฒเบเบ™เบตเป‰เบชเบฒเบกเบฒเบ”เป€เบญเบตเป‰เบ™เบงเปˆเบฒ ansible extension configuration เบเบฑเบš caveat.
เปƒเบ™เบ—เบตเปˆเบ™เบตเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบเปเบฒเบ™เบปเบ”เบซเบผเบฒเบเบขเปˆเบฒเบ‡, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเป€เบ™เบฑเป‰เบ™เปƒเบชเปˆเบˆเบธเบ”เบ•เบปเป‰เบ™เบ•เป, เปƒเบ™เบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™เบ‚เบญเบ‡เบ‚เป‰เบญเบ:

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

provisioner:
  name: ansible
  playbooks:
    create: create.yml
    destroy: ../default/destroy.yml
    converge: playbook.yml
    side_effect: side_effect.yml
    cleanup: cleanup.yml

provisioner:
  name: ansible
  config_options:
    defaults:
      fact_caching: jsonfile
    ssh_connection:
      scp_if_ssh: True

provisioner:
  name: ansible  
  connection_options:
    ansible_ssh_common_args: "-o 'UserKnownHostsFile=/dev/null' -o 'ForwardAgent=yes'"

  • เบ—เบฒเบ‡เป€เบฅเบทเบญเบเปƒเบ™เบเบฒเบ™: เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเบšเปเปˆเป€เปเบฒเบฐเบชเบปเบก เปเบฅเบฐเบ•เบปเบงเปเบ›เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบก

provisioner:
  name: ansible  
  options:
    vvv: true
    diff: true
  env:
    FOO: BAR

เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™

เบŠเบทเปˆเปเบฅเบฐเบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบ‚เบญเบ‡เบฅเปเบฒเบ”เบฑเบš script.
เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ›เปˆเบฝเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ‚เบญเบ‡เบ„เปเบฒเบชเบฑเปˆเบ‡เปƒเบ”เป†เป‚เบ”เบเบเบฒเบ™เป€เบžเบตเปˆเบกเบฅเบฐเบซเบฑเบ” <command>_sequence เปเบฅเบฐเป€เบ›เบฑเบ™เบกเบนเบ™เบ„เปˆเบฒเบชเปเบฒเบฅเบฑเบšเบกเบฑเบ™เป‚เบ”เบเบเบฒเบ™เบเปเบฒเบ™เบปเบ”เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™.
เปƒเบซเป‰เป€เบงเบปเป‰เบฒเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบ›เปˆเบฝเบ™เบฅเปเบฒเบ”เบฑเบšเบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡เปเบฅเปˆเบ™ playbook: molecule converge

# ะธะทะฝะฐั‡ะฐะปัŒะฝะพ:
# - dependency
# - create
# - prepare
# - converge
scenario:
  name: default
  converge_sequence:
    - create
    - converge

เบ•เบปเบงเบขเบฑเป‰เบ‡เบขเบทเบ™

เบเบฒเบ™เบชเป‰เบฒเบ‡เบ•เบฑเป‰เบ‡เบเบญเบšเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเปเบฅเบฐ linter เบเบฑเบšเบกเบฑเบ™. linter เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปเบกเปˆเบ™ testinfra ะธ flake8. เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เปเบกเปˆเบ™เบ„เบทเบเบฑเบ™เบเบฑเบšเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡:

verifier:
  name: testinfra
  additional_files_or_dirs:
    - ../path/to/test_1.py
    - ../path/to/test_2.py
    - ../path/to/directory/*
  options:
    n: 1
  enabled: False
  env:
    FOO: bar
  lint:
    name: flake8
    options:
      benchmark: True
    enabled: False
    env:
      FOO: bar

เปƒเบซเป‰เบเบฑเบšเบ„เบทเบ™เบชเบนเปˆเบšเบปเบ”เบšเบฒเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ. เบกเบฒเปเบเป‰เป„เบ‚เป„เบŸเบฅเปŒ tasks/main.yml เบ›เบฐเป€เบžเบ”เบ™เบตเป‰:

---
- name: Install nginx
  apt:
    name: nginx
    state: present

- name: Start nginx
  service:
    name: nginx
    state: started

เปเบฅเบฐเป€เบžเบตเปˆเบกเบเบฒเบ™เบ—เบปเบ”เบชเบญเบš molecule/default/tests/test_default.py

def test_nginx_is_installed(host):
    nginx = host.package("nginx")
    assert nginx.is_installed

def test_nginx_running_and_enabled(host):
    nginx = host.service("nginx")
    assert nginx.is_running
    assert nginx.is_enabled

def test_nginx_config(host):
    host.run("nginx -t")

เป€เบฎเบฑเบ”เปเบฅเป‰เบง, เบกเบฑเบ™เบเบฑเบ‡เบ„เบปเบ‡เบžเบฝเบ‡เปเบ•เปˆเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™ (เบˆเบฒเบเบฎเบฒเบเบ‚เบญเบ‡เบšเบปเบ”เบšเบฒเบ”, เปƒเบซเป‰เบ‚เป‰เบญเบเป€เบ•เบทเบญเบ™เป€เบˆเบปเป‰เบฒ):

> molecule test

เบ—เปเปˆเบฅเบฐเบšเบฒเบเบญเบฒเบเบฒเบ”เบเบฒเบงเบžเบฒเบเปƒเบ•เป‰ spoiler:

--> Validating schema <path>/nginx/molecule/default/molecule.yml.
Validation completed successfully.
--> Test matrix

โ””โ”€โ”€ default
    โ”œโ”€โ”€ lint
    โ”œโ”€โ”€ destroy
    โ”œโ”€โ”€ dependency
    โ”œโ”€โ”€ syntax
    โ”œโ”€โ”€ create
    โ”œโ”€โ”€ prepare
    โ”œโ”€โ”€ converge
    โ”œโ”€โ”€ idempotence
    โ”œโ”€โ”€ side_effect
    โ”œโ”€โ”€ verify
    โ””โ”€โ”€ destroy

--> Scenario: 'default'
--> Action: 'lint'
--> Executing Yamllint on files found in <path>/nginx/...
Lint completed successfully.
--> Executing Flake8 on files found in <path>/nginx/molecule/default/tests/...
Lint completed successfully.
--> Executing Ansible Lint on <path>/nginx/molecule/default/playbook.yml...
Lint completed successfully.
--> Scenario: 'default'
--> Action: 'destroy'

    PLAY [Destroy] *****************************************************************

    TASK [Destroy molecule instance(s)] ********************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Wait for instance(s) deletion to complete] *******************************
    ok: [localhost] => (item=None)
    ok: [localhost]

    TASK [Delete docker network(s)] ************************************************

    PLAY RECAP *********************************************************************
    localhost                  : ok=2    changed=1    unreachable=0    failed=0

--> Scenario: 'default'
--> Action: 'dependency'
Skipping, missing the requirements file.
--> Scenario: 'default'
--> Action: 'syntax'

    playbook: <path>/nginx/molecule/default/playbook.yml

--> Scenario: 'default'
--> Action: 'create'

    PLAY [Create] ******************************************************************

    TASK [Log into a Docker registry] **********************************************
    skipping: [localhost] => (item=None)

    TASK [Create Dockerfiles from image names] *************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Discover local Docker images] ********************************************
    ok: [localhost] => (item=None)
    ok: [localhost]

    TASK [Build an Ansible compatible image] ***************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Create docker network(s)] ************************************************

    TASK [Create molecule instance(s)] *********************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Wait for instance(s) creation to complete] *******************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    PLAY RECAP *********************************************************************
    localhost                  : ok=5    changed=4    unreachable=0    failed=0

--> Scenario: 'default'
--> Action: 'prepare'
Skipping, prepare playbook not configured.
--> Scenario: 'default'
--> Action: 'converge'

    PLAY [Converge] ****************************************************************

    TASK [Gathering Facts] *********************************************************
    ok: [instance]

    TASK [nginx : Install nginx] ***************************************************
    changed: [instance]

    TASK [nginx : Start nginx] *****************************************************
    changed: [instance]

    PLAY RECAP *********************************************************************
    instance                   : ok=3    changed=2    unreachable=0    failed=0

--> Scenario: 'default'
--> Action: 'idempotence'
Idempotence completed successfully.
--> Scenario: 'default'
--> Action: 'side_effect'
Skipping, side effect playbook not configured.
--> Scenario: 'default'
--> Action: 'verify'
--> Executing Testinfra tests found in <path>/nginx/molecule/default/tests/...
    ============================= test session starts ==============================
    platform darwin -- Python 2.7.15, pytest-4.3.0, py-1.8.0, pluggy-0.9.0
    rootdir: <path>/nginx/molecule/default, inifile:
    plugins: testinfra-1.16.0
collected 4 items

    tests/test_default.py ....                                               [100%]

    ========================== 4 passed in 27.23 seconds ===========================
Verifier completed successfully.
--> Scenario: 'default'
--> Action: 'destroy'

    PLAY [Destroy] *****************************************************************

    TASK [Destroy molecule instance(s)] ********************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Wait for instance(s) deletion to complete] *******************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Delete docker network(s)] ************************************************

    PLAY RECAP *********************************************************************
    localhost                  : ok=2    changed=2    unreachable=0    failed=0

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

เบ„เปเบฒเบชเบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰เป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ”เบตเบšเบฑเบ:

> molecule --debug <command> # debug info. ะŸั€ะธ ะพะฑั‹ั‡ะฝะพะผ ะทะฐะฟัƒัะบะต ะœะพะปะตะบัƒะปะฐ ัะบั€ั‹ะฒะฐะตั‚ ะปะพะณะธ.
> molecule converge          # ะžัั‚ะฐะฒะปัะตั‚ ะธะฝัั‚ะฐะฝั ะฟะพัะปะต ะฟั€ะพะณะพะฝะฐ ั‚ะตัั‚ะธั€ัƒะตะผะพะน ั€ะพะปะธ.
> molecule login             # ะ—ะฐะนั‚ะธ ะฒ ัะพะทะดะฐะฝะฝั‹ะน ะธะฝัั‚ะฐะฝั.
> molecule --help            # ะŸะพะปะฝั‹ะน ัะฟะธัะพะบ ะบะพะผะฐะฝะด.

เบšเบปเบ”เบšเบฒเบ”เบ—เบตเปˆเบกเบตเบขเบนเปˆเปเบฅเป‰เบง

เบเบฒเบ™เป€เบžเบตเปˆเบกเบชเบฐเบ„เบดเบšเปƒเบซเบกเปˆเปƒเบซเป‰เบเบฑเบšเบšเบปเบ”เบšเบฒเบ”เบ—เบตเปˆเบกเบตเบขเบนเปˆเปเบฅเป‰เบง เบˆเบฒเบโ€‹เบฅเบฐโ€‹เบšเบปเบšโ€‹เบšเบปเบ”โ€‹เบšเบฒเบ”โ€‹ เบ”เป‰เบงเบเบ„เปเบฒเบชเบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

# ะฟะพะปะฝั‹ะน ัะฟะธัะพะบ ะดะพัั‚ัƒะฟะฝั‹ั… ะฟะฐั€ะฐะผะตั‚ั€ะพะฒ
> molecule init scenarion --help
# ัะพะทะดะฐะฝะธะต ะฝะพะฒะพะณะพ ัั†ะตะฝะฐั€ะธั
> molecule init scenario -r <role_name> -s <scenario_name>

เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ—เบตเปˆเบ™เบตเป‰เปเบกเปˆเบ™เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ—เปเบฒเบญเบดเบ”เปƒเบ™เบžเบฒเบฅเบฐเบšเบปเบ”เบšเบฒเบ”, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบต -s เบชเบฒเบกเบฒเบ”เบ–เบทเบเบฅเบฐเป€เบงเบฑเป‰เบ™เบเป‰เบญเบ™เบงเปˆเบฒเบกเบฑเบ™เบˆเบฐเบชเป‰เบฒเบ‡เบชเบฐเบ„เบฃเบดเบš default.

เบชเบฐเบซเบฅเบธเบš

เบ”เบฑเปˆเบ‡เบ—เบตเปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบซเบฑเบ™เป„เบ”เป‰, Molecule เบšเปเปˆเบชเบฑเบšเบชเบปเบ™เบซเบผเบฒเบ, เปเบฅเบฐเป‚เบ”เบเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เปเบกเปˆเปเบšเบšเบ‚เบญเบ‡เบ—เปˆเบฒเบ™เป€เบญเบ‡, เบเบฒเบ™เปƒเบŠเป‰ script เปƒเบซเบกเปˆเบชเบฒเบกเบฒเบ”เบ–เบทเบเบซเบผเบธเบ”เบฅเบปเบ‡เป€เบžเบทเปˆเบญเปเบเป‰เป„เบ‚เบ•เบปเบงเปเบ›เปƒเบ™เบเบฒเบ™เบชเป‰เบฒเบ‡ instance เปเบฅเบฐเบเบฒเบ™เบฅเบถเบš playbooks. เป‚เบกเป€เบฅเบเบธเบ™เบ›เบฐเบชเบปเบกเบ›เบฐเบชเบฒเบ™ seamlessly เบเบฑเบšเบฅเบฐเบšเบปเบš CI, เป€เบŠเบดเปˆเบ‡เบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเป„เบงเบ‚เบญเบ‡เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเป‚เบ”เบเบเบฒเบ™เบซเบผเบธเบ”เบœเปˆเบญเบ™เป€เบงเบฅเบฒเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบ„เบนเปˆเบกเบทเบ‚เบญเบ‡ playbooks.

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

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

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