Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ: ΠΊΠ°ΠΊ Π΄Π° тСстватС Π°Π½Π·ΠΈΠ±ΠΈΠ»Π½ΠΈ Ρ€ΠΎΠ»ΠΈ ΠΈ Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅Ρ‚Π΅ Π·Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈΡ‚Π΅ ΠΏΡ€Π΅Π΄ΠΈ производството

Π—Π΄Ρ€Π°Π²Π΅ΠΉΡ‚Π΅ Π½Π° всички!

Работя ΠΊΠ°Ρ‚ΠΎ DevOps ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€ Π² услуга Π·Π° хотСлски Ρ€Π΅Π·Π΅Ρ€Π²Π°Ρ†ΠΈΠΈ. Ostrovok.ru. Π’ Ρ‚Π°Π·ΠΈ статия искам Π΄Π° говоря Π·Π° нашия ΠΎΠΏΠΈΡ‚ Π² тСстванСто Π½Π° Π°Π½Π·ΠΈΠ±ΠΈΠ»Π½ΠΈ Ρ€ΠΎΠ»ΠΈ.

Π’ Ostrovok.ru ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ansible ΠΊΠ°Ρ‚ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π΅Π½ ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡŠΡ€. Наскоро стигнахмС Π΄ΠΎ нСобходимостта Π΄Π° тСствамС Ρ€ΠΎΠ»ΠΈ, Π½ΠΎ ΠΊΠ°ΠΊΡ‚ΠΎ сС ΠΎΠΊΠ°Π·Π°, няма Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π° ΠΌΠ½ΠΎΠ³ΠΎ инструмСнти Π·Π° Ρ‚ΠΎΠ²Π° - Π½Π°ΠΉ-популярният ΠΌΠΎΠΆΠ΅ Π±ΠΈ Π΅ Molecule framework, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ Ρ€Π΅ΡˆΠΈΡ…ΠΌΠ΅ Π΄Π° Π³ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅. Но сС ΠΎΠΊΠ°Π·Π°, Ρ‡Π΅ докумСнтацията ΠΌΡƒ ΠΌΡŠΠ»Ρ‡ΠΈ Π·Π° ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½ΠΈ камъни. НС успяхмС Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈΠΌ Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Ρ€ΡŠΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΠΎ Π½Π° руски, Π·Π°Ρ‚ΠΎΠ²Π° Ρ€Π΅ΡˆΠΈΡ…ΠΌΠ΅ Π΄Π° напишСм Ρ‚Π°Π·ΠΈ статия.

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ: ΠΊΠ°ΠΊ Π΄Π° тСстватС Π°Π½Π·ΠΈΠ±ΠΈΠ»Π½ΠΈ Ρ€ΠΎΠ»ΠΈ ΠΈ Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅Ρ‚Π΅ Π·Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈΡ‚Π΅ ΠΏΡ€Π΅Π΄ΠΈ производството

ΠΌΠΎΠ»Π΅ΠΊΡƒΠ»Π°

ΠœΠΎΠ»Π΅ΠΊΡƒΠ»Π° - Ρ€Π°ΠΌΠΊΠ° Π·Π° ΠΏΠΎΠ΄ΠΏΠΎΠΌΠ°Π³Π°Π½Π΅ Π½Π° тСстванСто Π½Π° нСвъзмоТни Ρ€ΠΎΠ»ΠΈ.

ΠžΠΏΡ€ΠΎΡΡ‚Π΅Π½ΠΎ описаниС: ΠœΠΎΠ»Π΅ΠΊΡƒΠ»Π°Ρ‚Π° създава СкзСмпляр Π½Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°, която посочитС (ΠΎΠ±Π»Π°ΠΊ, Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π° машина, ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€; Π·Π° ΠΏΠΎΠ²Π΅Ρ‡Π΅ подробности Π²ΠΈΠΆΡ‚Π΅ Ρ€Π°Π·Π΄Π΅Π»Π° Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€), изпълнява Π²Π°ΡˆΠ°Ρ‚Π° роля Π²ΡŠΡ€Ρ…Ρƒ Π½Π΅Π³ΠΎ, слСд ΠΊΠΎΠ΅Ρ‚ΠΎ изпълнява тСстовС ΠΈ ΠΈΠ·Ρ‚Ρ€ΠΈΠ²Π° СкзСмпляра. Π’ случай Π½Π° нСуспСх Π½Π° Π΅Π΄Π½Π° ΠΎΡ‚ ΡΡ‚ΡŠΠΏΠΊΠΈΡ‚Π΅, ΠœΠΎΠ»Π΅ΠΊΡƒΠ»Π°Ρ‚Π° Ρ‰Π΅ Π²ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠΈΡ€Π° Π·Π° Ρ‚ΠΎΠ²Π°.

Π‘Π΅Π³Π° ΠΏΠΎΠ²Π΅Ρ‡Π΅.

Малко тСория

ΠŸΠΎΠΌΠΈΡΠ»Π΅Ρ‚Π΅ Π·Π° Π΄Π²Π΅ ΠΊΠ»ΡŽΡ‡ΠΎΠ²ΠΈ Π΅Π΄ΠΈΠ½ΠΈΡ†ΠΈ Π½Π° ΠΌΠΎΠ»Π΅ΠΊΡƒΠ»Π°Ρ‚Π°: сцСнарий ΠΈ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€.

Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΉ

Π‘ΠΊΡ€ΠΈΠΏΡ‚ΡŠΡ‚ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° описаниС ΠΊΠ°ΠΊΠ²ΠΎ, къдС, ΠΊΠ°ΠΊ ΠΈ Π² ΠΊΠ°ΠΊΠ²Π° послСдоватСлност Ρ‰Π΅ сС изпълнява. Π•Π΄Π½Π° роля ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° няколко скрипта ΠΈ всСки ΠΎΡ‚ тях Π΅ дирСктория ΠΏΠΎ ΠΏΡŠΡ‚Ρ <role>/molecule/<scenario>, ΠΊΠΎΠΉΡ‚ΠΎ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° описаниС Π½Π° дСйствията, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈ Π·Π° тСста. Π‘ΠΊΡ€ΠΈΠΏΡ‚ΡŠΡ‚ трябва Π΄Π° бъдС Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ default, ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ бъдС създадСн Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ, Π°ΠΊΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€Π°Ρ‚Π΅ ролята с Molecule. Π˜ΠΌΠ΅Π½Π°Ρ‚Π° Π½Π° слСднитС скриптовС зависят ΠΎΡ‚ вас.

Извиква сС послСдоватСлността ΠΎΡ‚ тСстови дСйствия Π² скрипт ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°ΠΈ ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ Π΅:

(Π‘Ρ‚ΡŠΠΏΠΊΠΈΡ‚Π΅ са ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈ ?, пропуска сС ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅, Π°ΠΊΠΎ Π½Π΅ Π΅ посочСно ΠΎΡ‚ потрСбитСля)

  • lint - Ρ‚Π΅Ρ‡Π°Ρ‰ΠΈ Π»ΠΈΠ½Ρ‚Π΅Ρ€ΠΈ. По ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ yamllint ΠΈ flake8,
  • destroy - ΠΈΠ·Ρ‚Ρ€ΠΈΠ²Π°Π½Π΅ Π½Π° СкзСмпляри ΠΎΡ‚ послСдното стартиранС Π½Π° Molecule (Π°ΠΊΠΎ ΠΈΠΌΠ° Ρ‚Π°ΠΊΠΈΠ²Π°),
  • dependency? β€” инсталиранС Π½Π° Π°Π½Π·ΠΈΠ±ΠΈΠ»Π½Π°Ρ‚Π° зависимост Π½Π° тСстваната роля,
  • syntax - ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° синтаксиса Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π°Ρ‚Π° роля ansible-playbook --syntax-check,
  • create - създаванС Π½Π° СкзСмпляр,
  • prepare? β€” ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° Π½Π° инстанцията; Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Ρ‚Π΅/инсталирайтС python2
  • converge β€” стартиранС Π½Π° тСстваната ΠΊΠ½ΠΈΠ³Π° Π·Π° ΠΈΠ³Ρ€ΠΈ,
  • idempotence - рСстартиранС Π½Π° ΠΊΠ½ΠΈΠ³Π°Ρ‚Π° Π·Π° тСста Π·Π° идСмпотСнтност,
  • side_effect? - дСйствия, ΠΊΠΎΠΈΡ‚ΠΎ Π½Π΅ са пряко ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈ с ролята, Π½ΠΎ са Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈ Π·Π° тСстовС,
  • verify - ΠΏΡ€ΠΎΠ²Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° тСстовС Π½Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π°Ρ‚Π° конфигурация с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° testinfra(ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅) /goss/inspec,
  • cleanup? - (Π² Π½ΠΎΠ²ΠΈΡ‚Π΅ вСрсии) - Π³Ρ€ΡƒΠ±ΠΎ ΠΊΠ°Π·Π°Π½ΠΎ, "почистванС" Π½Π° Π²ΡŠΠ½ΡˆΠ½Π°Ρ‚Π° инфраструктура, засСгната ΠΎΡ‚ ΠœΠΎΠ»Π΅ΠΊΡƒΠ»Π°Ρ‚Π°,
  • destroy - Π˜Π·Ρ‚Ρ€ΠΈΠ²Π°Π½Π΅ Π½Π° СкзСмпляр.

Π’Π°Π·ΠΈ послСдоватСлност ΠΎΠ±Ρ…Π²Π°Ρ‰Π° ΠΏΠΎΠ²Π΅Ρ‡Π΅Ρ‚ΠΎ случаи, Π½ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅Π½Π°, Π°ΠΊΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ.

Всяка ΠΎΡ‚ Π³ΠΎΡ€Π½ΠΈΡ‚Π΅ ΡΡ‚ΡŠΠΏΠΊΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° сС изпълнява ΠΎΡ‚Π΄Π΅Π»Π½ΠΎ с molecule <command>. Но трябва Π΄Π° сС Ρ€Π°Π·Π±Π΅Ρ€Π΅, Ρ‡Π΅ Π·Π° всяка Ρ‚Π°ΠΊΠ°Π²Π° cli-ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° своя собствСна послСдоватСлност ΠΎΡ‚ дСйствия, ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅Ρ‚Π΅, ΠΊΠ°Ρ‚ΠΎ ΠΈΠ·ΠΏΡŠΠ»Π½ΠΈΡ‚Π΅ molecule matrix <command>. НапримСр, ΠΊΠΎΠ³Π°Ρ‚ΠΎ ΠΈΠ·ΠΏΡŠΠ»Π½ΡΠ²Π°Ρ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° converge (пусканС Π½Π° тСстваната ΠΊΠ½ΠΈΠ³Π° Π·Π° ΠΈΠ³Ρ€Π°), Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ ΠΈΠ·Π²ΡŠΡ€ΡˆΠ΅Π½ΠΈ слСднитС дСйствия:

$ molecule matrix converge
...
└── default         # Π½Π°Π·Π²Π°Π½ΠΈΠ΅ сцСнария
    β”œβ”€β”€ dependency  # установка зависимостСй
    β”œβ”€β”€ create      # созданиС инстанса
    β”œβ”€β”€ prepare     # прСднастройка инстанса
    └── converge    # ΠΏΡ€ΠΎΠ³ΠΎΠ½ ΠΏΠ»Π΅ΠΉΠ±ΡƒΠΊΠ°

ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»Π½ΠΎΡΡ‚Ρ‚Π° Π½Π° Ρ‚Π΅Π·ΠΈ дСйствия ΠΌΠΎΠΆΠ΅ Π΄Π° сС Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€Π°. Ако Π½Π΅Ρ‰ΠΎ ΠΎΡ‚ списъка Π²Π΅Ρ‡Π΅ Π΅ Π½Π°ΠΏΡ€Π°Π²Π΅Π½ΠΎ, Ρ‚ΠΎ Ρ‰Π΅ бъдС пропуснато. Π’Π΅ΠΊΡƒΡ‰ΠΎΡ‚ΠΎ ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅, ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ конфигурацията Π½Π° СкзСмпляритС, Molecule ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π° Π² дирСкторията $TMPDIR/molecule/<role>/<scenario>.

Π”ΠΎΠ±Π°Π²Π΅Ρ‚Π΅ ΡΡ‚ΡŠΠΏΠΊΠΈ с ? ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΎΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΠΆΠ΅Π»Π°Π½ΠΈΡ‚Π΅ дСйствия във Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π½Π° ansible-playbook ΠΈ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° Ρ„Π°ΠΉΠ»Π° спорСд ΡΡ‚ΡŠΠΏΠΊΠ°Ρ‚Π°: prepare.yml/side_effect.yml. ΠžΡ‡Π°ΠΊΠ²Π°ΠΉΡ‚Π΅ Ρ‚Π΅Π·ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅. ΠœΠΎΠ»Π΅ΠΊΡƒΠ»Π°Ρ‚Π° Ρ‰Π΅ бъдС Π² ΠΏΠ°ΠΏΠΊΠ°Ρ‚Π° Π½Π° скрипта.

Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€

Π”Ρ€Π°ΠΉΠ²Π΅Ρ€ΡŠΡ‚ Π΅ ΠΎΠ±Π΅ΠΊΡ‚, Π² ΠΊΠΎΠΉΡ‚ΠΎ сС ΡΡŠΠ·Π΄Π°Π²Π°Ρ‚ тСстови СкзСмпляри.
Π‘ΠΏΠΈΡΡŠΠΊΡŠΡ‚ със стандартни Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΈ, Π·Π° ΠΊΠΎΠΈΡ‚ΠΎ 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 ΠΌΠΎΠ»Π΅ΠΊΡƒΠ»ΠΈ сС правят ΠΎΡ‚ ΠΊΠΎΡ€Π΅Π½Π° Π½Π° ролята.

Π”Π° Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊΠ²ΠΎ ΠΈΠΌΠ° Π² дирСкторията Π½Π° Ρ€ΠΎΠ»ΠΈΡ‚Π΅:

> 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

зависимостта

Π’ΠΎΠ·ΠΈ Ρ€Π°Π·Π΄Π΅Π» описва ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊΠ° Π½Π° зависимости.

Π’ΡŠΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΈ: Π³Π°Π»Π°ΠΊΡ‚ΠΈΠΊΠ°, ΠΏΡ€ΠΈΠ»Π°Π³Π°, Ρ‡Π΅Ρ€ΡƒΠΏΠΊΠ°.

Shell Π΅ просто ΠΊΠΎΠΌΠ°Π½Π΄Π½Π° ΠΎΠ±Π²ΠΈΠ²ΠΊΠ°, която сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π² случай, Ρ‡Π΅ galaxy ΠΈ gilt Π½Π΅ ΠΏΠΎΠΊΡ€ΠΈΠ²Π°Ρ‚ Π²Π°ΡˆΠΈΡ‚Π΅ Π½ΡƒΠΆΠ΄ΠΈ.

Няма Π΄Π° сС спирам Ρ‚ΡƒΠΊ дълго, Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ Π΅ описано Π² докумСнтация.

ΡˆΠΎΡ„ΡŒΠΎΡ€

Π˜ΠΌΠ΅Ρ‚ΠΎ Π½Π° Π²ΠΎΠ΄Π°Ρ‡Π°. ΠΠ°ΡˆΠΈΡΡ‚ Π΅ Π΄ΠΎΠΊΠ΅Ρ€.

марля

Π›ΠΈΠ½Ρ‚Π΅Ρ€ΡŠΡ‚ Π΅ ямлинт.

ПолСзни ΠΎΠΏΡ†ΠΈΠΈ Π² Ρ‚Π°Π·ΠΈ част ΠΎΡ‚ конфигурацията са Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚Ρ‚Π° Π·Π° ΡƒΠΊΠ°Π·Π²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π΅Π½ Ρ„Π°ΠΉΠ» Π·Π° yamllint, ΠΏΡ€Π΅ΠΏΡ€Π°Ρ‰Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π½Π° срСдата ΠΈΠ»ΠΈ Π΄Π΅Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°Π½Π΅ Π½Π° Π»ΠΈΠ½Ρ‚Π΅Ρ€Π°:

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

ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠΈ

Описва конфигурацията Π½Π° СкзСмпляритС.
Π’ случай Π½Π° Π΄ΠΎΠΊΠ΅Ρ€ ΠΊΠ°Ρ‚ΠΎ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€, Molecule сС повтаря ΠΏΡ€Π΅Π· Ρ‚ΠΎΠ·ΠΈ Ρ€Π°Π·Π΄Π΅Π» ΠΈ всСки Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ ΠΎΡ‚ списъка Π΅ Π΄ΠΎΡΡ‚ΡŠΠΏΠ΅Π½ Π² Dockerfile.j2 ΠΊΠ°Ρ‚ΠΎ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° item.

Π’ случай Π½Π° Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€, ΠΊΠΎΠΉΡ‚ΠΎ изисква create.yml ΠΈ destroy.yml, сСкцията Π΅ Π½Π°Π»ΠΈΡ‡Π½Π° Π² тях ΠΊΠ°Ρ‚ΠΎ molecule_yml.platformsΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈΡ‚Π΅ Π½Π°Π΄ Π½Π΅Π³ΠΎ Π²Π΅Ρ‡Π΅ са описани Π² Ρ‚Π΅Π·ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅.

Въй ΠΊΠ°Ρ‚ΠΎ Molecule прСдоставя ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ» Π½Π° СкзСмпляри Π½Π° ansible ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, ΡΠΏΠΈΡΡŠΠΊΡŠΡ‚ с възмоТни настройки ΡΡŠΡ‰ΠΎ трябва Π΄Π° сС Ρ‚ΡŠΡ€ΡΠΈ Ρ‚Π°ΠΌ. Π—Π° Π΄ΠΎΠΊΠ΅Ρ€ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΌΠΎΠ΄ΡƒΠ»ΡŠΡ‚ docker_container_module. Кои ΠΌΠΎΠ΄ΡƒΠ»ΠΈ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Π² Π΄Ρ€ΡƒΠ³ΠΈ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΈ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ Π½Π°ΠΌΠ΅Ρ€Π΅Π½ΠΈ Π² докумСнтация.

ΠšΠ°ΠΊΡ‚ΠΎ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΈ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ Π½Π°ΠΌΠ΅Ρ€Π΅Π½ΠΈ Π² тСстовСтС Π½Π° самата ΠœΠΎΠ»Π΅ΠΊΡƒΠ»Π°.

Π—Π°ΠΌΠ΅Π½Π΅Ρ‚Π΅ Ρ‚ΡƒΠΊ Ρ†Π΅Π½Ρ‚ΠΎ:7 Π½Π° Ubuntu.

доставчик

"Доставчик" - субСкт, ΠΊΠΎΠΉΡ‚ΠΎ управлява СкзСмпляри. Π’ случая Π½Π° Molecule Ρ‚ΠΎΠ²Π° Π΅ 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

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

  • ΠΎΠΏΡ†ΠΈΠΈ: Ansible ΠΎΠΏΡ†ΠΈΠΈ ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π½Π° срСдата

provisioner:
  name: ansible  
  options:
    vvv: true
    diff: true
  env:
    FOO: BAR

сцСнарий

ИмС ΠΈ описаниС Π½Π° послСдоватСлности ΠΎΡ‚ скриптовС.
ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°Ρ‚Π° Π½Π° дСйствиС ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ Π½Π° всяка ΠΊΠΎΠΌΠ°Π½Π΄Π°, ΠΊΠ°Ρ‚ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚Π΅ ΠΊΠ»ΡŽΡ‡Π° <command>_sequence ΠΈ ΠΊΠ°Ρ‚ΠΎ стойност Π·Π° Π½Π΅Π³ΠΎ, ΠΊΠ°Ρ‚ΠΎ Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°ΠΌΠ΅ списъка ΠΎΡ‚ ΡΡ‚ΡŠΠΏΠΊΠΈ, ΠΎΡ‚ ΠΊΠΎΠΈΡ‚ΠΎ сС Π½ΡƒΠΆΠ΄Π°Π΅ΠΌ.
Π”Π° ΠΊΠ°ΠΆΠ΅ΠΌ, Ρ‡Π΅ искамС Π΄Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΠΌ послСдоватСлността ΠΎΡ‚ дСйствия, ΠΊΠΎΠ³Π°Ρ‚ΠΎ изпълнявамС ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° Π·Π° изпълнСниС Π½Π° ΠΊΠ½ΠΈΠ³Π°Ρ‚Π°: molecule converge

# ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ:
# - dependency
# - create
# - prepare
# - converge
scenario:
  name: default
  converge_sequence:
    - create
    - converge

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ²Π°Ρ‰ΠΈΡΡ‚

БъздаванС Π½Π° Ρ€Π°ΠΌΠΊΠ° Π·Π° тСстовС ΠΈ Π»ΠΈΠ½Ρ‚Π΅Ρ€ към нСя. Π›ΠΈΠ½Ρ‚Π΅Ρ€ΡŠΡ‚ ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ Π΅ testinfra ΠΈ flake8. Π’ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΈΡ‚Π΅ ΠΎΠΏΡ†ΠΈΠΈ са ΡΡŠΡ‰ΠΈΡ‚Π΅ ΠΊΠ°Ρ‚ΠΎ ΠΏΠΎ-Π³ΠΎΡ€Π΅:

verifier:
  name: testinfra
  additional_files_or_dirs:
    - ../path/to/test_1.py
    - ../path/to/test_2.py
    - ../path/to/directory/*
  options:
    n: 1
  enabled: False
  env:
    FOO: bar
  lint:
    name: flake8
    options:
      benchmark: True
    enabled: False
    env:
      FOO: bar

Π”Π° сС β€‹β€‹Π²ΡŠΡ€Π½Π΅ΠΌ към Π½Π°ΡˆΠ°Ρ‚Π° роля. Π”Π° Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€Π°ΠΌΠ΅ Ρ„Π°ΠΉΠ»Π° tasks/main.yml към Ρ‚ΠΎΠ·ΠΈ Π²ΠΈΠ΄:

---
- name: Install nginx
  apt:
    name: nginx
    state: present

- name: Start nginx
  service:
    name: nginx
    state: started

И Π΄ΠΎΠ±Π°Π²Π΅Ρ‚Π΅ тСстовС към molecule/default/tests/test_default.py

def test_nginx_is_installed(host):
    nginx = host.package("nginx")
    assert nginx.is_installed

def test_nginx_running_and_enabled(host):
    nginx = host.service("nginx")
    assert nginx.is_running
    assert nginx.is_enabled

def test_nginx_config(host):
    host.run("nginx -t")

Π“ΠΎΡ‚ΠΎΠ²ΠΎ, остава само Π΄Π° стартиратС (ΠΎΡ‚ ΠΊΠΎΡ€Π΅Π½Π° Π½Π° ролята, Π½Π΅ΠΊΠ° Π²ΠΈ напомня):

> molecule test

Π”ΡŠΠ»ΡŠΠ³ ауспух ΠΏΠΎΠ΄ спойлСра:

--> Validating schema <path>/nginx/molecule/default/molecule.yml.
Validation completed successfully.
--> Test matrix

└── default
    β”œβ”€β”€ lint
    β”œβ”€β”€ destroy
    β”œβ”€β”€ dependency
    β”œβ”€β”€ syntax
    β”œβ”€β”€ create
    β”œβ”€β”€ prepare
    β”œβ”€β”€ converge
    β”œβ”€β”€ idempotence
    β”œβ”€β”€ side_effect
    β”œβ”€β”€ verify
    └── destroy

--> Scenario: 'default'
--> Action: 'lint'
--> Executing Yamllint on files found in <path>/nginx/...
Lint completed successfully.
--> Executing Flake8 on files found in <path>/nginx/molecule/default/tests/...
Lint completed successfully.
--> Executing Ansible Lint on <path>/nginx/molecule/default/playbook.yml...
Lint completed successfully.
--> Scenario: 'default'
--> Action: 'destroy'

    PLAY [Destroy] *****************************************************************

    TASK [Destroy molecule instance(s)] ********************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Wait for instance(s) deletion to complete] *******************************
    ok: [localhost] => (item=None)
    ok: [localhost]

    TASK [Delete docker network(s)] ************************************************

    PLAY RECAP *********************************************************************
    localhost                  : ok=2    changed=1    unreachable=0    failed=0

--> Scenario: 'default'
--> Action: 'dependency'
Skipping, missing the requirements file.
--> Scenario: 'default'
--> Action: 'syntax'

    playbook: <path>/nginx/molecule/default/playbook.yml

--> Scenario: 'default'
--> Action: 'create'

    PLAY [Create] ******************************************************************

    TASK [Log into a Docker registry] **********************************************
    skipping: [localhost] => (item=None)

    TASK [Create Dockerfiles from image names] *************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Discover local Docker images] ********************************************
    ok: [localhost] => (item=None)
    ok: [localhost]

    TASK [Build an Ansible compatible image] ***************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Create docker network(s)] ************************************************

    TASK [Create molecule instance(s)] *********************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Wait for instance(s) creation to complete] *******************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    PLAY RECAP *********************************************************************
    localhost                  : ok=5    changed=4    unreachable=0    failed=0

--> Scenario: 'default'
--> Action: 'prepare'
Skipping, prepare playbook not configured.
--> Scenario: 'default'
--> Action: 'converge'

    PLAY [Converge] ****************************************************************

    TASK [Gathering Facts] *********************************************************
    ok: [instance]

    TASK [nginx : Install nginx] ***************************************************
    changed: [instance]

    TASK [nginx : Start nginx] *****************************************************
    changed: [instance]

    PLAY RECAP *********************************************************************
    instance                   : ok=3    changed=2    unreachable=0    failed=0

--> Scenario: 'default'
--> Action: 'idempotence'
Idempotence completed successfully.
--> Scenario: 'default'
--> Action: 'side_effect'
Skipping, side effect playbook not configured.
--> Scenario: 'default'
--> Action: 'verify'
--> Executing Testinfra tests found in <path>/nginx/molecule/default/tests/...
    ============================= test session starts ==============================
    platform darwin -- Python 2.7.15, pytest-4.3.0, py-1.8.0, pluggy-0.9.0
    rootdir: <path>/nginx/molecule/default, inifile:
    plugins: testinfra-1.16.0
collected 4 items

    tests/test_default.py ....                                               [100%]

    ========================== 4 passed in 27.23 seconds ===========================
Verifier completed successfully.
--> Scenario: 'default'
--> Action: 'destroy'

    PLAY [Destroy] *****************************************************************

    TASK [Destroy molecule instance(s)] ********************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Wait for instance(s) deletion to complete] *******************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Delete docker network(s)] ************************************************

    PLAY RECAP *********************************************************************
    localhost                  : ok=2    changed=2    unreachable=0    failed=0

ΠΠ°ΡˆΠ°Ρ‚Π° проста роля бСшС тСствана Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ.
Π‘Ρ‚Ρ€ΡƒΠ²Π° си Π΄Π° Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Π΅ Π°ΠΊΠΎ ΠΈΠΌΠ° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° molecule test, Ρ‚ΠΎΠ³Π°Π²Π° Π°ΠΊΠΎ Π½Π΅ стС ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΠ»ΠΈ послСдоватСлността ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅, Molecule Ρ‰Π΅ ΠΈΠ·Ρ‚Ρ€ΠΈΠ΅ СкзСмпляра.

Π‘Π»Π΅Π΄Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ са ΠΏΠΎΠ»Π΅Π·Π½ΠΈ Π·Π° отстраняванС Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ:

> molecule --debug <command> # debug info. ΠŸΡ€ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ запускС ΠœΠΎΠ»Π΅ΠΊΡƒΠ»Π° скрываСт Π»ΠΎΠ³ΠΈ.
> molecule converge          # ΠžΡΡ‚Π°Π²Π»ΡΠ΅Ρ‚ инстанс послС ΠΏΡ€ΠΎΠ³ΠΎΠ½Π° тСстируСмой Ρ€ΠΎΠ»ΠΈ.
> molecule login             # Π—Π°ΠΉΡ‚ΠΈ Π² созданный инстанс.
> molecule --help            # ΠŸΠΎΠ»Π½Ρ‹ΠΉ список ΠΊΠΎΠΌΠ°Π½Π΄.

Π‘ΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‰Π° роля

ДобавянСто Π½Π° Π½ΠΎΠ² скрипт към ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‰Π° роля Π΅ ΠΎΡ‚ дирСкторията Π½Π° Ρ€ΠΎΠ»ΠΈΡ‚Π΅ със слСднитС ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ:

# ΠΏΠΎΠ»Π½Ρ‹ΠΉ список доступных ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²
> molecule init scenarion --help
# созданиС Π½ΠΎΠ²ΠΎΠ³ΠΎ сцСнария
> molecule init scenario -r <role_name> -s <scenario_name>

Π’ случай, Ρ‡Π΅ Ρ‚ΠΎΠ²Π° Π΅ ΠΏΡŠΡ€Π²ΠΈΡΡ‚ сцСнарий Π² ролята, Ρ‚ΠΎΠ³Π°Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€ΡŠΡ‚ -s ΠΌΠΎΠΆΠ΅ Π΄Π° сС пропуснС, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Ρ‰Π΅ създадС скрипт default.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

ΠšΠ°ΠΊΡ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅, Molecule Π½Π΅ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ слоТСн ΠΈ Ρ‡Ρ€Π΅Π· ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ваши собствСни шаблони внСдряванСто Π½Π° Π½ΠΎΠ² скрипт ΠΌΠΎΠΆΠ΅ Π΄Π° сС свСдС Π΄ΠΎ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π² ΠΊΠ½ΠΈΠ³ΠΈΡ‚Π΅ Π·Π° създаванС ΠΈ ΠΈΠ·Ρ‚Ρ€ΠΈΠ²Π°Π½Π΅ Π½Π° СкзСмпляри. ΠœΠΎΠ»Π΅ΠΊΡƒΠ»Π°Ρ‚Π° сС ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€Π° Π±Π΅Π·ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½ΠΎ с CI систСми, ΠΊΠΎΠ΅Ρ‚ΠΎ Π²ΠΈ позволява Π΄Π° ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚Π΅ скоростта Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Ρ‡Ρ€Π΅Π· намаляванС Π½Π° Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π·Π° Ρ€ΡŠΡ‡Π½ΠΎ тСстванС Π½Π° ΠΊΠ½ΠΈΠ³ΠΈΡ‚Π΅ Π·Π° ΠΈΠ³Ρ€ΠΈ.

Благодаря Π·Π° Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅Ρ‚ΠΎ. Ако ΠΈΠΌΠ°Ρ‚Π΅ ΠΎΠΏΠΈΡ‚ Π² тСстванСто Π½Π° Π°Π½Π·ΠΈΠ±ΠΈΠ»Π½ΠΈ Ρ€ΠΎΠ»ΠΈ ΠΈ Ρ‚ΠΎΠ²Π° Π½Π΅ Π΅ ΡΠ²ΡŠΡ€Π·Π°Π½ΠΎ с Molecule, Ρ€Π°Π·ΠΊΠ°ΠΆΠ΅Ρ‚Π΅ Π½ΠΈ Π·Π° Ρ‚ΠΎΠ²Π° Π² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΡ‚Π΅!

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: www.habr.com

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€