เจจเจฟเจฐเจฆเฉ‡เจธเจผ: เจœเจตเจพเจฌเจฆเฉ‡เจน เจญเฉ‚เจฎเจฟเจ•เจพเจตเจพเจ‚ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฟเจตเฉ‡เจ‚ เจ•เจฐเฉ€เจ เจ…เจคเฉ‡ เจ‰เจคเจชเจพเจฆเจจ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจธเจฎเฉฑเจธเจฟเจ†เจตเจพเจ‚ เจฌเจพเจฐเฉ‡ เจชเจคเจพ เจฒเจ—เจพเจ“

เจนเฉˆเจฒเฉ‹ เจนเจฐ เจ•เฉ‹เจˆ!

เจฎเฉˆเจ‚ เจ‡เฉฑเจ• เจนเฉ‹เจŸเจฒ เจฌเฉเจ•เจฟเฉฐเจ— เจธเฉ‡เจตเจพ เจฒเจˆ เจ‡เฉฑเจ• DevOps เจ‡เฉฐเจœเฉ€เจจเฉ€เจ…เจฐ เจตเจœเฉ‹เจ‚ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเจพเจ‚เฅค Ostrovok.ru. เจ‡เจธ เจฒเฉ‡เจ– เจตเจฟเฉฑเจš เจฎเฉˆเจ‚ เจœเจตเจพเจฌเจฆเฉ‡เจน เจญเฉ‚เจฎเจฟเจ•เจพเจตเจพเจ‚ เจฆเฉ€ เจœเจพเจ‚เจš เจตเจฟเฉฑเจš เจธเจพเจกเฉ‡ เจ…เจจเฉเจญเจต เจฌเจพเจฐเฉ‡ เจ—เฉฑเจฒ เจ•เจฐเจจเจพ เจšเจพเจนเฉเฉฐเจฆเจพ เจนเจพเจ‚เฅค

Ostrovok.ru 'เจคเฉ‡ เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจธเฉฐเจฐเจšเจจเจพ เจชเฉเจฐเจฌเฉฐเจงเจ• เจตเจœเฉ‹เจ‚ เจœเจตเจพเจฌเจฆเฉ‡เจน เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚เฅค เจนเจพเจฒ เจนเฉ€ เจตเจฟเฉฑเจš เจ…เจธเฉ€เจ‚ เจญเฉ‚เจฎเจฟเจ•เจพเจตเจพเจ‚ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจจ เจฆเฉ€ เจœเจผเจฐเฉ‚เจฐเจค 'เจคเฉ‡ เจ†เจ เจนเจพเจ‚, เจชเจฐ, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจ‡เจน เจธเจพเจนเจฎเจฃเฉ‡ เจ†เจ‡เจ† เจนเฉˆ, เจ‡เจธเจฆเฉ‡ เจฒเจˆ เจฌเจนเฉเจค เจธเจพเจฐเฉ‡ เจธเจพเจงเจจ เจจเจนเฉ€เจ‚ เจนเจจ - เจธเจญ เจคเฉ‹เจ‚ เจชเฉเจฐเจธเจฟเฉฑเจง, เจธเจผเจพเจ‡เจฆ, เจ…เจฃเฉ‚ เจซเจฐเฉ‡เจฎเจตเจฐเจ• เจนเฉˆ, เจ‡เจธ เจฒเจˆ เจ…เจธเฉ€เจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจตเจฐเจคเจฃ เจฆเจพ เจซเฉˆเจธเจฒเจพ เจ•เฉ€เจคเจพ เจนเฉˆ. เจชเจฐ เจ‡เจน เจชเจคเจพ เจšเจฒเจฟเจ† เจ•เจฟ เจ‰เจธ เจฆเฉ‡ เจฆเจธเจคเจพเจตเฉ‡เจœเจผ เจฌเจนเฉเจค เจธเจพเจฐเฉ‡ เจจเฉเจ•เจธเจพเจจเจพเจ‚ เจฌเจพเจฐเฉ‡ เจšเฉเฉฑเจช เจนเจจ. เจธเจพเจจเฉ‚เฉฐ เจฐเฉ‚เจธเฉ€ เจตเจฟเฉฑเจš เจ•เจพเจซเจผเฉ€ เจตเจฟเจธเจคเฉเจฐเจฟเจค เจ—เจพเจˆเจก เจจเจนเฉ€เจ‚ เจฎเจฟเจฒ เจธเจ•เฉ€, เจ‡เจธ เจฒเจˆ เจ…เจธเฉ€เจ‚ เจ‡เจน เจฒเฉ‡เจ– เจฒเจฟเจ–เจฃ เจฆเจพ เจซเฉˆเจธเจฒเจพ เจ•เฉ€เจคเจพ เจนเฉˆเฅค

เจจเจฟเจฐเจฆเฉ‡เจธเจผ: เจœเจตเจพเจฌเจฆเฉ‡เจน เจญเฉ‚เจฎเจฟเจ•เจพเจตเจพเจ‚ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฟเจตเฉ‡เจ‚ เจ•เจฐเฉ€เจ เจ…เจคเฉ‡ เจ‰เจคเจชเจพเจฆเจจ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจธเจฎเฉฑเจธเจฟเจ†เจตเจพเจ‚ เจฌเจพเจฐเฉ‡ เจชเจคเจพ เจฒเจ—เจพเจ“

เจ…เจฃเฉ‚

เจ…เจฃเฉ‚ - เจœเจตเจพเจฌเจฆเฉ‡เจน เจญเฉ‚เจฎเจฟเจ•เจพเจตเจพเจ‚ เจฆเฉ€ เจœเจพเจ‚เจš เจตเจฟเฉฑเจš เจฎเจฆเจฆ เจ•เจฐเจจ เจฒเจˆ เจ‡เฉฑเจ• เจขเจพเจ‚เจšเจพเฅค

เจธเจฐเจฒเฉ€เจ•เฉเจฐเจฟเจค เจตเจฐเจฃเจจ: เจ…เจฃเฉ‚ เจคเฉเจนเจพเจกเฉ‡ เจฆเฉเจ†เจฐเจพ เจจเจฟเจฐเจงเจพเจฐเจค เจชเจฒเฉ‡เจŸเจซเจพเจฐเจฎ 'เจคเฉ‡ เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจฃ เจฌเจฃเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ (เจ•เจฒเจพเจŠเจก, เจตเจฐเจšเฉเจ…เจฒ เจฎเจธเจผเฉ€เจจ, เจ•เฉฐเจŸเฉ‡เจจเจฐ; เจนเฉ‹เจฐ เจตเฉ‡เจฐเจตเจฟเจ†เจ‚ เจฒเจˆ, เจญเจพเจ— เจตเฉ‡เจ–เฉ‹ เจกเจฐเจพเจˆเจตเจฐ), เจ‡เจธ 'เจคเฉ‡ เจคเฉเจนเจพเจกเฉ€ เจญเฉ‚เจฎเจฟเจ•เจพ เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ, เจซเจฟเจฐ เจŸเฉˆเจธเจŸ เจšเจฒเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ‰เจฆเจพเจนเจฐเจฃ เจจเฉ‚เฉฐ เจฎเจฟเจŸเจพ เจฆเจฟเฉฐเจฆเจพ เจนเฉˆเฅค เจœเฉ‡เจ•เจฐ เจ•เจฟเจธเฉ‡ เจ‡เฉฑเจ• เจชเฉœเจพเจ… 'เจคเฉ‡ เจ…เจธเจซเจฒเจคเจพ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆ, เจคเจพเจ‚ เจ…เจฃเฉ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เจธ เจฌเจพเจฐเฉ‡ เจธเฉ‚เจšเจฟเจค เจ•เจฐเฉ‡เจ—เจพเฅค

เจนเฉเจฃ เจนเฉ‹เจฐ.

เจฅเจฟเจŠเจฐเฉ€ เจฆเจพ เจ•เฉเจ เจนเจฟเฉฑเจธเจพ

เจ†เจ‰ เจ…เจธเฉ€เจ‚ เจ…เจฃเฉ‚ เจฆเฉ€เจ†เจ‚ เจฆเฉ‹ เจฎเฉเฉฑเจ– เจ‡เจ•เจพเจˆเจ†เจ‚ 'เจคเฉ‡ เจตเจฟเจšเจพเจฐ เจ•เจฐเฉ€เจ: เจฆเฉเจฐเจฟเจธเจผ เจ…เจคเฉ‡ เจกเฉเจฐเจพเจˆเจตเจฐเฅค

เจฆเฉเจฐเจฟเจธเจผเจŸเฉ€เจ•เฉ‹เจฃ

เจธเจ•เฉเจฐเจฟเจชเจŸ เจตเจฟเฉฑเจš เจ•เฉ€, เจ•เจฟเฉฑเจฅเฉ‡, เจ•เจฟเจตเฉ‡เจ‚ เจ…เจคเฉ‡ เจ•เจฟเจธ เจ•เฉเจฐเจฎ เจตเจฟเฉฑเจš เจชเฉเจฐเจฆเจฐเจธเจผเจจ เจ•เฉ€เจคเจพ เจœเจพเจตเฉ‡เจ—เจพ เจ‡เจธเจฆเจพ เจตเจฐเจฃเจจ เจธเจผเจพเจฎเจฒ เจนเฉˆเฅค เจ‡เฉฑเจ• เจฐเฉ‹เจฒ เจตเจฟเฉฑเจš เจ•เจˆ เจธเจ•เฉเจฐเจฟเจชเจŸเจพเจ‚ เจนเฉ‹ เจธเจ•เจฆเฉ€เจ†เจ‚ เจนเจจ, เจ…เจคเฉ‡ เจนเจฐ เจ‡เฉฑเจ• เจฎเจพเจฐเจ— เจฆเฉ‡ เจจเจพเจฒ เจ‡เฉฑเจ• เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ เจนเฉˆ <role>/molecule/<scenario>, เจŸเฉˆเจธเจŸ เจฒเจˆ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ€เจ†เจ‚ เจ•เจพเจฐเจตเจพเจˆเจ†เจ‚ เจฆเจพ เจตเฉ‡เจฐเจตเจพ เจฐเฉฑเจ–เจฆเจพ เจนเฉˆเฅค เจ‡เฉฑเจ• เจธเจ•เฉเจฐเจฟเจชเจŸ เจนเฉ‹เจฃเฉ€ เจšเจพเจนเฉ€เจฆเฉ€ เจนเฉˆ default, เจœเฉ‹ เจ•เจฟ เจ†เจŸเฉ‹เจฎเฉˆเจŸเจฟเจ•เจฒเฉ€ เจฌเจฃ เจœเจพเจตเฉ‡เจ—เฉ€ เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ Molecule เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจญเฉ‚เจฎเจฟเจ•เจพ เจจเฉ‚เฉฐ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เฅค เจนเฉ‡เจ  เจฒเจฟเจ–เฉ€เจ†เจ‚ เจธเจ•เฉเจฐเจฟเจชเจŸเจพเจ‚ เจฆเฉ‡ เจจเจพเจฎ เจคเฉเจนเจพเจกเฉ€ เจฎเจฐเจœเจผเฉ€ เจ…เจจเฉเจธเจพเจฐ เจนเจจเฅค

เจ‡เฉฑเจ• เจธเจ•เฉเจฐเจฟเจชเจŸ เจตเจฟเฉฑเจš เจœเจพเจ‚เจš เจ•เจฟเจฐเจฟเจ†เจตเจพเจ‚ เจฆเฉ‡ เจ•เฉเจฐเจฎ เจจเฉ‚เฉฐ เจ•เจฟเจนเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ เจฎเฉˆเจŸเจฐเจฟเจ•เจธ, เจ…เจคเฉ‡ เจฎเฉ‚เจฒ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจ‡เจน เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจนเฉˆ:

(เจ•เจฆเจฎเจพเจ‚ เจฆเฉ€ เจจเจฟเจธเจผเจพเจจเจฆเฉ‡เจนเฉ€ เจ•เฉ€เจคเฉ€ เจ—เจˆ ?, เจฎเฉ‚เจฒ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจ›เฉฑเจกเฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจนเจจ เจœเฉ‡เจ•เจฐ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจฆเฉเจ†เจฐเจพ เจจเจฟเจฐเจงเจพเจฐเจค เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ)

  • lint - เจšเฉฑเจฒ เจฐเจนเฉ‡ เจฒเจฟเฉฐเจŸเจฐเฅค เจฎเฉ‚เจฒ เจฐเฉ‚เจช เจตเจฟเฉฑเจš yamllint ะธ flake8,
  • destroy - เจ…เจฃเฉ‚ เจฆเฉ‡ เจ†เจ–เจฐเฉ€ เจฒเจพเจ‚เจš เจคเฉ‹เจ‚ เจ‰เจฆเจพเจนเจฐเจจเจพเจ‚ เจจเฉ‚เฉฐ เจฎเจฟเจŸเจพเจ‰เจฃเจพ (เจœเฉ‡ เจ•เฉ‹เจˆ เจฌเจšเจฟเจ† เจนเฉˆ),
  • dependency? - เจŸเฉˆเจธเจŸ เจ•เฉ€เจคเฉ€ เจญเฉ‚เจฎเจฟเจ•เจพ เจฆเฉ€ เจœเจตเจพเจฌเจฆเฉ‡เจน เจจเจฟเจฐเจญเจฐเจคเจพ เจจเฉ‚เฉฐ เจธเจฅเจพเจชเจฟเจค เจ•เจฐเจจเจพ,
  • syntax - เจตเจฐเจค เจ•เฉ‡ เจญเฉ‚เจฎเจฟเจ•เจพ เจธเฉฐเจŸเฉˆเจ•เจธ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐ เจฐเจฟเจนเจพ เจนเฉˆ ansible-playbook --syntax-check,
  • create - เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจฃ เจฌเจฃเจพเจ‰เจฃเจพ,
  • prepare? - เจ‰เจฆเจพเจนเจฐเจฃ เจฆเฉ€ เจคเจฟเจ†เจฐเฉ€; เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ python2 เจฆเฉ€ เจœเจพเจ‚เจš/เจ‡เฉฐเจธเจŸเจพเจฒ เจ•เจฐเจจเจพ
  • converge - เจŸเฉˆเจธเจŸ เจ•เฉ€เจคเฉ€ เจชเจฒเฉ‡เจฌเฉเฉฑเจ• เจจเฉ‚เฉฐ เจฒเจพเจ‚เจš เจ•เจฐเจจเจพ,
  • idempotence - เจ‡เจฎเจชเฉ‹เจŸเฉˆเจ‚เจธเฉ€ เจŸเฉˆเจธเจŸ เจฒเจˆ เจชเจฒเฉ‡เจฌเฉเฉฑเจ• เจจเฉ‚เฉฐ เจฆเฉเจฌเจพเจฐเจพ เจšเจฒเจพเจ“,
  • side_effect? - เจ•เจพเจฐเจตเจพเจˆเจ†เจ‚ เจธเจฟเฉฑเจงเฉ‡ เจคเฉŒเจฐ 'เจคเฉ‡ เจญเฉ‚เจฎเจฟเจ•เจพ เจจเจพเจฒ เจธเจฌเฉฐเจงเจค เจจเจนเฉ€เจ‚ เจนเจจ, เจชเจฐ เจŸเฉˆเจธเจŸเจพเจ‚ เจฒเจˆ เจœเจผเจฐเฉ‚เจฐเฉ€ เจนเจจ,
  • verify โ€” เจตเจฐเจคเจฆเฉ‡ เจนเฉ‹เจ เจจเจคเฉ€เจœเฉ‡ เจตเจœเฉ‹เจ‚ เจธเฉฐเจฐเจšเจจเจพ เจฆเฉ‡ เจšเฉฑเจฒ เจฐเจนเฉ‡ เจŸเฉˆเจธเจŸ testinfra(เจฎเฉ‚เจฒ) /goss/inspec,
  • cleanup? - (เจจเจตเฉ‡เจ‚ เจธเฉฐเจธเจ•เจฐเจฃเจพเจ‚ เจตเจฟเฉฑเจš) - เจฎเฉ‹เจŸเฉ‡ เจคเฉŒเจฐ 'เจคเฉ‡, เจ…เจฃเฉ‚ เจฆเฉเจ†เจฐเจพ เจชเฉเจฐเจญเจพเจตเจฟเจค เจฌเจพเจนเจฐเฉ€ เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจขเจพเจ‚เจšเฉ‡ เจจเฉ‚เฉฐ "เจธเจซเจผเจพเจˆ" เจ•เจฐเจจเจพ,
  • destroy - เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจฃ เจจเฉ‚เฉฐ เจฎเจฟเจŸเจพเจ‰เจฃเจพ.

เจ‡เจน เจ•เฉเจฐเจฎ เจœเจผเจฟเจ†เจฆเจพเจคเจฐ เจฎเจพเจฎเจฒเจฟเจ†เจ‚ เจจเฉ‚เฉฐ เจ•เจตเจฐ เจ•เจฐเจฆเจพ เจนเฉˆ, เจชเจฐ เจœเฉ‡ เจฒเฉ‹เฉœ เจนเฉ‹เจตเฉ‡ เจคเจพเจ‚ เจธเฉ‹เจงเจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค

เจ‰เจชเจฐเฉ‹เจ•เจค เจ•เจฆเจฎเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจนเจฐเฉ‡เจ• เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจตเฉฑเจ–เจฐเฉ‡ เจคเฉŒเจฐ 'เจคเฉ‡ เจšเจฒเจพเจ‡เจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ molecule <command>. เจชเจฐ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เจน เจธเจฎเจเจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ เจ•เจฟ เจนเจฐเฉ‡เจ• เจ…เจœเจฟเจนเฉ‡ cli เจ•เจฎเจพเจ‚เจก เจฒเจˆ เจ•เจฟเจฐเจฟเจ†เจตเจพเจ‚ เจฆเจพ เจ†เจชเจฃเจพ เจ•เฉเจฐเจฎ เจนเฉ‹ เจธเจ•เจฆเจพ เจนเฉˆ, เจœเจฟเจธ เจจเฉ‚เฉฐ เจคเฉเจธเฉ€เจ‚ เจšเจฒเจพ เจ•เฉ‡ เจฒเฉฑเจญ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค molecule matrix <command>. เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจœเจฆเฉ‹เจ‚ เจ•เจฎเจพเจ‚เจก เจšเจฒเจพเจ‰เจ‚เจฆเฉ‡ เจนเฉ‹ converge (เจŸเฉˆเจธเจŸ เจ•เฉ€เจคเฉ€ เจชเจฒเฉ‡เจฌเฉเฉฑเจ• เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจฃเจพ) เจนเฉ‡เจ  เจฒเจฟเจ–เฉ€เจ†เจ‚ เจ•เจพเจฐเจตเจพเจˆเจ†เจ‚ เจ•เฉ€เจคเฉ€เจ†เจ‚ เจœเจพเจฃเจ—เฉ€เจ†เจ‚:

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

เจ‡เจนเจจเจพเจ‚ เจ•เจพเจฐเจตเจพเจˆเจ†เจ‚ เจฆเฉ‡ เจ•เฉเจฐเจฎ เจจเฉ‚เฉฐ เจธเฉฐเจชเจพเจฆเจฟเจค เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ. เจœเฉ‡เจ•เจฐ เจธเฉ‚เจšเฉ€ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ•เฉเจ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจชเฉ‚เจฐเจพ เจนเฉ‹ เจ—เจฟเจ† เจนเฉˆ, เจคเจพเจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจ›เฉฑเจก เจฆเจฟเฉฑเจคเจพ เจœเจพเจตเฉ‡เจ—เจพเฅค เจฎเฉŒเจœเฉ‚เจฆเจพ เจธเจฅเจฟเจคเฉ€, เจ…เจคเฉ‡ เจจเจพเจฒ เจนเฉ€ เจ‰เจฆเจพเจนเจฐเจจ เจธเฉฐเจฐเจšเจจเจพ, เจ…เจฃเฉ‚ เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ เจตเจฟเฉฑเจš เจธเจŸเฉ‹เจฐ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ $TMPDIR/molecule/<role>/<scenario>.

เจจเจพเจฒ เจ•เจฆเจฎ เจœเฉ‹เฉœเฉ‹ ? เจคเฉเจธเฉ€เจ‚ เจœเจตเจพเจฌเฉ€ เจชเจฒเฉ‡เจฌเฉเฉฑเจ• เจซเจพเจฐเจฎเฉˆเจŸ เจตเจฟเฉฑเจš เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ€เจ†เจ‚ เจ•เจพเจฐเจตเจพเจˆเจ†เจ‚ เจฆเจพ เจตเจฐเจฃเจจ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจ…เจคเฉ‡ เจ•เจฆเจฎ เจฆเฉ‡ เจ…เจจเฉเจธเจพเจฐ เจซเจพเจˆเจฒ เจจเจพเจฎ เจฌเจฃเจพ เจธเจ•เจฆเฉ‡ เจนเฉ‹: prepare.yml/side_effect.yml. เจ‡เจน เจ…เจฃเฉ‚ เจซเจพเจˆเจฒเจพเจ‚ เจธเจ•เฉเจฐเจฟเจชเจŸ เจซเฉ‹เจฒเจกเจฐ เจตเจฟเฉฑเจš เจนเฉ‹เจฃ เจฆเฉ€ เจ‰เจฎเฉ€เจฆ เจ•เจฐเฉ‹เฅค

เจกเจฐเจพเจˆเจตเจฐ

เจ‡เฉฑเจ• เจกเฉเจฐเจพเจˆเจตเจฐ เจ‡เฉฑเจ• เจ…เจœเจฟเจนเฉ€ เจนเจธเจคเฉ€ เจนเฉˆ เจœเจฟเฉฑเจฅเฉ‡ เจŸเฉˆเจธเจŸเจพเจ‚ เจฒเจˆ เจ‰เจฆเจพเจนเจฐเจฃเจพเจ‚ เจฌเจฃเจพเจˆเจ†เจ‚ เจœเจพเจ‚เจฆเฉ€เจ†เจ‚ เจนเจจเฅค
เจธเจŸเฉˆเจ‚เจกเจฐเจก เจกเฉเจฐเจพเจˆเจตเจฐเจพเจ‚ เจฆเฉ€ เจธเฉ‚เจšเฉ€ เจœเจฟเจธ เจฒเจˆ เจ…เจฃเฉ‚ เจ•เฉ‹เจฒ เจคเจฟเจ†เจฐ เจŸเฉˆเจ‚เจชเจฒเฉ‡เจŸ เจนเจจ: Azure, Docker, EC2, GCE, LXC, LXD, OpenStack, Vagrant, Delegated.

เจœเจผเจฟเจ†เจฆเจพเจคเจฐ เจฎเจพเจฎเจฒเจฟเจ†เจ‚ เจตเจฟเฉฑเจš, เจŸเฉˆเจ‚เจชเจฒเฉ‡เจŸ เจซเจพเจˆเจฒเจพเจ‚ เจนเฉเฉฐเจฆเฉ€เจ†เจ‚ เจนเจจ create.yml ะธ destroy.yml เจธเจ•เฉเจฐเจฟเจชเจŸ เจซเฉ‹เจฒเจกเจฐ เจตเจฟเฉฑเจš, เจœเฉ‹ เจ•เฉเจฐเจฎเจตเจพเจฐ, เจ‰เจฆเจพเจนเจฐเจจ เจฆเฉ€ เจฐเจšเจจเจพ เจ…เจคเฉ‡ เจฎเจฟเจŸเจพเจ‰เจฃ เจฆเจพ เจตเจฐเจฃเจจ เจ•เจฐเจฆเจพ เจนเฉˆเฅค
เจ…เจชเจตเจพเจฆ เจนเจจ เจกเฉŒเจ•เจฐ เจ…เจคเฉ‡ เจตเฉˆเจ—เจฐเฉˆเจ‚เจŸ, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ‰เจนเจจเจพเจ‚ เจฆเฉ‡ เจฎเฉ‹เจกเฉ€เจŠเจฒเจพเจ‚ เจจเจพเจฒ เจชเจฐเจธเจชเจฐ เจชเฉเจฐเจญเจพเจต เจ‰เจชเจฐเฉ‹เจ•เจค เจซเจพเจˆเจฒเจพเจ‚ เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚ เจนเฉ‹ เจธเจ•เจฆเจพ เจนเฉˆเฅค

เจ‡เจน เจกเฉˆเจฒเฉ€เจ—เฉ‡เจŸเจฟเจก เจกเจฐเจพเจˆเจตเจฐ เจจเฉ‚เฉฐ เจ‰เจœเจพเจ—เจฐ เจ•เจฐเจจ เจฆเฉ‡ เจฏเฉ‹เจ— เจนเฉˆ, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจœเฉ‡เจ•เจฐ เจ‡เจธเจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ, เจคเจพเจ‚ เจ‰เจฆเจพเจนเจฐเจฃ เจฌเจฃเจพเจ‰เจฃ เจ…เจคเฉ‡ เจฎเจฟเจŸเจพเจ‰เจฃ เจตเจพเจฒเฉ€เจ†เจ‚ เจซเจพเจˆเจฒเจพเจ‚ เจตเจฟเฉฑเจš เจธเจฟเจฐเจซ เจ‡เฉฐเจธเจŸเฉˆเจ‚เจธ เจ•เฉŒเจ‚เจซเจฟเจ—เจฐเฉ‡เจธเจผเจจ เจตเจพเจฒเจพ เจ•เฉฐเจฎ เจฆเฉฑเจธเจฟเจ† เจ—เจฟเจ† เจนเฉˆ; เจฌเจพเจ•เฉ€ เจฆเจพ เจตเจฐเจฃเจจ เจ‡เฉฐเจœเฉ€เจจเฉ€เจ…เจฐ เจฆเฉเจ†เจฐเจพ เจ•เฉ€เจคเจพ เจœเจพเจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆเฅค

เจกเจฟเจซเจพเจฒเจŸ เจกเจฐเจพเจˆเจตเจฐ เจกเฉŒเจ•เจฐ เจนเฉˆเฅค

เจนเฉเจฃ เจ…เจญเจฟเจ†เจธ เจตเฉฑเจฒ เจตเจงเจฆเฉ‡ เจนเจพเจ‚ เจ…เจคเฉ‡ เจ‰เฉฑเจฅเฉ‡ เจนเฉ‹เจฐ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ 'เจคเฉ‡ เจตเจฟเจšเจพเจฐ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚เฅค

เจธเจผเฉเจฐเฉ‚เจ†เจค

เจ‡เฉฑเจ• "เจนเฉˆเจฒเฉ‹ เจตเจฐเจฒเจก" เจตเจœเฉ‹เจ‚ เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจธเจงเจพเจฐเจจ nginx เจ‡เฉฐเจธเจŸเจพเจฒเฉ‡เจธเจผเจจ เจฐเฉ‹เจฒ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจพเจ‚เจ—เฉ‡เฅค เจšเจฒเฉ‹ เจกเจฐเจพเจ‡เจตเจฐ เจตเจœเฉ‹เจ‚ เจกเฉŒเจ•เจฐ เจฆเฉ€ เจšเฉ‹เจฃ เจ•เจฐเฉ€เจ - เจฎเฉˆเจจเฉ‚เฉฐ เจฒเจ—เจฆเจพ เจนเฉˆ เจ•เจฟ เจคเฉเจนเจพเจกเฉ‡ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจฌเจนเฉเจคเจฟเจ†เจ‚ เจจเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจธเจฅเจพเจชเจฟเจค เจ•เฉ€เจคเจพ เจนเฉˆ (เจ…เจคเฉ‡ เจฏเจพเจฆ เจฐเฉฑเจ–เฉ‹ เจ•เจฟ เจกเฉŒเจ•เจฐ เจกเจฟเจซเฉŒเจฒเจŸ เจกเจฐเจพเจˆเจตเจฐ เจนเฉˆ)เฅค

เจคเจฟเจ†เจฐ เจ•เจฐเฉ‹ 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 เจจเจพเจฒ เจธเจพเจฐเฉ€เจ†เจ‚ เจชเจฐเจธเจชเจฐ เจ•เฉเจฐเจฟเจ†เจตเจพเจ‚ เจฐเฉ‹เจฒ เจฐเฉ‚เจŸ เจคเฉ‹เจ‚ เจฌเจฃเฉ€เจ†เจ‚ เจนเจจเฅค

เจ†เจ“ เจฆเฉ‡เจ–เฉ€เจ เจ•เจฟ เจฐเฉ‹เจฒ เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ เจตเจฟเฉฑเจš เจ•เฉ€ เจนเฉˆ:

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

1 directory, 6 files

เจ†เจ‰ เจธเฉฐเจฐเจšเจจเจพ เจจเฉ‚เฉฐ เจตเฉ‡เจ–เฉ€เจ molecule/default/molecule.yml (เจ…เจธเฉ€เจ‚ เจธเจฟเจฐเจซ เจกเฉŒเจ•เจฐ เจšเจฟเฉฑเจคเจฐ เจจเฉ‚เฉฐ เจฌเจฆเจฒเจพเจ‚เจ—เฉ‡):

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

เจจเจฟเจฐเจญเจฐเจคเจพ

เจ‡เจน เจญเจพเจ— เจจเจฟเจฐเจญเจฐเจคเจพ เจฆเฉ‡ เจธเจฐเฉ‹เจค เจฆเจพ เจตเจฐเจฃเจจ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

เจธเฉฐเจญเจต เจตเจฟเจ•เจฒเจช: เจ—เจฒเฉˆเจ•เจธเฉ€, เจ—เจฟเจฒเจŸ, เจธเจผเฉˆเฉฑเจฒ.

เจธเจผเฉˆเฉฑเจฒ เจตเจฐเจคเจฃ เจฒเจˆ เจธเจฟเจฐเจซเจผ เจ‡เฉฑเจ• เจ•เจฎเจพเจ‚เจก เจธเจผเฉˆเฉฑเจฒ เจนเฉˆ เจœเฉ‡เจ•เจฐ เจ—เจฒเฉˆเจ•เจธเฉ€ เจ…เจคเฉ‡ เจ—เจฟเจฒเจŸ เจคเฉเจนเจพเจกเฉ€เจ†เจ‚ เจฒเฉ‹เฉœเจพเจ‚ เจจเฉ‚เฉฐ เจชเฉ‚เจฐเจพ เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเฉ‡ เจนเจจเฅค

เจฎเฉˆเจ‚ เจ‡เฉฑเจฅเฉ‡ เจœเจผเจฟเจ†เจฆเจพ เจฆเฉ‡เจฐ เจคเฉฑเจ• เจจเจนเฉ€เจ‚ เจฐเจนเจพเจ‚เจ—เจพ, เจ‡เจธ เจตเจฟเฉฑเจš เจ•เจพเจซเจผเฉ€ เจตเจฐเจฃเจจ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ เจฆเจธเจคเจพเจตเฉ‡เจœเจผ.

เจกเจฐเจพเจˆเจตเจฐ

เจกเจฐเจพเจˆเจตเจฐ เจฆเจพ เจจเจพเจฎเฅค เจธเจพเจกเฉ‡ เจฒเจˆ เจ‡เจน เจกเฉŒเจ•เจฐ เจนเฉˆ.

lint

เจฏเจฎเจฒเจฟเจจเจŸ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจฒเจฟเฉฐเจŸเจฐ เจตเจœเฉ‹เจ‚ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆเฅค

เจธเฉฐเจฐเจšเจจเจพ เจฆเฉ‡ เจ‡เจธ เจนเจฟเฉฑเจธเฉ‡ เจตเจฟเฉฑเจš เจ‰เจชเจฏเฉ‹เจ—เฉ€ เจตเจฟเจ•เจฒเจช yamllint, เจซเจพเจฐเจตเจฐเจก เจตเจพเจคเจพเจตเจฐเจฃ เจตเฉ‡เจฐเฉ€เจเจฌเจฒ, เจœเจพเจ‚ linter เจจเฉ‚เฉฐ เจ…เจฏเฉ‹เจ— เจ•เจฐเจจ เจฒเจˆ เจ‡เฉฑเจ• เจธเฉฐเจฐเจšเจจเจพ เจซเจพเจ‡เจฒ เจจเฉ‚เฉฐ เจจเจฟเจฐเจงเจพเจฐเจฟเจค เจ•เจฐเจจ เจฆเฉ€ เจฏเฉ‹เจ—เจคเจพ เจนเจจ:

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

เจชเจฒเฉ‡เจŸเจซเจพเจฐเจฎ

เจ‰เจฆเจพเจนเจฐเจจเจพเจ‚ เจฆเฉ€ เจธเฉฐเจฐเจšเจจเจพ เจฆเจพ เจตเจฐเจฃเจจ เจ•เจฐเจฆเจพ เจนเฉˆเฅค
เจ‡เฉฑเจ• เจกเจฐเจพเจˆเจตเจฐ เจฆเฉ‡ เจคเฉŒเจฐ เจคเฉ‡ เจกเฉŒเจ•เจฐ เจฆเฉ‡ เจฎเจพเจฎเจฒเฉ‡ เจตเจฟเฉฑเจš, เจ…เจฃเฉ‚ เจ‡เจธ เจญเจพเจ— เจ‰เฉฑเจคเฉ‡ เจฆเฉเจนเจฐเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจธเฉ‚เจšเฉ€ เจฆเจพ เจนเจฐเฉ‡เจ• เจคเฉฑเจค เจ‡เจธ เจตเจฟเฉฑเจš เจ‰เจชเจฒเจฌเจง เจนเฉˆ Dockerfile.j2 เจ‡เฉฑเจ• เจตเฉ‡เจฐเฉ€เจเจฌเจฒ เจฆเฉ‡ เจฐเฉ‚เจช เจตเจฟเฉฑเจš item.

เจœเจฟเจธ เจตเจฟเจš เจกเจฐเจพเจˆเจตเจฐ เจฆเฉ‡ เจฎเจพเจฎเจฒเฉ‡ เจตเจฟเจš เจธเฉ€ create.yml ะธ destroy.yml, เจธเฉˆเจ•เจธเจผเจจ เจ‰เจนเจจเจพเจ‚ เจตเจฟเฉฑเจš เจ‰เจชเจฒเจฌเจง เจนเฉˆ molecule_yml.platforms, เจ…เจคเฉ‡ เจ‡เจธ เจ‰เฉฑเจคเฉ‡ เจฆเฉเจนเจฐเจพเจ“ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจ‡เจนเจจเจพเจ‚ เจซเจพเจˆเจฒเจพเจ‚ เจตเจฟเฉฑเจš เจตเจฐเจฃเจฟเจค เจนเจจเฅค

เจ•เจฟเจ‰เจ‚เจ•เจฟ Molecule Ansible เจฎเฉŒเจกเจฟเจŠเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจ‰เจฆเจพเจนเจฐเจจ เจชเฉเจฐเจฌเฉฐเจงเจจ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเจพ เจนเฉˆ, เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‰เฉฑเจฅเฉ‡ เจธเฉฐเจญเจต เจธเฉˆเจŸเจฟเฉฐเจ—เจพเจ‚ เจฆเฉ€ เจธเฉ‚เจšเฉ€ เจฒเฉฑเจญเจฃเฉ€ เจšเจพเจนเฉ€เจฆเฉ€ เจนเฉˆเฅค เจกเฉŒเจ•เจฐ เจฒเจˆ, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจฎเฉ‹เจกเฉ€เจŠเจฒ เจตเจฐเจคเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ docker_container_module. เจนเฉ‹เจฐ เจกเจฐเจพเจˆเจตเจฐเจพเจ‚ เจตเจฟเฉฑเจš เจ•เจฟเจนเฉœเฉ‡ เจฎเฉ‹เจกเฉ€เจŠเจฒ เจตเจฐเจคเฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจนเจจ, เจตเจฟเฉฑเจš เจชเจพเจ‡เจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ เจฆเจธเจคเจพเจตเฉ‡เจœเจผ.

เจคเฉเจธเฉ€เจ‚ เจตเฉฑเจ–-เจตเฉฑเจ– เจกเจฐเจพเจˆเจตเจฐเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจฆเฉ€เจ†เจ‚ เจ‰เจฆเจพเจนเจฐเจฃเจพเจ‚ เจตเฉ€ เจฒเฉฑเจญ เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจ…เจฃเฉ‚ เจฆเฉ‡ เจŸเฉˆเจธเจŸเจพเจ‚ เจตเจฟเฉฑเจš.

เจ†เจ“ เจ‡เฉฑเจฅเฉ‡ เจฌเจฆเจฒเฉ€เจ centos:7 'เจคเฉ‡ เจ‰เจฌเจคเฉ‚เฉฐ.

เจชเฉเจฐเฉ‹เจตเฉ€เจœเจผเจจเจฐ

"เจชเฉเจฐเจฆเจพเจคเจพ" เจ‰เจน เจ‡เจ•เจพเจˆ เจนเฉˆ เจœเฉ‹ เจ‰เจฆเจพเจนเจฐเจจเจพเจ‚ เจฆเจพ เจชเฉเจฐเจฌเฉฐเจงเจจ เจ•เจฐเจฆเฉ€ เจนเฉˆเฅค เจ…เจฃเฉ‚ เจฆเฉ‡ เจฎเจพเจฎเจฒเฉ‡ เจตเจฟเฉฑเจš, เจ‡เจน เจœเจตเจพเจฌเจฆเฉ‡เจน เจนเฉˆ; เจฆเฉ‚เจœเจฟเจ†เจ‚ เจฒเจˆ เจธเจฎเจฐเจฅเจจ เจฏเฉ‹เจœเจจเจพเจฌเฉฑเจง เจจเจนเฉ€เจ‚ เจนเฉˆ, เจ‡เจธเจฒเจˆ เจ‡เจธ เจญเจพเจ— เจจเฉ‚เฉฐ, เจฐเจฟเจœเจผเจฐเจตเฉ‡เจธเจผเจจ เจฆเฉ‡ เจจเจพเจฒ, เจ‡เฉฑเจ• เจตเจฟเจธเจคเฉเจฐเจฟเจค เจœเจตเจพเจฌเจฆเฉ‡เจน เจธเฉฐเจฐเจšเจจเจพ เจ•เจฟเจนเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค
เจ‡เฉฑเจฅเฉ‡ เจฌเจนเฉเจค เจ•เฉเจ เจนเฉˆ เจœเฉ‹ เจคเฉเจธเฉ€เจ‚ เจ‡เฉฑเจฅเฉ‡ เจฆเฉฑเจธ เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจชเจฐ เจฎเฉˆเจ‚ เจฎเฉเฉฑเจ– เจจเฉเจ•เจคเจฟเจ†เจ‚ เจจเฉ‚เฉฐ เจ‰เจœเจพเจ—เจฐ เจ•เจฐเจพเจ‚เจ—เจพ, เจฎเฉ‡เจฐเฉ€ เจฐเจพเจ เจตเจฟเฉฑเจš:

  • เจชเจฒเฉ‡เจฌเฉเฉฑเจ•: เจคเฉเจธเฉ€เจ‚ เจจเจฟเจธเจผเจšเจฟเจค เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจ•เจฟ เจ•เจฟเจนเฉœเฉ€เจ†เจ‚ เจชเจฒเฉ‡เจฌเฉเฉฑเจ•เจพเจ‚ เจจเฉ‚เฉฐ เจ•เฉเจ เจชเฉœเจพเจตเจพเจ‚ 'เจคเฉ‡ เจตเจฐเจคเจฟเจ† เจœเจพเจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆเฅค

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

เจฆเฉเจฐเจฟเจธเจผ

เจธเจ•เฉเจฐเจฟเจชเจŸ เจ•เฉเจฐเจฎ เจฆเจพ เจธเจฟเจฐเจฒเฉ‡เจ– เจ…เจคเฉ‡ เจตเจฐเจฃเจจเฅค
เจคเฉเจธเฉ€เจ‚ เจ•เฉเฉฐเจœเฉ€ เจœเฉ‹เฉœ เจ•เฉ‡ เจ•เจฎเจพเจ‚เจก เจฆเฉ‡ เจกเจฟเจซเจพเจฒเจŸ เจเจ•เจธเจผเจจ เจฎเฉˆเจŸเจฐเจฟเจ•เจธ เจจเฉ‚เฉฐ เจฌเจฆเจฒ เจธเจ•เจฆเฉ‡ เจนเฉ‹ <command>_sequence เจ…เจคเฉ‡ เจ‡เจธเจฆเฉ‡ เจฒเจˆ เจ‡เฉฑเจ• เจฎเฉเฉฑเจฒ เจฆเฉ‡ เจฐเฉ‚เจช เจตเจฟเฉฑเจš, เจธเจพเจจเฉ‚เฉฐ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ‡ เจ•เจฆเจฎเจพเจ‚ เจฆเฉ€ เจธเฉ‚เจšเฉ€ เจจเฉ‚เฉฐ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจ•เจฐเจจเจพเฅค
เจฎเฉฐเจจ เจฒเจ“ เจ•เจฟ เจ…เจธเฉ€เจ‚ เจชเจฒเฉ‡เจฌเฉเฉฑเจ• เจฐเจจ เจ•เจฎเจพเจ‚เจก เจšเจฒเจพเจ‰เจฃ เจตเฉ‡เจฒเฉ‡ เจ•เจฟเจฐเจฟเจ†เจตเจพเจ‚ เจฆเฉ‡ เจ•เฉเจฐเจฎ เจจเฉ‚เฉฐ เจฌเจฆเจฒเจฃเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเจพเจ‚: molecule converge

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

เจšเฉˆเฉฑเจ•

เจŸเฉˆเจธเจŸเจพเจ‚ เจฒเจˆ เจ‡เฉฑเจ• เจขเจพเจ‚เจšเจพ เจธเจฅเจพเจชเจค เจ•เจฐเจจเจพ เจ…เจคเฉ‡ เจ‡เจธเจฆเฉ‡ เจฒเจˆ เจ‡เฉฑเจ• เจฒเจฟเฉฐเจŸเจฐ. เจฎเฉ‚เจฒ เจฐเฉ‚เจช เจตเจฟเฉฑเจš, เจฒเจฟเฉฐเจŸเจฐ เจตเจฐเจคเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ 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

เจตเจฟเจ—เจพเฉœเจจ เจฆเฉ‡ เจ…เจงเฉ€เจจ เจฒเฉฐเจฌเจพ เจจเจฟเจ•เจพเจธ:

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

เจธเจฟเฉฑเจŸเจพ

เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจคเฉเจธเฉ€เจ‚ เจตเฉ‡เจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจฎเฉ‹เจฒเฉ€เจ•เจฟเจŠเจฒ เจฌเจนเฉเจค เจ—เฉเฉฐเจเจฒเจฆเจพเจฐ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจ…เจคเฉ‡ เจœเจฆเฉ‹เจ‚ เจคเฉเจธเฉ€เจ‚ เจ†เจชเจฃเฉ‡ เจŸเฉˆเจ‚เจชเจฒเฉ‡เจŸเจธ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹, เจคเจพเจ‚ เจคเฉเจธเฉ€เจ‚ เจ‰เจฆเจพเจนเจฐเจจเจพเจ‚ เจฌเจฃเจพเจ‰เจฃ เจ…เจคเฉ‡ เจฎเจฟเจŸเจพเจ‰เจฃ เจฒเจˆ เจชเจฒเฉ‡เจฌเฉเฉฑเจ• เจตเจฟเฉฑเจš เจตเฉ‡เจฐเฉ€เจเจฌเจฒ เจจเฉ‚เฉฐ เจธเฉฐเจชเจพเจฆเจฟเจค เจ•เจฐเจจ เจฒเจˆ เจ‡เฉฑเจ• เจจเจตเฉ€เจ‚ เจธเจ•เฉเจฐเจฟเจชเจŸ เจฆเฉ€ เจคเฉˆเจจเจพเจคเฉ€ เจจเฉ‚เฉฐ เจ˜เจŸเจพ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค เจ…เจฃเฉ‚ เจธเจนเจฟเจœเฉ‡ เจนเฉ€ CI เจชเฉเจฐเจฃเจพเจฒเฉ€เจ†เจ‚ เจจเจพเจฒ เจเจ•เฉ€เจ•เฉเจฐเจฟเจค เจนเฉเฉฐเจฆเจพ เจนเฉˆ, เจœเฉ‹ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจชเจฒเฉ‡เจฌเฉเฉฑเจ•เจพเจ‚ เจฆเฉ€ เจฎเฉˆเจจเฉ‚เจ…เจฒ เจŸเฉˆเจธเจŸเจฟเฉฐเจ— เจฒเจˆ เจธเจฎเจพเจ‚ เจ˜เจŸเจพ เจ•เฉ‡ เจตเจฟเจ•เจพเจธ เจฆเฉ€ เจ—เจคเฉ€ เจจเฉ‚เฉฐ เจตเจงเจพเจ‰เจฃ เจฆเฉ€ เจ†เจ—เจฟเจ† เจฆเจฟเฉฐเจฆเจพ เจนเฉˆเฅค

เจคเฉเจนเจพเจกเฉ‡ เจงเจฟเจ†เจจ เจฒเจˆ เจงเฉฐเจจเจตเจพเจฆ. เจœเฉ‡ เจคเฉเจนเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจœเจตเจพเจฌเจฆเฉ‡เจน เจญเฉ‚เจฎเจฟเจ•เจพเจตเจพเจ‚ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจจ เจฆเจพ เจ…เจจเฉเจญเจต เจนเฉˆ, เจ…เจคเฉ‡ เจ‡เจน เจ…เจฃเฉ‚ เจจเจพเจฒ เจธเจฌเฉฐเจงเจค เจจเจนเฉ€เจ‚ เจนเฉˆ, เจคเจพเจ‚ เจธเจพเจจเฉ‚เฉฐ เจŸเจฟเฉฑเจชเจฃเฉ€เจ†เจ‚ เจตเจฟเฉฑเจš เจ‡เจธ เจฌเจพเจฐเฉ‡ เจฆเฉฑเจธเฉ‹!

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹