Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ: ΠΊΠ°ΠΊ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ansible-Ρ€ΠΎΠ»ΠΈ ΠΈ ΡƒΠ·Π½Π°Π²Π°Ρ‚ΡŒ ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°Ρ… Π΄ΠΎ ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½Π°

ВсСм ΠΏΡ€ΠΈΠ²Π΅Ρ‚!

Π― Ρ€Π°Π±ΠΎΡ‚Π°ΡŽ DevOps-ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€ΠΎΠΌ Π² сСрвисС бронирования ΠΎΡ‚Π΅Π»Π΅ΠΉ Ostrovok.ru. Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ я Ρ…ΠΎΡ‡Ρƒ Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎ нашСм ΠΎΠΏΡ‹Ρ‚Π΅ тСстирования ansible-Ρ€ΠΎΠ»Π΅ΠΉ.

Π’ Ostrovok.ru Π² качСствС ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ansible. НСдавно ΠΌΡ‹ ΠΏΡ€ΠΈΡˆΠ»ΠΈ ΠΊ нСобходимости тСстирования Ρ€ΠΎΠ»Π΅ΠΉ, Π½ΠΎ, ΠΊΠ°ΠΊ оказалось, инструмСнтов для этого сущСствуСт Π½Π΅ Ρ‚Π°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ β€” самым популярным, ΠΏΠΎΠΆΠ°Π»ΡƒΠΉ, являСтся Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ Molecule, поэтому ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ. Но оказалось, Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ докумСнтация ΡƒΠΌΠ°Π»Ρ‡ΠΈΠ²Π°Π΅Ρ‚ ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹Ρ… камнях. Достаточно ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ³ΠΎ руководства Π½Π° русском Π½Π°ΠΌ Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ Π½Π°ΠΉΡ‚ΠΈ, поэтому ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ эту ΡΡ‚Π°Ρ‚ΡŒΡŽ.

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ: ΠΊΠ°ΠΊ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ansible-Ρ€ΠΎΠ»ΠΈ ΠΈ ΡƒΠ·Π½Π°Π²Π°Ρ‚ΡŒ ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°Ρ… Π΄ΠΎ ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½Π°

Molecule

ΠœΠΎΠ»Π΅ΠΊΡƒΠ»Π° β€” Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ для ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π² тСстировании ansible-Ρ€ΠΎΠ»Π΅ΠΉ.

Π£ΠΏΡ€ΠΎΡ‰Π΅Π½Π½ΠΎΠ΅ описаниС: ΠœΠΎΠ»Π΅ΠΊΡƒΠ»Π° создаёт инстанс Π½Π° ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π²Π°ΠΌΠΈ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅ (ΠΎΠ±Π»Π°ΠΊΠΎ, Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΠΊΠ°, ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€; ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ см. Ρ€Π°Π·Π΄Π΅Π» Driver), прогоняСт Π½Π° Π½Ρ‘ΠΌ Π²Π°ΡˆΡƒ Ρ€ΠΎΠ»ΡŒ, Π·Π°Ρ‚Π΅ΠΌ запускаСт тСсты ΠΈ удаляСт инстанс. Π’ случаС возникновСния Π½Π΅ΡƒΠ΄Π°Ρ‡ΠΈ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· шагов, ΠœΠΎΠ»Π΅ΠΊΡƒΠ»Π° сообщит Π²Π°ΠΌ ΠΎΠ± этом.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅.

НСмного Ρ‚Π΅ΠΎΡ€ΠΈΠΈ

Рассмотрим Π΄Π²Π΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ сущности ΠœΠΎΠ»Π΅ΠΊΡƒΠ»Ρ‹: Scenario ΠΈ Driver.

Scenario

Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΉ содСрТит Π² сСбС описаниС Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ, Π³Π΄Π΅, ΠΊΠ°ΠΊ ΠΈ Π² ΠΊΠ°ΠΊΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ. Π£ ΠΎΠ΄Π½ΠΎΠΉ Ρ€ΠΎΠ»ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСсколько сцСнариСв, ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ β€” это дирСктория ΠΏΠΎ ΠΏΡƒΡ‚ΠΈ <role>/molecule/<scenario>, содСрТащая Π² сСбС описания Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… для тСста дСйствий. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ сцСнарий default, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ автоматичСски создан, Ссли Π²Ρ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ Ρ€ΠΎΠ»ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠœΠΎΠ»Π΅ΠΊΡƒΠ»Ρ‹. ИмСна ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… сцСнариСв Π²Ρ‹Π±ΠΈΡ€Π°ΡŽΡ‚ΡΡ Π½Π° вашС усмотрСниС.

ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ дСйствий тСстирования Π² сцСнарии называСтся matrix, ΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΎΠ½Π° Ρ‚Π°ΠΊΠΎΠ²Π°:

(Π¨Π°Π³ΠΈ, ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Π½Ρ‹Π΅ ?, ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΡ€ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ, Ссли Π½Π΅ описаны ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ)

  • lint β€” ΠΏΡ€ΠΎΠ³ΠΎΠ½ Π»ΠΈΠ½Ρ‚Π΅Ρ€ΠΎΠ². По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ yamllint ΠΈ flake8,
  • destroy β€” ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ инстансов с ΠΏΡ€ΠΎΡˆΠ»ΠΎΠ³ΠΎ запуска ΠœΠΎΠ»Π΅ΠΊΡƒΠ»Ρ‹ (Ссли ΠΎΡΡ‚Π°Π»ΠΈΡΡŒ),
  • dependency? β€” установка ansible-зависимости тСстируСмой Ρ€ΠΎΠ»ΠΈ,
  • 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    # ΠΏΡ€ΠΎΠ³ΠΎΠ½ ΠΏΠ»Π΅ΠΉΠ±ΡƒΠΊΠ°

ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ этих дСйствий ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Если Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΈΠ· списка ΡƒΠΆΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ, Ρ‚ΠΎ ΠΎΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½ΠΎ. Π’Π΅ΠΊΡƒΡ‰Π΅Π΅ состояниС, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ инстансов, ΠœΠΎΠ»Π΅ΠΊΡƒΠ»Π° Ρ…Ρ€Π°Π½ΠΈΡ‚ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ $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

Π­Ρ‚Π° сСкция описываСт источник зависимостСй.

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹: galaxy, gilt, shell.

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-модулям, Ρ‚ΠΎ ΠΈ список Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… настроСк Π½Π°Π΄ΠΎ ΠΈΡΠΊΠ°Ρ‚ΡŒ Ρ‚Π°ΠΌ. Для Π΄ΠΎΠΊΠ΅Ρ€Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ docker_container_module. КакиС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π°Ρ…, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

А Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² тСстах самой ΠœΠΎΠ»Π΅ΠΊΡƒΠ»Ρ‹.

Π—Π°ΠΌΠ΅Π½ΠΈΠΌ здСсь 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

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

  • 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