ΠΡΠ΅ΠΌ ΠΏΡΠΈΠ²Π΅Ρ!
Π― ΡΠ°Π±ΠΎΡΠ°Ρ DevOps-ΠΈΠ½ΠΆΠ΅Π½Π΅ΡΠΎΠΌ Π² ΡΠ΅ΡΠ²ΠΈΡΠ΅ Π±ΡΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΎΡΠ΅Π»Π΅ΠΉ
Π Ostrovok.ru Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΉ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ansible. ΠΠ΅Π΄Π°Π²Π½ΠΎ ΠΌΡ ΠΏΡΠΈΡΠ»ΠΈ ΠΊ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠΎΠ»Π΅ΠΉ, Π½ΠΎ, ΠΊΠ°ΠΊ ΠΎΠΊΠ°Π·Π°Π»ΠΎΡΡ, ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ² Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π½Π΅ ΡΠ°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ β ΡΠ°ΠΌΡΠΌ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΠΌ, ΠΏΠΎΠΆΠ°Π»ΡΠΉ, ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ Molecule, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΡ ΡΠ΅ΡΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ. ΠΠΎ ΠΎΠΊΠ°Π·Π°Π»ΠΎΡΡ, ΡΡΠΎ Π΅Π³ΠΎ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΡΠΌΠ°Π»ΡΠΈΠ²Π°Π΅Ρ ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½ΡΡ ΠΊΠ°ΠΌΠ½ΡΡ . ΠΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΠ³ΠΎ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²Π° Π½Π° ΡΡΡΡΠΊΠΎΠΌ Π½Π°ΠΌ Π½Π΅ ΡΠ΄Π°Π»ΠΎΡΡ Π½Π°ΠΉΡΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΡ ΡΠ΅ΡΠΈΠ»ΠΈ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΡΡ ΡΡΠ°ΡΡΡ.
Molecule
Π£ΠΏΡΠΎΡΠ΅Π½Π½ΠΎΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅: ΠΠΎΠ»Π΅ΠΊΡΠ»Π° ΡΠΎΠ·Π΄Π°ΡΡ ΠΈΠ½ΡΡΠ°Π½Ρ Π½Π° ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π²Π°ΠΌΠΈ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ΅ (ΠΎΠ±Π»Π°ΠΊΠΎ, Π²ΠΈΡΡΡΠ°Π»ΠΊΠ°, ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ; ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ ΡΠΌ. ΡΠ°Π·Π΄Π΅Π»
Π’Π΅ΠΏΠ΅ΡΡ ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅.
ΠΠ΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ΅ΠΎΡΠΈΠΈ
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ Π΄Π²Π΅ ΠΊΠ»ΡΡΠ΅Π²ΡΠ΅ ΡΡΡΠ½ΠΎΡΡΠΈ ΠΠΎΠ»Π΅ΠΊΡΠ»Ρ: Scenario ΠΈ Driver.
Scenario
Π‘ΡΠ΅Π½Π°ΡΠΈΠΉ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π² ΡΠ΅Π±Π΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΠΎΠ³ΠΎ, ΡΡΠΎ, Π³Π΄Π΅, ΠΊΠ°ΠΊ ΠΈ Π² ΠΊΠ°ΠΊΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΎ. Π£ ΠΎΠ΄Π½ΠΎΠΉ ΡΠΎΠ»ΠΈ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΠ΅Π½Π°ΡΠΈΠ΅Π², ΠΈ ΠΊΠ°ΠΆΠ΄ΡΠΉ β ΡΡΠΎ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ ΠΏΠΎ ΠΏΡΡΠΈ <role>/molecule/<scenario>
, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ°Ρ Π² ΡΠ΅Π±Π΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡΡ
Π΄Π»Ρ ΡΠ΅ΡΡΠ° Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ. ΠΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡΠΈΡΡΡΡΡΠ²ΠΎΠ²Π°ΡΡ ΡΡΠ΅Π½Π°ΡΠΈΠΉ default
, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠΎΠ·Π΄Π°Π½, Π΅ΡΠ»ΠΈ Π²Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΠ΅ ΡΠΎΠ»Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΠΎΠ»Π΅ΠΊΡΠ»Ρ. ΠΠΌΠ΅Π½Π° ΡΠ»Π΅Π΄ΡΡΡΠΈΡ
ΡΡΠ΅Π½Π°ΡΠΈΠ΅Π² Π²ΡΠ±ΠΈΡΠ°ΡΡΡΡ Π½Π° Π²Π°ΡΠ΅ ΡΡΠΌΠΎΡΡΠ΅Π½ΠΈΠ΅.
ΠΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π² ΡΡΠ΅Π½Π°ΡΠΈΠΈ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ matrix, ΠΈ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΎΠ½Π° ΡΠ°ΠΊΠΎΠ²Π°:
(Π¨Π°Π³ΠΈ, ΠΏΠΎΠΌΠ΅ΡΠ΅Π½Π½ΡΠ΅ ?
, ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΏΡΠΎΠΏΡΡΠΊΠ°ΡΡΡΡ, Π΅ΡΠ»ΠΈ Π½Π΅ ΠΎΠΏΠΈΡΠ°Π½Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ)
lint
β ΠΏΡΠΎΠ³ΠΎΠ½ Π»ΠΈΠ½ΡΠ΅ΡΠΎΠ². ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡyamllint
ΠΈflake8
,destroy
β ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΈΠ½ΡΡΠ°Π½ΡΠΎΠ² Ρ ΠΏΡΠΎΡΠ»ΠΎΠ³ΠΎ Π·Π°ΠΏΡΡΠΊΠ° ΠΠΎΠ»Π΅ΠΊΡΠ»Ρ (Π΅ΡΠ»ΠΈ ΠΎΡΡΠ°Π»ΠΈΡΡ),dependency
? β ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ansible-Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΡΠ΅ΡΡΠΈΡΡΠ΅ΠΌΠΎΠΉ ΡΠΎΠ»ΠΈ,syntax
β ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ° ΡΠΎΠ»ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡansible-playbook --syntax-check
,create
β ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈΠ½ΡΡΠ°Π½ΡΠ°,prepare
? β ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° ΠΈΠ½ΡΡΠ°Π½ΡΠ°; Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° / ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° python2converge
β Π·Π°ΠΏΡΡΠΊ ΡΠ΅ΡΡΠΈΡΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΏΠ»Π΅ΠΉΠ±ΡΠΊΠ°,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>
.
ΠΠΎΠ±Π°Π²ΠΈΡΡ ΡΠ°Π³ΠΈ Ρ ?
ΠΌΠΎΠΆΠ½ΠΎ, ΠΎΠΏΠΈΡΠ°Π² ΠΆΠ΅Π»Π°Π΅ΠΌΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Π² ΡΠΎΡΠΌΠ°ΡΠ΅ ansible-ΠΏΠ»Π΅ΠΉΠ±ΡΠΊΠ°, Π° ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π° ΡΠ΄Π΅Π»Π°ΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ ΡΠ°Π³Ρ: prepare.yml
/side_effect.yml
. ΠΠΆΠΈΠ΄Π°ΡΡ ΡΡΠΈ ΡΠ°ΠΉΠ»Ρ ΠΠΎΠ»Π΅ΠΊΡΠ»Π° Π±ΡΠ΄Π΅Ρ Π² ΠΏΠ°ΠΏΠΊΠ΅ ΡΡΠ΅Π½Π°ΡΠΈΡ.
Driver
ΠΡΠ°ΠΉΠ²Π΅Ρ β ΡΡΠΎ ΡΡΡΠ½ΠΎΡΡΡ, Π³Π΄Π΅ ΡΠΎΠ·Π΄Π°ΡΡΡΡ ΠΈΠ½ΡΡΠ°Π½ΡΡ Π΄Π»Ρ ΡΠ΅ΡΡΠΎΠ².
Π‘ΠΏΠΈΡΠΎΠΊ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ
Π΄ΡΠ°ΠΉΠ²Π΅ΡΠΎΠ², Π΄Π»Ρ ΠΊΠΎΡΠΎΡΡΡ
Ρ ΠΠΎΠ»Π΅ΠΊΡΠ»Ρ Π³ΠΎΡΠΎΠ²Ρ ΡΠ°Π±Π»ΠΎΠ½Ρ, ΡΠ°ΠΊΠΎΠ²: Azure, Docker, EC2, GCE, LXC, LXD, OpenStack, Vagrant, Delegated.
Π Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ ΡΠ»ΡΡΠ°Π΅Π² ΡΠ°Π±Π»ΠΎΠ½Ρ β ΡΡΠΎ ΡΠ°ΠΉΠ»Ρ create.yml
ΠΈ destroy.yml
Π² ΠΏΠ°ΠΏΠΊΠ΅ ΡΡΠ΅Π½Π°ΡΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠΏΠΈΡΡΠ²Π°ΡΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΈΠ½ΡΡΠ°Π½ΡΠ° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ.
ΠΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΎΡΡΠ°Π²Π»ΡΡΡ Docker ΠΈ Vagrant, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ ΠΈΡ
ΠΌΠΎΠ΄ΡΠ»ΡΠΌΠΈ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡΡ Π±Π΅Π· Π²ΡΡΠ΅ΡΠΏΠΎΠΌΡΠ½ΡΡΡΡ
ΡΠ°ΠΉΠ»ΠΎΠ².
Π‘ΡΠΎΠΈΡ Π²ΡΠ΄Π΅Π»ΠΈΡΡ Π΄ΡΠ°ΠΉΠ²Π΅Ρ Delegated, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π² ΡΠ»ΡΡΠ°Π΅ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π² ΡΠ°ΠΉΠ»Π°Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΠΈΠ½ΡΡΠ°Π½ΡΠ° ΠΎΠΏΠΈΡΠ°Π½Π° ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°Π±ΠΎΡΠ° Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠ΅ΠΉ ΠΈΠ½ΡΡΠ°Π½ΡΠΎΠ², ΠΎΡΡΠ°Π»ΡΠ½ΠΎΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠΏΠΈΡΠ°ΡΡ ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ.
ΠΡΠ°ΠΉΠ²Π΅ΡΠΎΠΌ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΡΠ²Π»ΡΠ΅ΡΡΡ Docker.
Π’Π΅ΠΏΠ΅ΡΡ ΠΏΠ΅ΡΠ΅ΠΉΠ΄ΡΠΌ ΠΊ ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅ ΠΈ Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠΈΠ΅ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠΈ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠ°ΠΌ.
ΠΠ°ΡΠ°Π»ΠΎ ΡΠ°Π±ΠΎΡΡ
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ «hello world» ΠΏΡΠΎΡΠ΅ΡΡΠΈΡΡΠ΅ΠΌ ΠΏΡΠΎΡΡΡΡ ΡΠΎΠ»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ 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
ΠΠΎΠ»ΡΡΠΈΠ»Π°ΡΡ ΡΠΈΠΏΠΈΡΠ½Π°Ρ ansible-ΡΠΎΠ»Ρ. ΠΠ°Π»Π΅Π΅ Π²ΡΠ΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ 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
(Π·Π°ΠΌΠ΅Π½ΠΈΠΌ ΡΠΎΠ»ΡΠΊΠΎ docker image):
---
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
dependency
ΠΡΠ° ΡΠ΅ΠΊΡΠΈΡ ΠΎΠΏΠΈΡΡΠ²Π°Π΅Ρ ΠΈΡΡΠΎΡΠ½ΠΈΠΊ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ.
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ Π²Π°ΡΠΈΠ°Π½ΡΡ:
Shell β ΡΡΠΎ ΠΏΡΠΎΡΡΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π½Π°Ρ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π² ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ galaxy ΠΈ gilt Π½Π΅ ΠΏΠΎΠΊΡΡΠ²Π°ΡΡ Π²Π°ΡΠΈΡ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎΡΡΠ΅ΠΉ.
ΠΠ΅ Π±ΡΠ΄Ρ Π·Π΄Π΅ΡΡ Π΄ΠΎΠ»Π³ΠΎ ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡΡΡ, Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΎ Π²
driver
ΠΠ°Π·Π²Π°Π½ΠΈΠ΅ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ°. Π£ Π½Π°Ρ ΡΡΠΎ docker.
lint
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π»ΠΈΠ½ΡΠ΅ΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ yamllint.
ΠΠΎΠ»Π΅Π·Π½ΡΠ΅ ΠΎΠΏΡΠΈΠΈ Π² Π΄Π°Π½Π½ΠΎΠΉ ΡΠ°ΡΡΠΈ ΠΊΠΎΠ½ΡΠΈΠ³Π° β ΡΡΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠΊΠ°Π·Π°ΡΡ ΡΠ°ΠΉΠ» ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π΄Π»Ρ yamllint, ΠΏΡΠΎΠ±ΡΠΎΡΠΈΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ Π»ΠΈΠ±ΠΎ ΠΎΡΠΊΠ»ΡΡΠΈΡΡ Π»ΠΈΠ½ΡΠ΅Ρ:
lint:
name: yamllint
options:
config-file: foo/bar
env:
FOO: bar
enabled: False
platforms
ΠΠΏΠΈΡΡΠ²Π°Π΅Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΈΠ½ΡΡΠ°Π½ΡΠΎΠ².
Π ΡΠ»ΡΡΠ°Π΅ Ρ Π΄ΠΎΠΊΠ΅ΡΠΎΠΌ Π² ΡΠΎΠ»ΠΈ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ°, ΠΠΎΠ»Π΅ΠΊΡΠ»Π° ΠΈΡΠ΅ΡΠΈΡΡΠ΅ΡΡΡ ΠΏΠΎ ΡΡΠΎΠΉ ΡΠ΅ΠΊΡΠΈΠΈ, ΠΈ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΡΠΏΠΈΡΠΊΠ° Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π² Dockerfile.j2
ΠΊΠ°ΠΊ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ item
.
Π ΡΠ»ΡΡΠ°Π΅ Ρ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠΎΠΌ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½Ρ create.yml
ΠΈ destroy.yml
, ΡΠ΅ΠΊΡΠΈΡ Π΄ΠΎΡΡΡΠΏΠ½Π° Π² Π½ΠΈΡ
ΠΊΠ°ΠΊ molecule_yml.platforms
, Π° ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΠΎ Π½Π΅ΠΉ ΠΎΠΏΠΈΡΠ°Π½Ρ ΡΠΆΠ΅ Π² ΡΡΠΈΡ
ΡΠ°ΠΉΠ»Π°Ρ
.
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΠΎΠ»Π΅ΠΊΡΠ»Π° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈΠ½ΡΡΠ°Π½ΡΠ°ΠΌΠΈ ansible-ΠΌΠΎΠ΄ΡΠ»ΡΠΌ, ΡΠΎ ΠΈ ΡΠΏΠΈΡΠΎΠΊ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ
Π½Π°ΡΡΡΠΎΠ΅ΠΊ Π½Π°Π΄ΠΎ ΠΈΡΠΊΠ°ΡΡ ΡΠ°ΠΌ. ΠΠ»Ρ Π΄ΠΎΠΊΠ΅ΡΠ°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΌΠΎΠ΄ΡΠ»Ρ
Π ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ
Π΄ΡΠ°ΠΉΠ²Π΅ΡΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ
ΠΠ°ΠΌΠ΅Π½ΠΈΠΌ Π·Π΄Π΅ΡΡ centos:7 Π½Π° ubuntu.
provisioner
«ΠΠΎΡΡΠ°Π²ΡΠΈΠΊ» β ΡΡΡΠ½ΠΎΡΡΡ, ΡΠΏΡΠ°Π²Π»ΡΡΡΠ°Ρ ΠΈΠ½ΡΡΠ°Π½ΡΠ°ΠΌΠΈ. Π ΡΠ»ΡΡΠ°Π΅ ΠΠΎΠ»Π΅ΠΊΡΠ»Ρ ΡΡΠΎ ansible, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° Π΄ΡΡΠ³ΠΈΡ
Π½Π΅ ΠΏΠ»Π°Π½ΠΈΡΡΠ΅ΡΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ ΡΡΡ ΡΠ΅ΠΊΡΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ Ρ ΠΎΠ³ΠΎΠ²ΠΎΡΠΊΠΎΠΉ Π½Π°Π·Π²Π°ΡΡ ΡΠ°ΡΡΠΈΡΠ΅Π½Π½ΠΎΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠ΅ΠΉ ansible.
ΠΠ΄Π΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅Π³ΠΎ, Π²ΡΠ΄Π΅Π»Ρ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅, Π½Π° ΠΌΠΎΠΉ Π²Π·Π³Π»ΡΠ΄, ΠΌΠΎΠΌΠ΅Π½ΡΡ:
- playbooks: ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΏΠ»Π΅ΠΉΠ±ΡΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π½Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΡ ΡΡΠ°Π΄ΠΈΡΡ .
provisioner:
name: ansible
playbooks:
create: create.yml
destroy: ../default/destroy.yml
converge: playbook.yml
side_effect: side_effect.yml
cleanup: cleanup.yml
- config_options:
ΠΊΠΎΠ½ΡΠΈΠ³ 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'"
- options: ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Ansible ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ
provisioner:
name: ansible
options:
vvv: true
diff: true
env:
FOO: BAR
scenario
ΠΠ°Π·Π²Π°Π½ΠΈΠ΅ ΠΈ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠ΅ΠΉ ΡΡΠ΅Π½Π°ΡΠΈΡ.
ΠΠ·ΠΌΠ΅Π½ΠΈΡΡ ΠΌΠ°ΡΡΠΈΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΌΠΎΠΆΠ½ΠΎ, Π΄ΠΎΠ±Π°Π²ΠΈΠ² ΠΊΠ»ΡΡ <command>_sequence
ΠΈ ΠΊΠ°ΠΊ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ Π½Π΅Π³ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠ² Π½ΡΠΆΠ½ΡΠΉ Π½Π°ΠΌ ΡΠΏΠΈΡΠΎΠΊ ΡΠ°Π³ΠΎΠ².
ΠΠΎΠΏΡΡΡΠΈΠΌ, ΠΌΡ Ρ
ΠΎΡΠΈΠΌ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΏΡΠΎΠ³ΠΎΠ½Π° ΠΏΠ»Π΅ΠΉΠ±ΡΠΊΠ°: molecule converge
# ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ:
# - dependency
# - create
# - prepare
# - converge
scenario:
name: default
converge_sequence:
- create
- converge
verifier
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ° Π΄Π»Ρ ΡΠ΅ΡΡΠΎΠ² ΠΈ Π»ΠΈΠ½ΡΠ΅ΡΠ° ΠΊ Π½Π΅ΠΌΡ. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π»ΠΈΠ½ΡΠ΅ΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ 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, ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ²Π΅Π»ΠΈΡΠΈΡΡ ΡΠΊΠΎΡΠΎΡΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ Π·Π° ΡΡΠ΅Ρ ΡΠΎΠΊΡΠ°ΡΠ΅Π½ΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π½Π° ΡΡΡΠ½ΠΎΠ΅ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ»Π΅ΠΉΠ±ΡΠΊΠΎΠ².
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° Π²Π°ΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅. ΠΡΠ»ΠΈ Ρ Π²Π°Ρ Π΅ΡΡΡ ΠΎΠΏΡΡ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ansible-ΡΠΎΠ»Π΅ΠΉ, ΠΈ ΠΎΠ½ Π½Π΅ ΡΠ²ΡΠ·Π°Π½ Ρ ΠΠΎΠ»Π΅ΠΊΡΠ»ΠΎΠΉ β ΡΠ°ΡΡΠΊΠ°ΠΆΠΈΡΠ΅ ΠΎ Π½Π΅ΠΌ Π² ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡ !
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com