เบชเบฐเบเบฒเบเบเบตเบเบธเบเบเบปเบ!
เบเปเบญเบเปเบฎเบฑเบเบงเบฝเบเปเบเบฑเบเบงเบดเบชเบฐเบงเบฐเบเบญเบ DevOps เปเบเบเบฒเบเบเปเบฅเบดเบเบฒเบเบเบญเบเปเบฎเบเปเบฎเบก.
เบขเบนเป Ostrovok.ru, เบเบงเบเปเบฎเบปเบฒเปเบเป ansible เปเบเบฑเบเบเบนเปเบเบฑเบเบเบฒเบเบเบฒเบเบเบฑเปเบเบเปเบฒ. เบเปเปเบเบปเบเบกเบฒเบเบตเป, เบเบงเบเปเบฎเบปเบฒเปเบเปเบกเบฒเปเบเบดเบเบเบงเบฒเบกเบเปเบญเบเบเบฒเบเบเบตเปเบเบฐเบเบปเบเบชเบญเบเบเบฒเบฅเบฐเบเบปเบเบเบฒเบ, เปเบเปเบเปเบญเบเบงเปเบฒเบกเบฑเบเปเบเปเบซเบฑเบเบญเบญเบ, เบเปเปเบกเบตเปเบเบทเปเบญเบเบกเบทเบเปเบฒเบเบงเบเบซเบผเบฒเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบตเป - เบเบตเปเบเบดเบเบปเบกเบซเบผเบฒเบเบเบตเปเบชเบธเบ, เบเบฒเบเบเบต, เปเบกเปเบเบเบญเบเปเบกเปเบฅเบเบธเบ, เบเบฑเปเบเบเบฑเปเบเบเบงเบเปเบฎเบปเบฒเปเบเปเบเบฑเบเบชเบดเบเปเบเปเบเปเบกเบฑเบ. เปเบเปเบกเบฑเบเปเบเปเบซเบฑเบเบญเบญเบเบงเปเบฒเปเบญเบเบฐเบชเบฒเบเบเบญเบเบฅเบฒเบงเปเบกเปเบเบเบฝเบเปเบเปเบฝเบงเบเบฑเบเบเบธเบกเบซเบผเบฒเบ. เบเบงเบเปเบฎเบปเบฒเบเปเปเบชเบฒเบกเบฒเบเบเบญเบเบซเบฒเบเบนเปเบกเบทเบฅเบฒเบเบฅเบฐเบญเบฝเบเบเบฝเบเบเปเปเบเบเบฒเบชเบฒเบฅเบฑเบเปเบเบ, เบเบฑเปเบเบเบฑเปเบเบเบงเบเปเบฎเบปเบฒเปเบเปเบเบฑเบเบชเบดเบเปเบเบเบฝเบเบเบปเบเบเบงเบฒเบกเบเบตเป.
เปเบกเปเบฅเบเบธเบ
เบฅเบฒเบโเบฅเบฐโเบญเบฝเบโเบเปเบฒเบโเบเบฒเบโ: เปเบกโเปเบฅโเบเบธเบโเบชเปเบฒเบโเบเบปเบงโเบขเปเบฒเบโเปเบโเปเบงโเบเบตโเบเบตเปโเบเปเบฒเบโเบเปเบฒโเบเบปเบ (cloudโ, virtual machinesโ, containerโ; เบชเปเบฒโเบฅเบฑเบโเบฅเบฒเบโเบฅเบฐโเบญเบฝเบโเปเบเบตเปเบกโเปเบเบตเบกโ, เปเบเบดเปเบโเบเบฒเบโเบชเปเบงเบโ.
เปเบเบเบฑเบเบเบธเบเบฑเบเปเบเบตเปเบกเปเบเบตเบก.
เบเบดเบเบเบญเบเบเบดเบเบชเบฐเบเบต
เบเบดเบเบฒเบฅเบฐเบเบฒเบชเบญเบเบซเบเปเบงเบเบเบฒเบเบเบตเปเบชเปเบฒเบเบฑเบเบเบญเบเปเบกเปเบฅเบเบธเบ: เบชเบฐเบเบฒเบเบฐเบเบฒเบเปเบฅเบฐเปเบเปเบงเบต.
เบชเบฐเบเบฒเบเบฐเบเบฒเบ
script เบเบฐเบเบญเบเบเปเบงเบเบฅเบฒเบเบฅเบฐเบญเบฝเบเบเบญเบเบชเบดเปเบเบเบตเป, เบเปเบญเบเปเบ, เบงเบดเบเบตเบเบฒเบเปเบฅเบฐเปเบเบฅเปเบฒเบเบฑเบเปเบเบเบฐเปเบเปเบฎเบฑเบเบเบฒเบเบเบฐเบเบดเบเบฑเบ. เบเบฒเบฅเบฐเบเบปเบเบเบฒเบเบซเบเบถเปเบเบชเบฒเบกเบฒเบเบกเบตเบชเบฐเบเบดเบเบซเบผเบฒเบ, เปเบฅเบฐเปเบเปเบฅเบฐเบเบปเบเปเบกเปเบเปเบเปเบฅเบเบฐเบเปเบฅเบตเบเบฒเบกเปเบชเบฑเปเบเบเบฒเบ <role>/molecule/<scenario>
, เปเบเบดเปเบเบเบฐเบเบญเบเบเปเบงเบเบเปเบฒเบญเบฐเบเบดเบเบฒเบเบเปเบฝเบงเบเบฑเบเบเบฒเบเบเบฐเบเบดเบเบฑเบเบเบตเปเบเปเบฒเปเบเบฑเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบปเบเบชเบญเบ. Script เบเปเบญเบเบเบทเบเบฅเบงเบกเปเบเบปเปเบฒ default
, เปเบเบดเปเบเบเบฐเบเบทเบเบชเปเบฒเบเบเบทเปเบเปเบเบเบญเบฑเบเบเบฐเปเบเบกเบฑเบเบเปเบฒเบเปเบฒเบเปเบฅเบตเปเบกเบเบปเปเบเบเบปเบเบเบฒเบเบเบตเปเบกเบตเปเบกเปเบฅเบเบธเบ. เบเบทเปเบเบญเบเบชเบฐเบเบฃเบดเบเบเปเปเปเบเบเบตเปเปเบกเปเบเบเบถเปเบเบเบฑเบเบเปเบฒเบ.
เบฅเปเบฒเบเบฑเบเบเบญเบเบเบฒเบเบเบฐเบเบดเบเบฑเบเบเบฒเบเบเบปเบเบชเบญเบเปเบเบชเบฐเบเบดเบเปเบกเปเบเปเบญเบตเปเบเบงเปเบฒ matrix, เปเบฅเบฐเปเบเบเบเปเบฒเปเบฅเบตเปเบกเบเบปเปเบเบกเบฑเบเปเบกเปเบ:
(เบเบฑเปเบโเบเบญเบโเบเบตเปโเบเบดเบโเบชเบฐโเบซเบผเบฒเบโ ?
, เบเปเบฒเบกเปเบเบเบเปเบฒเปเบฅเบตเปเบกเบเบปเปเบเบเปเบฒเบเปเปเปเบเปเบฅเบฐเบเบธเปเบเบเบเบนเปเปเบเป)
lint
- เปเบฅเปเบ linters. เปเบเบเบเปเบฒเปเบฅเบตเปเบกเบเบปเปเบเปเบกเปเบเบเบทเบเบเปเบฒเปเบเปyamllint
ะธflake8
,destroy
- เบเบฒเบโเบฅเบปเบโเบเบปเบงโเบขเปเบฒเบโเบเบฒเบโเบเบฒเบโเปเบเบตเบโเบเบปเบงโเบชเบธเบโเบเปเบฒเบโเบเบญเบ Molecule (เบเปเบฒโเบกเบตโ)โ,dependency
? - เบเบฒเบโเบเบดเบโเบเบฑเปเบโเบเบญเบโเบเบฒเบโเบญเบตเบโเปเบชเป ansible เบเบญเบโเบเบปเบโเบเบฒเบโเบเบฒเบโเบเบปเบโเบชเบญเบโ,syntax
- เบเบฒเบเบเบงเบเบชเบญเบ syntax เบเบญเบเบเบฒเบฅเบฐเบเบปเบเบเบฒเบเบเบฒเบเบเปเบฒเปเบเปansible-playbook --syntax-check
,create
- เบเบฒเบโเบชเปเบฒเบโเบเบปเบงโเบขเปเบฒเบโ,prepare
? - เบเบฒเบโเบเบฐโเบเบฝเบกโเบเบญเบโเบเบปเบงโเบขเปเบฒเบโ; เบเบปเบงเบขเปเบฒเบ: เบเบงเบเปเบเบดเปเบ/เบเบดเบเบเบฑเปเบ python2converge
- เบเบฒเบโเปเบเบตเบโเบเบปเบงโเบเบญเบ 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
เบเบฒเบเปเบเบดเปเบเบเบฒเบญเบฒเปเบช
เบเบฒเบเบเบตเปเบญเบฐเบเบดเบเบฒเบเปเบซเบผเปเบเบเบตเปเบกเบฒเบเบญเบเบเบฒเบเปเบเบดเปเบเบเบฒเบญเบฒเปเบช.
เบเบฒเบเปเบฅเบทเบญเบเบเบตเปเปเบเบฑเบเปเบเปเบเป:
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, เบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบปเบเบเบปเบงเบขเปเบฒเบ, เปเบกเบเบนเบเบเบทเบเบเปเบฒเปเบเป
เปเบเบฑเปเบเบเบฝเบงเบเบฑเบเบเบฑเบเบเบปเบงเบขเปเบฒเบเบเบญเบเบเบฒเบเบเปเบฒเปเบเปเปเบเปเบงเบตเบเปเบฒเบเปเบชเบฒเบกเบฒเบเบเบปเบเปเบเป
เปเบเบเบเบตเปเบเบตเป เบชเบนเบ: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
- config_options:
config ansible
provisioner:
name: ansible
config_options:
defaults:
fact_caching: jsonfile
ssh_connection:
scp_if_ssh: True
- connection_options: เบเบฒเบโเปเบฅเบทเบญเบโ
เปเบเบทเปเบญเบกเบเปเป
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