เชนเซเชฒเซ เชฆเชฐเซเช!
เชนเซเช เชนเซเชเซเชฒ เชฌเซเชเชฟเชเช เชธเซเชตเชพเชฎเชพเช DevOps เชเชจเซเชเชฟเชจเชฟเชฏเชฐ เชคเชฐเซเชเซ เชเชพเชฎ เชเชฐเซเช เชเซเช.
Ostrovok.ru เชชเชฐ, เช เชฎเซ เชฐเซเชชเชฐเซเชเชพเชเชเชจ เชฎเซเชจเซเชเชฐ เชคเชฐเซเชเซ เช เชจเซเชธเชฟเชฌเชฒเชจเซ เชเชชเชฏเซเช เชเชฐเซเช เชเซเช. เชคเชพเชเซเชคเชฐเชฎเชพเช, เช เชฎเซ เชญเซเชฎเชฟเชเชพเชเชจเซเช เชชเชฐเซเชเซเชทเชฃ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐเชฟเชฏเชพเชค เชชเชฐ เชเชตเซเชฏเชพ, เชชเชฐเชเชคเซ เชคเซ เชฌเชนเชพเชฐ เชเชตเซเชฏเซเช เชคเซเชฎ, เช เชฎเชพเชเซ เชเชฃเชพ เชฌเชงเชพ เชธเชพเชงเชจเซ เชจเชฅเซ - เชธเซเชฅเซ เชตเชงเซ เชฒเซเชเชชเซเชฐเชฟเชฏ, เชเชฆเชพเช, เชฎเซเชฒเซเชเซเชฏเซเชฒ เชซเซเชฐเซเชฎเชตเชฐเซเช เชเซ, เชคเซเชฅเซ เช เชฎเซ เชคเซเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพเชจเซเช เชจเชเซเชเซ เชเชฐเซเชฏเซเช. เชชเชฐเชเชคเซ เชคเซ เชฌเชนเชพเชฐ เชเชตเซเชฏเซเช เชเซ เชเซ เชคเซเชจเชพ เชฆเชธเซเชคเชพเชตเซเชเซเชเชฐเชฃ เชเชฃเชพ เชฎเซเชถเซเชเซเชฒเซเช เชตเชฟเชถเซ เชฎเซเชจ เชเซ. เช เชฎเชจเซ เชฐเชถเชฟเชฏเชจเชฎเชพเช เชชเซเชฐเชคเซเช เชตเชฟเชเชคเชตเชพเชฐ เชฎเซเชจเซเชฏเซเช เชฒ เชฎเชณเซ เชถเชเซเชฏเซเช เชจเชฅเซ, เชคเซเชฅเซ เช เชฎเซ เช เชฒเซเช เชฒเชเชตเชพเชจเซเช เชจเชเซเชเซ เชเชฐเซเชฏเซเช.
เช เชฃเซ
เชธเชฐเชณ เชตเชฐเซเชฃเชจ: เชคเชฎเซ เชธเซเชชเชทเซเช เชเชฐเซ เชเซ เชคเซ เชชเซเชฒเซเชเชซเซเชฐเซเชฎ เชชเชฐ เชชเชฐเชฎเชพเชฃเซ เชเช เชฆเชพเชเชฒเซ เชฌเชจเชพเชตเซ เชเซ (เชเซเชฒเชพเชเชก, เชตเชฐเซเชเซเชฏเซเช
เชฒ เชฎเชถเซเชจ, เชเชจเซเชเซเชจเชฐ; เชตเชงเซ เชตเชฟเชเชคเซ เชฎเชพเชเซ, เชตเชฟเชญเชพเช เชเซเช
เชนเชตเซ เชตเชงเซ.
เชธเชฟเชฆเซเชงเชพเชเชค เชเช เชฌเซเช
เชชเชฐเชฎเชพเชฃเซเชจเซ เชฌเซ เชฎเซเชเซเชฏ เชธเชเชธเซเชฅเชพเชเชจเซ เชตเชฟเชเชพเชฐ เชเชฐเซ: เชฆเซเชถเซเชฏ เช เชจเซ เชกเซเชฐเชพเชเชตเชฐ.
เชชเชฐเชฟเชฆเซเชฆเชถเซเชฏ
เชธเซเชเซเชฐเชฟเชชเซเชเชฎเชพเช เชถเซเช, เชเซเชฏเชพเช, เชเซเชตเซ เชฐเซเชคเซ เช
เชจเซ เชเชฏเชพ เชเซเชฐเชฎเชฎเชพเช เชเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ เชคเซเชจเซเช เชตเชฐเซเชฃเชจ เชเซ. เชเช เชญเซเชฎเชฟเชเชพเชฎเชพเช เชเชฃเซ เชธเซเชเซเชฐเชฟเชชเซเชเซ เชนเซเช เชถเชเซ เชเซ, เช
เชจเซ เชฆเชฐเซเช เชชเชพเชฅ เชธเชพเชฅเซเชจเซ เชกเชฟเชฐเซเชเซเชเชฐเซ เชเซ <role>/molecule/<scenario>
, เชเซเชฎเชพเช เชชเชฐเซเชเซเชทเชฃ เชฎเชพเชเซ เชเชฐเซเชฐเซ เชเซเชฐเชฟเชฏเชพเชเชจเซเช เชตเชฐเซเชฃเชจ เชเซ. เชธเซเชเซเชฐเชฟเชชเซเช เชถเชพเชฎเซเชฒ เชนเซเชตเซ เชเชตเชถเซเชฏเช เชเซ default
, เชเซ เชเชชเชฎเซเชณเซ เชฌเชจเชพเชตเชตเชพเชฎเชพเช เชเชตเชถเซ เชเซ เชคเชฎเซ เชชเชฐเชฎเชพเชฃเซ เชธเชพเชฅเซ เชญเซเชฎเชฟเชเชพ เชถเชฐเซ เชเชฐเซ เชเซ. เชจเซเชเซเชจเซ เชธเซเชเซเชฐเชฟเชชเซเชเซเชจเชพ เชจเชพเชฎ เชคเชฎเชพเชฐเชพ เชชเชฐ เชเซ.
เชธเซเชเซเชฐเชฟเชชเซเชเชฎเชพเช เชชเชฐเซเชเซเชทเชฃ เชเซเชฐเชฟเชฏเชพเชเชจเซ เชเซเชฐเชฎ เชเชนเซเชตเชพเชฎเชพเช เชเชตเซ เชเซ เชฎเซเชเซเชฐเชฟเชเซเชธ, เช เชจเซ เชฎเซเชณเชญเซเชค เชฐเซเชคเซ เชคเซ เชเซ:
(เชชเชเชฒเชพเช เชฒเซเชฌเชฒ เชเชฐเซเชฒเชพ ?
, เชเซ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชฆเซเชตเชพเชฐเชพ เชเชฒเซเชฒเซเชเชฟเชค เชจ เชนเซเชฏ เชคเซ เชฎเซเชณเชญเซเชค เชฐเซเชคเซ เชเซเชกเชตเชพเชฎเชพเช เชเชตเซ เชเซ)
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>
. เชชเชฐเชเชคเซ เชคเซ เชธเชฎเชเชตเซเช เชเซเชเช เชเซ เชเชตเชพ เชฆเชฐเซเช เชเซเชฒเชฟ-เชเชฎเชพเชจเซเชก เชฎเชพเชเซ เชเซเชฐเชฟเชฏเชพเชเชจเซ เชชเซเชคเชพเชจเซ เชเซเชฐเชฎ เชนเซเช เชถเชเซ เชเซ, เชเซ เชคเชฎเซ เชเชเซเชเซเชเซเชฏเซเช เชเชฐเซเชจเซ เชถเซเชงเซ เชถเชเซ เชเซ. 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
เช เชตเชฒเชเชฌเชจ
เช เชตเชฟเชญเชพเช เชจเชฟเชฐเซเชญเชฐเชคเชพเชจเชพ เชธเซเชคเซเชฐเซเชคเชจเซเช เชตเชฐเซเชฃเชจ เชเชฐเซ เชเซ.
เชธเชเชญเชตเชฟเชค เชตเชฟเชเชฒเซเชชเซ:
เชถเซเชฒ เช เชซเชเซเชค เชเช เชเชฎเชพเชจเซเชก เชถเซเชฒ เชเซ เชเซเชจเซ เชเชชเชฏเซเช เชเซเชฒเซเชเซเชธเซ เช เชจเซ เชเชฟเชฒเซเช เชคเชฎเชพเชฐเซ เชเชฐเซเชฐเชฟเชฏเชพเชคเซเชจเซ เชเชตเชฐเซ เชฒเซเชคเชพ เชจเชฅเซ เชคเซเชตเชพ เชเชฟเชธเซเชธเชพเชฎเชพเช เชฅเชพเชฏ เชเซ.
เชนเซเช เช
เชนเซเช เชฒเชพเชเชฌเชพ เชธเชฎเชฏ เชธเซเชงเซ เชฐเชนเซเชถ เชจเชนเซเช, เชคเซ เชชเซเชฐเชคเซเช เชตเชฐเซเชฃเชตเซเชฒ เชเซ
เชกเซเชฐเชพเชเชตเชฐ
เชกเซเชฐเชพเชเชตเชฐเชจเซเช เชจเชพเชฎ. เช เชฎเชพเชฐเซเช เชกเซเชเชฐ เชเซ.
เชฒเชฟเชจเซเช
เชฒเชฟเชเชเชฐ เชเชเชฒเซ เชฏเชฎเชฒเชฟเชเช.
เชฐเซเชชเชฐเซเชเชพเชจเชพ เช เชญเชพเชเชฎเชพเช เชเชชเชฏเซเชเซ เชตเชฟเชเชฒเซเชชเซ 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
, เช
เชจเซ เชคเซเชจเชพ เชชเชฐ เชชเซเชจเชฐเชพเชตเซเชคเซเชคเชฟเช เชชเชนเซเชฒเซเชฅเซ เช เช เชซเชพเชเชฒเซเชฎเชพเช เชตเชฐเซเชฃเชตเซเชฒ เชเซ.
เชเชพเชฐเชฃ เชเซ เชชเชฐเชฎเชพเชฃเซ เชชเซเชฐเชคเชฟเชญเชพเชตเชถเซเชฒ เชฎเซเชกเซเชฏเซเชฒเซเชจเซ เชเชฆเชพเชนเชฐเชฃเซเชจเซเช เชจเชฟเชฏเชเชคเซเชฐเชฃ เชชเซเชฐเซเช เชชเชพเชกเซ เชเซ, เชธเชเชญเชตเชฟเชค เชธเซเชเชฟเชเชเซเชธเชจเซ เชธเซเชเชฟ เชชเชฃ เชคเซเชฏเชพเช เชเซเชตเซ เชเซเชเช. เชกเซเชเชฐ เชฎเชพเชเซ, เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เชฎเซเชกเซเชฏเซเชฒเชจเซ เชเชชเชฏเซเช เชฅเชพเชฏ เชเซ
เชคเซเชฎเช เชตเชฟเชตเชฟเชง เชกเซเชฐเชพเชเชตเชฐเซเชจเชพ เชเชชเชฏเซเชเชจเชพ เชเชฆเชพเชนเชฐเชฃเซ เชฎเชณเซ เชถเชเซ เชเซ
เช เชนเซเช เชฌเชฆเชฒเซ centos:7 เชชเชฐ เชเชฌเซเชจเซเชเซ.
เชเซเชเชตเชพเช เชเชฐเชจเชพเชฐ
"เชธเชชเซเชฒเชพเชฏเชฐ" - เชเช เชเชจเซเชเชฟเชเซ เชเซ เชฆเชพเชเชฒเชพเชเชจเซเช เชธเชเชเชพเชฒเชจ เชเชฐเซ เชเซ. เชชเชฐเชฎเชพเชฃเซเชจเชพ เชเชฟเชธเซเชธเชพเชฎเชพเช, เช เชเชตเชพเชฌเชฆเชพเชฐ เชเซ, เช
เชจเซเชฏ เชฒเซเชเซ เชฎเชพเชเซ เชธเชฎเชฐเซเชฅเชจเชจเซเช เชเชฏเซเชเชจ เชจเชฅเซ, เชคเซเชฅเซ เช เชตเชฟเชญเชพเชเชจเซ เชเซเชคเชตเชฃเซ เชธเชพเชฅเซ เชเชตเชพเชฌเชฆเชพเชฐ เชตเชฟเชธเซเชคเซเชค เชฐเซเชชเชฐเซเชเชพเชเชเชจ เชเชนเซ เชถเชเชพเชฏ.
เช
เชนเซเช เชคเชฎเซ เชเชฃเซ เชฌเชงเซ เชตเชธเซเชคเซเชเชจเซ เชเชฒเซเชฒเซเช เชเชฐเซ เชถเชเซ เชเซ, เชนเซเช เชฎเชพเชฐเชพ เชฎเชคเซ เชฎเซเชเซเชฏ เชฎเซเชฆเซเชฆเชพเชเชจเซ เชชเซเชฐเชเชพเชถเชฟเชค เชเชฐเซเชถ:
- เชชเซเชฒเซเชฌเซเชเซเชธ: เชคเชฎเซ เชเซเชเซเชเชธ เชคเชฌเชเซเชเชพเชฎเชพเช เชเช เชชเซเชฒเซเชฌเซเชเชจเซ เชเชชเชฏเซเช เชฅเชตเซ เชเซเชเช เชคเซ เชธเซเชชเชทเซเช เชเชฐเซ เชถเชเซ เชเซ.
provisioner:
name: ansible
playbooks:
create: create.yml
destroy: ../default/destroy.yml
converge: playbook.yml
side_effect: side_effect.yml
cleanup: cleanup.yml
- config_options:
เชเชตเชพเชฌเชฆเชพเชฐ เชฐเซเชชเชฐเซเชเชพ
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
.
เชจเชฟเชทเซเชเชฐเซเชท
เชเซเชฎ เชคเชฎเซ เชเซเช เชถเชเซ เชเซ, เชชเชฐเชฎเชพเชฃเซ เชฌเชนเซ เชเชเชฟเชฒ เชจเชฅเซ, เช เชจเซ เชคเชฎเชพเชฐเชพ เชชเซเชคเชพเชจเชพ เชจเชฎเซเชจเชพเชเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ, เชจเชตเซ เชธเซเชเซเชฐเชฟเชชเซเชเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชฆเชพเชเชฒเชพ เชฌเชจเชพเชตเช เช เชจเซ เชชเซเชฒเซเชฌเซเช เชเชพเชขเซ เชจเชพเชเชตเชพเชฎเชพเช เชเชฒเซเชจเซ เชธเชเชชเชพเชฆเชฟเชค เชเชฐเชตเชพ เชฎเชพเชเซ เชเชเชพเชกเซ เชถเชเชพเชฏ เชเซ. เชชเชฐเชฎเชพเชฃเซ เชธเซเชเช เชธเชฟเชธเซเชเชฎเซเชธ เชธเชพเชฅเซ เชเชเซเชเซเชค เชฐเซเชคเซ เชธเชเชเชฒเชฟเชค เชฅเชพเชฏ เชเซ, เชเซ เชคเชฎเชจเซ เชชเซเชฒเซเชฌเซเชเชจเชพ เชฎเซเชจเซเชฏเซเช เชฒ เชชเชฐเซเชเซเชทเชฃ เชฎเชพเชเซเชจเซ เชธเชฎเชฏ เชเชเชพเชกเซเชจเซ เชตเชฟเชเชพเชธเชจเซ เชเชกเชช เชตเชงเชพเชฐเชตเชพ เชฎเชพเชเซ เชชเชฐเชตเชพเชจเชเซ เชเชชเซ เชเซ.
เชคเชฎเชพเชฐเชพ เชงเซเชฏเชพเชจ เชฌเชฆเชฒ เชเชญเชพเชฐ. เชเซ เชคเชฎเชจเซ เชเชตเชพเชฌเชฆเชพเชฐ เชญเซเชฎเชฟเชเชพเชเชจเซเช เชชเชฐเซเชเซเชทเชฃ เชเชฐเชตเชพเชจเซ เช เชจเซเชญเชต เชนเซเชฏ, เช เชจเซ เชคเซ เชชเชฐเชฎเชพเชฃเซ เชธเชพเชฅเซ เชธเชเชฌเชเชงเชฟเชค เชจเชฅเซ, เชคเซ เช เชฎเชจเซ เชเชฟเชชเซเชชเชฃเซเชเชฎเชพเช เชคเซเชจเชพ เชตเชฟเชถเซ เชเชฃเชพเชตเซ!
เชธเซเชฐเซเชธ: www.habr.com