เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เตพ: เดŽเด™เตเด™เดจเต† เด…เตปเดธเดฟเดฌเดฟเตพ เดฑเต‹เดณเตเด•เตพ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดพเด‚, เดจเดฟเตผเดฎเตเดฎเดพเดฃเดคเตเดคเดฟเดจเต เดฎเตเดฎเตเดชเตเดณเตเดณ เดชเตเดฐเดถเตเดจเด™เตเด™เตพ เด•เดฃเตเดŸเต†เดคเตเดคเตเด•

เดนเดฒเต‡เดพ เดŽเดฒเตเดฒเดพเดตเตผเด•เตเด•เตเด‚!

เดžเดพเตป เด’เดฐเต เดนเต‹เดŸเตเดŸเตฝ เดฌเตเด•เตเด•เดฟเด‚เด—เต เดธเต‡เดตเดจเดคเตเดคเดฟเตฝ DevOps เดŽเดžเตเดšเดฟเดจเต€เดฏเดฑเดพเดฏเดฟ เดœเต‹เดฒเดฟ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. Ostrovok.ru. เดˆ เดฒเต‡เด–เดจเดคเตเดคเดฟเตฝ, เด…เตปเดธเดฟเดฌเดฟเตพ เดฑเต‹เดณเตเด•เตพ เดชเดฐเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดฒเต† เดžเด™เตเด™เดณเตเดŸเต† เด…เดจเตเดญเดตเดคเตเดคเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เดธเด‚เดธเดพเดฐเดฟเด•เตเด•เดพเตป เดžเดพเตป เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเต.

Ostrovok.ru-เตฝ, เดžเด™เตเด™เตพ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดฎเดพเดจเต‡เดœเดฐเดพเดฏเดฟ เด…เตปเดธเดฟเดฌเดฟเตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต. เด…เดŸเตเดคเตเดคเดฟเดŸเต†, เดฑเต‹เดณเตเด•เตพ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเดฟเดจเตเดฑเต† เด†เดตเดถเตเดฏเด•เดคเดฏเดฟเดฒเต‡เด•เตเด•เต เดžเด™เตเด™เตพ เดŽเดคเตเดคเดฟ, เดชเด•เตเดทเต‡, เด‡เดคเดฟเดจเต เดตเดณเดฐเต†เดฏเดงเดฟเด•เด‚ เด‰เดชเด•เดฐเดฃเด™เตเด™เตพ เด‡เดฒเตเดฒ - เดเดฑเตเดฑเดตเตเด‚ เดœเดจเดชเตเดฐเดฟเดฏเดฎเดพเดฏเดคเต, เด’เดฐเตเดชเด•เตเดทเต‡, เดฎเต‹เดณเดฟเด•เตเดฏเต‚เตพ เดšเดŸเตเดŸเด•เตเด•เต‚เดŸเดพเดฃเต, เด…เดคเดฟเดจเดพเตฝ เดžเด™เตเด™เตพ เด…เดคเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเตป เดคเต€เดฐเตเดฎเดพเดจเดฟเดšเตเดšเต. เดŽเดจเตเดจเดพเตฝ เด…เดฆเตเดฆเต‡เดนเดคเตเดคเดฟเดจเตเดฑเต† เดกเต‹เด•เตเดฏเตเดฎเต†เดจเตเดฑเต‡เดทเตป เดชเดฒ เด…เดชเด•เดŸเด™เตเด™เดณเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเด‚ เดจเดฟเดถเดฌเตเดฆเดฎเดพเดฃเต†เดจเตเดจเต เดคเต†เดณเดฟเดžเตเดžเต. เดฑเดทเตเดฏเตป เดญเดพเดทเดฏเดฟเตฝ เดฎเดคเดฟเดฏเดพเดฏ เดตเดฟเดถเดฆเดฎเดพเดฏ เดฎเดพเดจเตเดตเตฝ เดžเด™เตเด™เตพเด•เตเด•เต เด•เดฃเตเดŸเต†เดคเตเดคเดพเตป เด•เดดเดฟเดžเตเดžเดฟเดฒเตเดฒ, เด…เดคเดฟเดจเดพเตฝ เดˆ เดฒเต‡เด–เดจเด‚ เดŽเดดเตเดคเดพเตป เดžเด™เตเด™เตพ เดคเต€เดฐเตเดฎเดพเดจเดฟเดšเตเดšเต.

เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เตพ: เดŽเด™เตเด™เดจเต† เด…เตปเดธเดฟเดฌเดฟเตพ เดฑเต‹เดณเตเด•เตพ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดพเด‚, เดจเดฟเตผเดฎเตเดฎเดพเดฃเดคเตเดคเดฟเดจเต เดฎเตเดฎเตเดชเตเดณเตเดณ เดชเตเดฐเดถเตเดจเด™เตเด™เตพ เด•เดฃเตเดŸเต†เดคเตเดคเตเด•

เดคเดจเตเดฎเดพเดคเตเดฐ

เดคเดจเตเดฎเดพเดคเตเดฐ - เด…เตปเดธเดฟเดฌเดฟเตพ เดฑเต‹เดณเตเด•เตพ เดชเดฐเต€เด•เตเดทเดฟเด•เตเด•เดพเตป เดธเดนเดพเดฏเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เดšเดŸเตเดŸเด•เตเด•เต‚เดŸเต.

เดฒเดณเดฟเดคเดฎเดพเดฏ เดตเดฟเดตเดฐเดฃเด‚: เดจเดฟเด™เตเด™เตพ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เตเดจเตเดจ เดชเตเดฒเดพเดฑเตเดฑเตโ€Œเดซเต‹เดฎเดฟเตฝ เดคเดจเตเดฎเดพเดคเตเดฐ เด’เดฐเต เด‰เดฆเดพเดนเดฐเดฃเด‚ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเต (เด•เตเดฒเต—เดกเต, เดตเต†เตผเดšเตเดตเตฝ เดฎเต†เดทเต€เตป, เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเตผ; เด•เต‚เดŸเตเดคเตฝ เดตเดฟเดถเดฆเดพเด‚เดถเด™เตเด™เตพเด•เตเด•เต, เดตเดฟเดญเดพเด—เด‚ เด•เดพเดฃเตเด• เดกเตเดฐเตˆเดตเตผ), เดจเดฟเด™เตเด™เดณเตเดŸเต† เดฑเต‹เตพ เด…เดคเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเด•, เดคเตเดŸเตผเดจเตเดจเต เดŸเต†เดธเตเดฑเตเดฑเตเด•เตพ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเด•เดฏเตเด‚ เด‰เดฆเดพเดนเดฐเดฃเด‚ เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เด’เดฐเต เด˜เดŸเตเดŸเดคเตเดคเดฟเตฝ เดชเดฐเดพเดœเดฏเดชเตเดชเต†เดŸเตเด•เดฏเดพเดฃเต†เด™เตเด•เดฟเตฝ, เดฎเต‹เดณเดฟเด•เตเดฏเต‚เตพ เด…เดคเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เดจเดฟเด™เตเด™เดณเต† เด…เดฑเดฟเดฏเดฟเด•เตเด•เตเด‚.

เด‡เดชเตเดชเต‹เตพ เด•เต‚เดŸเตเดคเตฝ.

เด’เดฐเต เดธเดฟเดฆเตเดงเดพเดจเตเดคเด‚

เดคเดจเตเดฎเดพเดคเตเดฐเดฏเตเดŸเต† เดฐเดฃเตเดŸเต เดชเตเดฐเดงเดพเดจ เดŽเดจเตเดฑเดฟเดฑเตเดฑเดฟเด•เตพ เดชเดฐเดฟเด—เดฃเดฟเด•เตเด•เตเด•: เดธเดฟเดจเดพเดฐเดฟเดฏเต‹เดฏเตเด‚ เดกเตเดฐเตˆเดตเดฑเตเด‚.

เดธเดพเดนเดšเดฐเตเดฏเด‚

เดŽเดจเตเดคเต, เดŽเดตเดฟเดŸเต†, เดŽเด™เตเด™เดจเต†, เดเดคเต เด•เตเดฐเดฎเดคเตเดคเดฟเตฝ เดจเดฟเตผเดตเดนเดฟเด•เตเด•เตเด‚ เดŽเดจเตเดจเดคเดฟเดจเตเดฑเต† เดตเดฟเดตเดฐเดฃเด‚ เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเดฟเตฝ เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต. เด’เดฐเต เดฑเต‹เดณเดฟเดจเต เดจเดฟเดฐเดตเดงเดฟ เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตเด•เตพ เด‰เดฃเตเดŸเดพเดฏเดฟเดฐเดฟเด•เตเด•เดพเด‚, เด“เดฐเต‹เดจเตเดจเตเด‚ เดชเดพเดคเดฏเดฟเดฒเต† เด’เดฐเต เดกเดฏเดฑเด•เตเดŸเดฑเดฟเดฏเดพเดฃเต <role>/molecule/<scenario>, เดŸเต†เดธเตเดฑเตเดฑเดฟเดจเต เด†เดตเดถเตเดฏเดฎเดพเดฏ เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เดณเตเดŸเต† เดตเดฟเดตเดฐเดฃเด™เตเด™เตพ เด‡เดคเดฟเตฝ เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต. เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เด‰เตพเดชเตเดชเต†เดŸเตเดคเตเดคเดฃเด‚ default, เดจเดฟเด™เตเด™เตพ เด’เดฐเต เดฎเต‹เดณเดฟเด•เตเดฏเต‚เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดฑเต‹เตพ เด†เดฐเด‚เดญเดฟเด•เตเด•เตเด•เดฏเดพเดฃเต†เด™เตเด•เดฟเตฝ เด…เดคเต เดธเตเดตเดฏเดฎเต‡เดต เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเด‚. เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตเด•เดณเตเดŸเต† เดชเต‡เดฐเตเด•เตพ เดจเดฟเด™เตเด™เดณเตเดŸเต‡เดคเดพเดฃเต.

เด’เดฐเต เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเดฟเดฒเต† เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เดณเตเดŸเต† เดชเดฐเต€เด•เตเดทเดฃ เด•เตเดฐเดฎเดคเตเดคเต† เดตเดฟเดณเดฟเด•เตเด•เตเดจเตเดจเต เดฎเดพเดŸเตเดฐเดฟเด•เตเดธเต, เดธเตเดฅเดฟเดฐเดธเตเดฅเดฟเดคเดฟเดฏเดพเดฏเดฟ เด‡เดคเต:

(เดฒเต‡เดฌเตฝ เดšเต†เดฏเตเดค เด˜เดŸเตเดŸเด™เตเด™เตพ ?, เด‰เดชเดฏเต‹เด•เตเดคเดพเดตเต เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เดฟเดฏเดฟเดŸเตเดŸเดฟเดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดธเตเดฅเดฟเดฐเดธเตเดฅเดฟเดคเดฟเดฏเดพเดฏเดฟ เด’เดดเดฟเดตเดพเด•เตเด•เตเด‚)

  • lint - เด“เดŸเตเดจเตเดจ เดฒเดฟเดจเตเดฑเดฑเตเด•เตพ. เดธเตเดฅเดฟเดฐเดธเตเดฅเดฟเดคเดฟเดฏเดพเดฏเดฟ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต yamllint ะธ flake8,
  • destroy - เดคเดจเตเดฎเดพเดคเตเดฐเดฏเตเดŸเต† เด…เดตเดธเดพเดจ เดตเดฟเด•เตเดทเต‡เดชเดฃเดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดธเด‚เดญเดตเด™เตเด™เตพ เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เตเดจเตเดจเต (เดŽเดจเตเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เด‰เดฃเตเดŸเต†เด™เตเด•เดฟเตฝ),
  • dependency? - เดชเดฐเดฟเดถเต‹เดงเดฟเดšเตเดš เดฑเต‹เดณเดฟเดจเตเดฑเต† เด†เดถเตเดฐเดฟเดคเดคเตเดตเดคเตเดคเดฟเดจเตเดฑเต† เด‡เตปเดธเตเดฑเตเดฑเดพเดณเต‡เดทเตป,
  • syntax - เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจ เดฑเต‹เดณเดฟเดจเตเดฑเต† เดตเดพเด•เตเดฏเด˜เดŸเดจ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเต ansible-playbook --syntax-check,
  • create - เด’เดฐเต เด‰เดฆเดพเดนเดฐเดฃเด‚ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเต,
  • prepare? - เด‰เดฆเดพเดนเดฐเดฃเด‚ เดคเดฏเตเดฏเดพเดฑเดพเด•เตเด•เตฝ; เด‰เดฆเดพ. เดชเตˆเดคเตเดคเตบ2 เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเด•/เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเตเด•
  • converge - เดชเตเดฒเต‡เดฌเตเด•เตเด•เดฟเดจเตเดฑเต† เดฒเต‹เดžเตเดšเต เดชเดฐเต€เด•เตเดทเดฟเดšเตเดšเตเด•เตŠเดฃเตเดŸเดฟเดฐเดฟเด•เตเด•เตเด•เดฏเดพเดฃเต,
  • idempotence - เดเดกเดฎเตเดชเดฑเตเดฑเตปเดธเดฟ เดŸเต†เดธเตเดฑเตเดฑเดฟเดจเดพเดฏเดฟ เดชเตเดฒเต‡เดฌเตเด•เตเด•เต เดชเตเดจเดฐเดพเดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเต,
  • side_effect? - เดฑเต‹เดณเตเดฎเดพเดฏเดฟ เดจเต‡เดฐเดฟเดŸเตเดŸเต เดฌเดจเตเดงเดฎเดฟเดฒเตเดฒเดพเดคเตเดค เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เตพ, เดชเด•เตเดทเต‡ เดชเดฐเดฟเดถเต‹เดงเดจเด•เตพเด•เตเด•เต เด†เดตเดถเตเดฏเดฎเดพเดฃเต,
  • verify - เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดซเดฒเดฎเดพเดฏเตเดฃเตเดŸเดพเด•เตเดจเตเดจ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเดจเตเดฑเต† เดŸเต†เดธเตเดฑเตเดฑเตเด•เตพ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเด• testinfra(เดธเตเดฅเดฟเดฐเดธเตเดฅเดฟเดคเดฟ) /goss/inspec,
  • cleanup? - (เดชเตเดคเดฟเดฏ เดชเดคเดฟเดชเตเดชเตเด•เดณเดฟเตฝ) - เดเด•เดฆเต‡เดถเด‚ เดชเดฑเดžเตเดžเดพเตฝ, เดฎเต‹เดณเดฟเด•เตเดฏเต‚เตพ เดฌเดพเดงเดฟเดšเตเดš เดฌเดพเดนเตเดฏ เด‡เตปเดซเตเดฐเดพเดธเตเดŸเตเดฐเด•เตเดšเตผ "เดตเตƒเดคเตเดคเดฟเดฏเดพเด•เตเด•เตฝ",
  • destroy - เด’เดฐเต เด‰เดฆเดพเดนเดฐเดฃเด‚ เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เตเดจเตเดจเต.

เดˆ เด•เตเดฐเดฎเด‚ เดฎเดฟเด•เตเด• เด•เต‡เดธเตเด•เดณเตเด‚ เด‰เตพเด•เตเด•เตŠเดณเตเดณเตเดจเตเดจเต, เดชเด•เตเดทเต‡ เด†เดตเดถเตเดฏเดฎเต†เด™เตเด•เดฟเตฝ เดฎเดพเดฑเตเดฑเดพเดตเตเดจเตเดจเดคเดพเดฃเต.

เดฎเตเด•เดณเดฟเดฒเตเดณเตเดณ เด“เดฐเต‹ เด˜เดŸเตเดŸเด™เตเด™เดณเตเด‚ เดชเตเดฐเดคเตเดฏเต‡เด•เด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚ molecule <command>. เดŽเดจเตเดจเดพเตฝ เด…เดคเตเดคเดฐเด‚ เด“เดฐเต‹ เด•เตเดฒเตˆ-เด•เดฎเดพเตปเดกเดฟเดจเตเด‚ เด…เดคเดฟเดจเตเดฑเต‡เดคเดพเดฏ เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เดณเตเดŸเต† เด•เตเดฐเดฎเด‚ เด‰เดฃเตเดŸเดพเดฏเดฟเดฐเดฟเด•เตเด•เดพเดฎเต†เดจเตเดจเต เดฎเดจเดธเตเดธเดฟเดฒเดพเด•เตเด•เดฃเด‚, เด…เดคเต เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดฒเต‚เดŸเต† เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด•เดฃเตเดŸเต†เดคเตเดคเดพเดจเดพเด•เตเด‚ molecule matrix <command>. เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เด•เดฎเดพเตปเดกเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ converge (เดชเดฐเต€เด•เตเดทเดฃเดคเตเดคเดฟเดจเต เด•เต€เดดเดฟเตฝ เดชเตเดฒเต‡เดฌเตเด•เตเด•เต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเต), เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเด‚:

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

เดˆ เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เดณเตเดŸเต† เด•เตเดฐเดฎเด‚ เดŽเดกเดฟเดฑเตเดฑเตเดšเต†เดฏเตเดฏเดพเดจเดพเด•เตเด‚. เดฒเดฟเดธเตเดฑเตเดฑเดฟเตฝ เดจเดฟเดจเตเดจเต เดŽเดจเตเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เด‡เดคเดฟเดจเด•เด‚ เดšเต†เดฏเตเดคเตเด•เดดเดฟเดžเตเดžเดพเตฝ, เด…เดคเต เด’เดดเดฟเดตเดพเด•เตเด•เดชเตเดชเต†เดŸเตเด‚. เดจเดฟเดฒเดตเดฟเดฒเต† เด…เดตเดธเตเดฅเดฏเตเด‚ เดธเดจเตเดฆเตผเดญเด™เตเด™เดณเตเดŸเต† เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเดจเตเด‚, เดคเดจเตเดฎเดพเดคเตเดฐ เดกเดฏเดฑเด•เตเดŸเดฑเดฟเดฏเดฟเตฝ เดธเด‚เดญเดฐเดฟเด•เตเด•เตเดจเตเดจเต $TMPDIR/molecule/<role>/<scenario>.

เด•เต‚เดŸเต† เด˜เดŸเตเดŸเด™เตเด™เตพ เดšเต‡เตผเด•เตเด•เตเด• ? เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด†เดตเดถเตเดฏเดฎเตเดณเตเดณ เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เตพ ansible-playbook เดซเต‹เตผเดฎเดพเดฑเตเดฑเดฟเตฝ เดตเดฟเดตเดฐเดฟเด•เตเด•เดพเด‚, เด•เต‚เดŸเดพเดคเต† เด˜เดŸเตเดŸเด‚ เด…เดจเตเดธเดฐเดฟเดšเตเดšเต เดซเดฏเดฒเดฟเดจเตเดฑเต† เดชเต‡เดฐเต เด‰เดฃเตเดŸเดพเด•เตเด•เตเด•: prepare.yml/side_effect.yml. เดˆ เดซเดฏเดฒเตเด•เตพ เดชเตเดฐเดคเต€เด•เตเดทเดฟเด•เตเด•เตเด• เดคเดจเตเดฎเดพเดคเตเดฐ เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เดซเต‹เตพเดกเดฑเดฟเดฒเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเด‚.

เดกเตเดฐเตˆเดตเตผ

เดŸเต†เดธเตเดฑเตเดฑเต เดธเดจเตเดฆเตผเดญเด™เตเด™เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เดŽเดจเตเดฑเดฟเดฑเตเดฑเดฟเดฏเดพเดฃเต เดกเตเดฐเตˆเดตเตผ.
เดฎเต‹เดณเดฟเด•เตเดฏเต‚เดณเดฟเดจเต เดŸเต†เด‚เดชเตเดฒเต‡เดฑเตเดฑเตเด•เตพ เดคเดฏเตเดฏเดพเดฑเดพเดฏเดฟเดŸเตเดŸเตเดณเตเดณ เดธเตเดฑเตเดฑเดพเตปเดกเต‡เตผเดกเต เดกเตเดฐเตˆเดตเดฑเตเด•เดณเตเดŸเต† เดฒเดฟเดธเตเดฑเตเดฑเต เด‡เดชเตเดฐเด•เดพเดฐเดฎเดพเดฃเต: Azure, Docker, EC2, GCE, LXC, LXD, OpenStack, Vagrant, Deligated.

เดฎเดฟเด•เตเด• เด•เต‡เดธเตเด•เดณเดฟเดฒเตเด‚, เดŸเต†เด‚เดชเตเดฒเต‡เดฑเตเดฑเตเด•เตพ เดซเดฏเดฒเตเด•เดณเดพเดฃเต 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

เด†เดถเตเดฐเดฟเดคเดคเตเดตเด‚

เดˆ เดตเดฟเดญเดพเด—เด‚ เดกเดฟเดชเตปเดกเตปเดธเดฟเด•เดณเตเดŸเต† เด‰เดฑเดตเดฟเดŸเด‚ เดตเดฟเดตเดฐเดฟเด•เตเด•เตเดจเตเดจเต.

เดธเดพเดงเตเดฏเดฎเดพเดฏ เด“เดชเตเดทเดจเตเด•เตพ: เด—เดพเดฒเด•เตเดธเดฟ, เด—เดฟเตฝเดฑเตเดฑเต, เดทเต†เตฝ.

เด—เดพเดฒเด•เตเดธเดฟเดฏเตเด‚ เด—เดฟเตฝเดฑเตเดฑเตเด‚ เดจเดฟเด™เตเด™เดณเตเดŸเต† เด†เดตเดถเตเดฏเด™เตเด™เตพ เดจเดฟเดฑเดตเต‡เดฑเตเดฑเตเดจเตเดจเดฟเดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เด•เดฎเดพเตปเดกเต เดทเต†เตฝ เดฎเดพเดคเตเดฐเดฎเดพเดฃเต เดทเต†เตฝ.

เดžเดพเตป เด‡เดตเดฟเดŸเต† เดตเดณเดฐเต†เด•เตเด•เดพเดฒเด‚ เดคเดพเดฎเดธเดฟเด•เตเด•เดฟเดฒเตเดฒ, เด…เดคเต เดตเดฟเดตเดฐเดฟเดšเตเดšเดพเตฝ เดฎเดคเดฟ เดชเตเดฐเดฎเดพเดฃเต€เด•เดฐเดฃเด‚.

เดกเตเดฐเตˆเดตเตผ

เดกเตเดฐเตˆเดตเดฑเตเดŸเต† เดชเต‡เดฐเต. เดžเด™เตเด™เดณเตเดŸเต‡เดคเต เดกเต‹เด•เตเด•เดฑเดพเดฃเต.

เดฎเดคเตเดคเด™เตเด™

เดฒเดฟเดจเตเดฑเตผ เดฏเดพเด‚เดฒเดฟเดจเตเดฑเต เด†เดฃเต.

yamllint, เดซเต‹เตผเดตเต‡เดกเต เดŽเตปเดตเดฏเต‹เตบเดฎเต†เดจเตเดฑเต เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเตเด•เตพ, เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดฒเดฟเดจเตเดฑเตผ เดชเตเดฐเดตเตผเดคเตเดคเดจเดฐเดนเดฟเดคเดฎเดพเด•เตเด•เตฝ เดŽเดจเตเดจเดฟเดตเดฏเตโ€Œเด•เตเด•เดพเดฏเดฟ เด’เดฐเต เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดซเดฏเตฝ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด•เดดเดฟเดตเดพเดฃเต เด•เต‹เตบเดซเดฟเด—เดฑเดฟเตปเดฑเต† เดˆ เดญเดพเด—เดคเตเดคเดฟเดฒเต† เด‰เดชเดฏเต‹เด—เดชเตเดฐเดฆเดฎเดพเดฏ เด“เดชเตเดทเดจเตเด•เตพ:

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

เดชเตเดฒเดพเดฑเตเดฑเตเดซเต‹เดฎเตเด•เตพ

เดธเด‚เดญเดตเด™เตเด™เดณเตเดŸเต† เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดตเดฟเดตเดฐเดฟเด•เตเด•เตเดจเตเดจเต.
เด’เดฐเต เดกเตเดฐเตˆเดตเตผ เดŽเดจเตเดจ เดจเดฟเดฒเดฏเดฟเตฝ เดกเต‹เด•เตเด•เดฑเดฟเดจเตเดฑเต† เด•เดพเดฐเตเดฏเดคเตเดคเดฟเตฝ, เดคเดจเตเดฎเดพเดคเตเดฐ เดˆ เดตเดฟเดญเดพเด—เดคเตเดคเดฟเตฝ เด†เดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต, เด•เต‚เดŸเดพเดคเต† เดฒเดฟเดธเตเดฑเตเดฑเดฟเดฒเต† เด“เดฐเต‹ เด˜เดŸเด•เด™เตเด™เดณเตเด‚ เด‡เดคเดฟเตฝ เดฒเดญเตเดฏเดฎเดพเดฃเต Dockerfile.j2 เด’เดฐเต เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเดพเดฏเดฟ item.

เด†เดตเดถเตเดฏเดฎเตเดณเตเดณ เด’เดฐเต เดกเตเดฐเตˆเดตเดฑเตเดŸเต† เด•เดพเดฐเตเดฏเดคเตเดคเดฟเตฝ create.yml ะธ destroy.yml, เดŽเดจเตเดจ เดตเดฟเดญเดพเด—เด‚ เด…เดตเดฏเดฟเตฝ เดฒเดญเตเดฏเดฎเดพเดฃเต molecule_yml.platforms, เด•เต‚เดŸเดพเดคเต† เด…เดคเดฟเดจเต เดฎเต‡เดฒเตเดณเตเดณ เด†เดตเตผเดคเตเดคเดจเด™เตเด™เตพ เดˆ เดซเดฏเดฒเตเด•เดณเดฟเตฝ เด‡เดคเดฟเดจเด•เด‚ เดตเดฟเดตเดฐเดฟเดšเตเดšเดฟเดŸเตเดŸเตเดฃเตเดŸเต.

เดฎเต‹เดณเดฟเด•เตเดฏเต‚เตพ เด…เตปเดธเดฟเดฌเดฟเตพ เดฎเตŠเดกเตเดฏเต‚เดณเตเด•เตพเด•เตเด•เต เด‡เตปเดธเตเดฑเตเดฑเตปเดธเตเด•เดณเตเดŸเต† เดจเดฟเดฏเดจเตเดคเตเดฐเดฃเด‚ เดจเตฝเด•เตเดจเตเดจเดคเดฟเดจเดพเตฝ, เดธเดพเดงเตเดฏเดฎเดพเดฏ เด•เตเดฐเดฎเต€เด•เดฐเดฃเด™เตเด™เดณเตเดŸเต† เดชเดŸเตเดŸเดฟเด•เดฏเตเด‚ เด…เดตเดฟเดŸเต† เดคเดฟเดฐเดฏเต‡เดฃเตเดŸเดคเดพเดฃเต. เดกเต‹เด•เตเด•เดฑเดฟเดจเดพเดฏเดฟ, เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดฎเตŠเดกเตเดฏเต‚เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต docker_container_module. เดฎเดฑเตเดฑเต เดกเตเดฐเตˆเดตเดฑเตเด•เดณเดฟเตฝ เดเดคเตŠเด•เตเด•เต† เดฎเตŠเดกเตเดฏเต‚เดณเตเด•เดณเดพเดฃเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเต†เดจเตเดจเต เด•เดฃเตเดŸเต†เดคเตเดคเดพเดจเดพเด•เตเด‚ เดชเตเดฐเดฎเดพเดฃเต€เด•เดฐเดฃเด‚.

เดตเดฟเดตเดฟเดง เดกเตเดฐเตˆเดตเดฑเตเด•เดณเตเดŸเต† เด‰เดชเดฏเต‹เด—เดคเตเดคเดฟเดจเตเดฑเต† เด‰เดฆเดพเดนเดฐเดฃเด™เตเด™เดณเตเด‚ เด•เดพเดฃเดพเด‚ เดคเดจเตเดฎเดพเดคเตเดฐเดฏเตเดŸเต† เดชเดฐเดฟเดถเต‹เดงเดจเด•เดณเดฟเตฝ เดคเดจเตเดจเต†.

เด‡เดตเดฟเดŸเต† เดฎเดพเดฑเตเดฑเดฟเดธเตเดฅเดพเดชเดฟเด•เตเด•เตเด• เดธเต†เดจเตเดฑเต‹เดธเต: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 --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

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•